Postgis关于Point类型的一些查询操作

本文着重介绍Point类型的查询操作,以下操作均为二维,不讨论三维数据。

  • 创建点

      点的WKT表述如POINT(116.39088 39.90763),在Postgis中创建一个点几个方式:

ST_Point、ST_MakePoint:

--用法:ST_Point(float x_lon, float y_lat);
--输出:0101000000452A8C2D04195D402A6F47382DF44340
SELECT ST_Point(116.39088,39.90763)

      上面虽然创建了点,但是SRID却是0(unknown),可以通过ST_SRID查看。下面方式设置坐标系为4326:

--用法:ST_Point(float x_lon, float y_lat);
--输出:0101000020E6100000452A8C2D04195D402A6F47382DF44340
SELECT ST_SetSRID(ST_Point(116.39088,39.90763),4326)

      坐标顺序是经度(或x)在前,纬度(或y)在后。ST_MakePoint和ST_Point一样,ST_MakePoint可以快速高效的创建一个点。

ST_GeometryFromText、ST_PointFromText:

--用法1:geometry ST_GeometryFromText(text WKT);
--用法2:geometry ST_GeometryFromText(text WKT, integer srid);
--输出:0101000020E6100000452A8C2D04195D402A6F47382DF44340
SELECT ST_GeomFromText('POINT(116.39088 39.90763)',4326);

      ST_GeometryFromText和ST_GeomFromText一样,根据WKT描述的对象返回一个具体的geometry对象,WKT可以是POLYGON、MULTIPOLYGON、LINESTRING等。在这里它是一个点。如果要指明创建一个点,可以用ST_PointFromText:

--用法1:geometry ST_PointFromText(text WKT);
--用法2:geometry ST_PointFromText(text WKT, integer srid);
--输出:0101000020E6100000452A8C2D04195D402A6F47382DF44340
SELECT ST_PointFromText('POINT(116.39088 39.90763)',4326);

      未指定srid时,创建的geomtry默认的srid是0。

ST_GeomFromGML、ST_GMLToSQL:

--geometry ST_GeomFromGML(text geomgml);
--geometry ST_GeomFromGML(text geomgml, integer srid);
--输出:0101000020E6100000452A8C2D04195D402A6F47382DF44340
SELECT ST_GeomFromGML('
    <gml:Point srsName="EPSG:4326">
    	<gml:coordinates>116.39088,39.90763</gml:coordinates>
    </gml:Point>
');

      属性srsName会被读取。也可以在参数中指定srid:

SELECT ST_GeomFromGML('
    <gml:Point>
	<gml:coordinates>116.39088,39.90763</gml:coordinates>
    </gml:Point>
',4326);

     ST_GeomFromGML参数geomgml只能是GML的geometry部分,不是整个GML文档。目前支持 GML 2.1.2、 3.1.1、 3.2.1等版本。ST_GMLToSQL是ST_GeomFromGML的别名,用法一样:

--输出:0101000020E6100000452A8C2D04195D402A6F47382DF44340
SELECT ST_GMLToSQL('
    <gml:Point>
	<gml:coordinates>116.39088,39.90763</gml:coordinates>
    </gml:Point>
',4326);

ST_GeomFromGeoJSON:

--geometry ST_GeomFromGeoJSON(text geomjson);
--输出:0101000020E6100000452A8C2D04195D402A6F47382DF44340
SELECT ST_SetSRID(ST_GeomFromGeoJSON('{
    "type":"Point",
    "coordinates":[116.39088,39.90763]
}'),4326);

      与ST_GeomFromGML一致,参数geomjson只能是geometry描述。ST_GeomFromGeoJSON没有srid参数,而标准GeoJSON geometry对象中不含坐标系,所以需要ST_SetSRID用设置坐标系。 

ST_GeomFromKML:

--geometry ST_GeomFromKML(text geomkml);
--输出:0101000020E6100000452A8C2D04195D402A6F47382DF44340
SELECT ST_SetSRID(ST_GeomFromKML('
    <Point>
        <coordinates>116.39088,39.90763</coordinates>
    </Point>
'),4326);

      和ST_GeomFromGeoJSON一致,参数geomkml只能是geometry描述。ST_GeomFromGeoJSON没有srid参数,所以需要ST_SetSRID用设置坐标系。

      其他还有一些二进制、EWKT的读取类似,这里不做介绍。

  • 输出

ST_X、ST_Y、ST_Z等:

--float ST_X(geometry a_point);
--输出:116.39088
SELECT ST_X(ST_GeomFromText('POINT(116.39088 39.90763)',4326));
--输出:Null
SELECT ST_Z(ST_GeomFromText('POINT(116.39088 39.90763)',4326));

      a_point是一个POINT对象,ST_X输出X坐标。

GeometryType:

--text GeometryType(geometry geomA);
--输出:POINT
SELECT GeometryType(ST_GeomFromText('POINT(116.39088 39.90763)',4326));

ST_GeometryType:

--text ST_GeometryType(geometry g1);
--输出:ST_Point
SELECT ST_GeometryType(ST_GeomFromText('POINT(116.39088 39.90763)',4326));

ST_FlipCoordinates交换X和Y坐标:

--geometry ST_FlipCoordinates(geometry geom);
--输出:POINT(39.90763 116.39088)
SELECT ST_AsText(ST_FlipCoordinates(ST_GeomFromText('POINT(116.39088 39.90763)',4326)))
--输出:POINT ZM (39.90763 116.39088 3 6)
SELECT ST_AsText(ST_FlipCoordinates(ST_GeomFromText('POINT(116.39088 39.90763 3 6)',4326)))

      除了POINT外,还支持其他的LINESTRING等。

ST_Transform坐标转换:

--4326转4490。4326与4490都是地理坐标系,坐标系差异很小,所以转出的该点差别小
--输出:POINT(116.39088 39.90763)
-- SELECT ST_AsText(ST_Transform(ST_GeomFromText('POINT(116.39088 39.90763)',4326),4490))

--4326转3857。投影
--输出:POINT(12956573.494581 4852528.38789462)
SELECT ST_AsText(ST_Transform(ST_GeomFromText('POINT(116.39088 39.90763)',4326),3857))

其他

--输出:{"type":"Point","coordinates":[116.39088,39.90763]}
SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(116.39088 39.90763)',4326));

--输出:<Point><coordinates>116.39088,39.907629999999997</coordinates></Point>
SELECT ST_AsKML(ST_GeomFromText('POINT(116.39088 39.90763)',4326));

--输出:<gml:Point srsName="EPSG:4326"><gml:coordinates>116.39088,39.907629999999997</gml:coordinates></gml:Point>
SELECT ST_AsGML(ST_GeomFromText('POINT(116.39088 39.90763)',4326));

--输出:POINT(116.39088 39.90763)
SELECT ST_AsText(ST_GeomFromText('POINT(116.39088 39.90763)',4326));

--integer ST_CoordDim(geometry geomA);
--输出:2
SELECT ST_CoordDim(ST_GeomFromText('POINT(116.39088 39.90763)',4326));

以上就是一些关于POINT的WKT操作。

转载自:https://blog.csdn.net/aliasone/article/details/80644306

You may also like...