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