PostGIS
select column_name,data_type from information_schema.columns where table_name ='geometries' /* 查询表 geometries 的所有字段名及字段类型*//* 类型转换 */SELECT 0.9::text;SELECT 'POINT(0 0)'::geometry;SELECT 'SRID=4326;POINT(0 0)'::geometry;
WKT的7个基本类型
点:POINT(0 0)线:LINESTRING(0 0,1 1,1 2)面:POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))多点:MULTIPOINT((0 0),(1 2))多线:MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))多面:MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))几何集合:GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))
EWKT的类型
POINT(0 0 0) -- XYZSRID=32632;POINT(0 0) -- XY with SRIDPOINTM(0 0 0) -- XYMPOINT(0 0 0 0) -- XYZMSRID=4326;MULTIPOINTM(0 0 0,1 2 1) -- XYM with SRIDMULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))POLYGON((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))GEOMETRYCOLLECTIONM( POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5) )MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4) )POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )TRIANGLE ((0 0, 0 9, 9 0, 0 0))TIN( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )
Function
ST_GeomFromText(geometry) -- 根据字符串表示构造几何。eg:ST_GeomFromText('POINT(-122.34900 47.65100)', 4326)ST_GeomFromText('MultiLineString((113.39607238769531 34.19425964355469,113.85887145996094 34.12559509277344))', 4326)ST_GeomFromText('LineString( 1 2, 5 7 )', 4326 )ST_AsGeoJSON(geometry) --- 把空间对象输出为JSON字符串 ::jsonb as geometrySELECT ST_AsGeoJSON('LINESTRING(1 2 3, 4 5 6)');select ST_Centroid(geom)::jsonb as geometry from geometriesST_Centroid(geometry) ----- 获取几何对象的中心点ST_GeometryType(geometry) /* 返回几何图形的类型 */ST_NDims(geometry) /* 返回几何图形的维数 */ST_SRID(geometry) /* 返回几何图形的空间参考标识码 */ST_AsText(geometry)ST_X(geometry) —— 返回X坐标ST_Y(geometry) —— 返回Y坐标ST_Length(geometry) —— 返回线串的长度ST_StartPoint(geometry) —— 将线串的第一个坐标作为点返回ST_EndPoint(geometry) —— 将线串的最后一个坐标作为点返回ST_NPoints(geometry) —— 返回线串的坐标数量ST_Area(geometry) —— 返回多边形的面积ST_NRings(geometry) —— 返回多边形中环的数量(通常为1个,其他是孔)ST_ExteriorRing(geometry) —— 以线串的形式返回多边形最外面的环ST_InteriorRingN(geometry,n) —— 以线串形式返回指定的内部环ST_Perimeter(geometry) —— 返回所有环的长度MultiPoint —— 点集合MultiLineString —— 线串集合MultiPolygon —— 多边形集合GeometryCollection —— 由任意几何图形(包括其他GeometryCollection)组成的异构集合ST_NumGeometries(geometry) —— 返回集合中的组成部分的数量ST_GeometryN(geometry, n) —— 返回集合中指定的组成部分ST_Area(geometry) —— 返回集合中所有多边形组成部分的总面积ST_Length(geometry) —— 返回所有线段组成部分的总长度ST_SRID(geom) ---- 查询 SRID
几何图形输入和输出
- Well-known text(WKT)
ST_GeomFromText(text, srid) —— 返回geometry
ST_AsText(geometry) —— 返回text
ST_AsEWKT(geometry) —— 返回text
- Well-known binary(WKB)
- ST_GeomFromWKB(bytea) —— 返回geometry
ST_AsBinary(geometry) —— 返回bytea ——-将二进制输出转换为ASCII格式以进行打印时,需要调用encode()
SELECT encode(ST_AsBinary(ST_GeometryFromText('LINESTRING(0 0,1 0)')),'hex');
- ST_AsEWKB(geometry) —— 返回bytea
- Geographic Mark-up Language(GML)
ST_GeomFromGML(text) —— 返回geometry
ST_ASGML(geometry) —— 返回text
- Keyhole Mark-up Language(KML)
ST_GeomFromKML(text) —— 返回geometry
ST_ASKML(geometry) —— 返回text
- ST_AsGeoJSON(geometry) —— 返回text
- Scalable Vector Graphics(SVG)
- ST_AsSVG(geometry) —— 返回text
以上函数最常见的用法是将几何图形的文本(text)表示形式转换为内部表示形式:
航道线分割
CREATE OR REPLACE FUNCTION lineSplitByDistance(meter integer)RETURNS TABLE(id integer, geoms geometry) AS $$DECLAREcollections geometry[]; --- 用于存放航道按距离分割后的结果lengths integer; ---- 保存航道的长度counts integer := 10; ---- 保存航道的数量i integer := 1; --- 控制最外层循环j integer; --- 内层循环,用于记录每条航道分割后的结果geom_Measure geometry; --- 航道插值后的数据start_value integer; --- 航道分段时,开始位置end_value integer; --- 航道分段时,结束位置BEGINselect count(*) into counts from polylines; --- 得到航道的数量LOOPselect ST_Length(geom,true) into lengths from polylines where gid = i; --- 得到每条航道的长度select ST_AddMeasure(geom,0,lengths) into geom_Measure from polylines where gid = i; --- 返回带有在起点和终点之间线性插值的量度元素的派生几何j := 0;start_value := 0;LOOPend_value = start_value + $1;if end_value >= lengths then --- 如果长度超过航道长度,则退出collections[j] := ST_LocateBetween(geom_Measure,start_value,lengths);exit;end if;collections[j]:= ST_LocateBetween(geom_Measure,start_value,end_value);start_value := end_value;j := j+1;END LOOP;geoms = ST_SetSRID(ST_Collect(collections),4326);id := i;return next;i := i+1;EXIT WHEN i > counts; ------ 退出条件END LOOP;END$$ LANGUAGE plpgsql;
