PostGIS

PostGis 教程

  1. select column_name,data_type from information_schema.columns where table_name ='geometries' /* 查询表 geometries 的所有字段名及字段类型*/
  2. /* 类型转换 */
  3. SELECT 0.9::text;
  4. SELECT 'POINT(0 0)'::geometry;
  5. SELECT 'SRID=4326;POINT(0 0)'::geometry;

WKT的7个基本类型

  1. 点:
  2. POINT(0 0)
  3. 线:
  4. LINESTRING(0 0,1 1,1 2)
  5. 面:
  6. POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
  7. 多点:
  8. MULTIPOINT((0 0),(1 2))
  9. 多线:
  10. MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
  11. 多面:
  12. 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)))
  13. 几何集合:
  14. GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))

EWKT的类型

  1. POINT(0 0 0) -- XYZ
  2. SRID=32632;POINT(0 0) -- XY with SRID
  3. POINTM(0 0 0) -- XYM
  4. POINT(0 0 0 0) -- XYZM
  5. SRID=4326;MULTIPOINTM(0 0 0,1 2 1) -- XYM with SRID
  6. MULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))
  7. 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))
  8. 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)))
  9. GEOMETRYCOLLECTIONM( POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5) )
  10. MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4) )
  11. 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)) )
  12. TRIANGLE ((0 0, 0 9, 9 0, 0 0))
  13. 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

  1. ST_GeomFromText(geometry) -- 根据字符串表示构造几何。
  2. eg:
  3. ST_GeomFromText('POINT(-122.34900 47.65100)', 4326)
  4. ST_GeomFromText('MultiLineString((113.39607238769531 34.19425964355469,113.85887145996094 34.12559509277344))', 4326)
  5. ST_GeomFromText('LineString( 1 2, 5 7 )', 4326 )
  6. ST_AsGeoJSON(geometry) --- 把空间对象输出为JSON字符串 ::jsonb as geometry
  7. SELECT ST_AsGeoJSON('LINESTRING(1 2 3, 4 5 6)');
  8. select ST_Centroid(geom)::jsonb as geometry from geometries
  9. ST_Centroid(geometry) ----- 获取几何对象的中心点
  10. ST_GeometryType(geometry) /* 返回几何图形的类型 */
  11. ST_NDims(geometry) /* 返回几何图形的维数 */
  12. ST_SRID(geometry) /* 返回几何图形的空间参考标识码 */
  13. ST_AsText(geometry)
  14. ST_X(geometry) —— 返回X坐标
  15. ST_Y(geometry) —— 返回Y坐标
  16. ST_Length(geometry) —— 返回线串的长度
  17. ST_StartPoint(geometry) —— 将线串的第一个坐标作为点返回
  18. ST_EndPoint(geometry —— 将线串的最后一个坐标作为点返回
  19. ST_NPoints(geometry) —— 返回线串的坐标数量
  20. ST_Area(geometry) —— 返回多边形的面积
  21. ST_NRings(geometry) —— 返回多边形中环的数量(通常为1个,其他是孔)
  22. ST_ExteriorRing(geometry) —— 以线串的形式返回多边形最外面的环
  23. ST_InteriorRingN(geometry,n) —— 以线串形式返回指定的内部环
  24. ST_Perimeter(geometry) —— 返回所有环的长度
  25. MultiPoint —— 点集合
  26. MultiLineString —— 线串集合
  27. MultiPolygon —— 多边形集合
  28. GeometryCollection —— 由任意几何图形(包括其他GeometryCollection)组成的异构集合
  29. ST_NumGeometries(geometry) —— 返回集合中的组成部分的数量
  30. ST_GeometryN(geometry, n) —— 返回集合中指定的组成部分
  31. ST_Area(geometry) —— 返回集合中所有多边形组成部分的总面积
  32. ST_Length(geometry) —— 返回所有线段组成部分的总长度
  33. ST_SRID(geom) ---- 查询 SRID

几何图形输入和输出

  1. Well-known text(WKT
  • ST_GeomFromText(text, srid) —— 返回geometry

  • ST_AsText(geometry) —— 返回text

  • ST_AsEWKT(geometry) —— 返回text

  1. Well-known binary(WKB
  • ST_GeomFromWKB(bytea) —— 返回geometry

ST_AsBinary(geometry) —— 返回bytea ——-将二进制输出转换为ASCII格式以进行打印时,需要调用encode()

  1. SELECT encode(ST_AsBinary(ST_GeometryFromText('LINESTRING(0 0,1 0)')),'hex');
  • ST_AsEWKB(geometry) —— 返回bytea
  1. Geographic Mark-up Language(GML
  • ST_GeomFromGML(text) —— 返回geometry

  • ST_ASGML(geometry) —— 返回text

  1. Keyhole Mark-up Language(KML
  • ST_GeomFromKML(text) —— 返回geometry

  • ST_ASKML(geometry) —— 返回text

  1. GeoJson
  • ST_AsGeoJSON(geometry) —— 返回text
  1. Scalable Vector Graphics(SVG
  • ST_AsSVG(geometry) —— 返回text
    以上函数最常见的用法是将几何图形文本(text)表示形式转换为内部表示形式:

航道线分割

  1. CREATE OR REPLACE FUNCTION lineSplitByDistance(meter integer)
  2. RETURNS TABLE(id integer, geoms geometry) AS $$
  3. DECLARE
  4. collections geometry[]; --- 用于存放航道按距离分割后的结果
  5. lengths integer; ---- 保存航道的长度
  6. counts integer := 10; ---- 保存航道的数量
  7. i integer := 1; --- 控制最外层循环
  8. j integer; --- 内层循环,用于记录每条航道分割后的结果
  9. geom_Measure geometry; --- 航道插值后的数据
  10. start_value integer; --- 航道分段时,开始位置
  11. end_value integer; --- 航道分段时,结束位置
  12. BEGIN
  13. select count(*) into counts from polylines; --- 得到航道的数量
  14. LOOP
  15. select ST_Length(geom,true) into lengths from polylines where gid = i; --- 得到每条航道的长度
  16. select ST_AddMeasure(geom,0,lengths) into geom_Measure from polylines where gid = i; --- 返回带有在起点和终点之间线性插值的量度元素的派生几何
  17. j := 0;
  18. start_value := 0;
  19. LOOP
  20. end_value = start_value + $1;
  21. if end_value >= lengths then --- 如果长度超过航道长度,则退出
  22. collections[j] := ST_LocateBetween(geom_Measure,start_value,lengths);
  23. exit;
  24. end if;
  25. collections[j]:= ST_LocateBetween(geom_Measure,start_value,end_value);
  26. start_value := end_value;
  27. j := j+1;
  28. END LOOP;
  29. geoms = ST_SetSRID(ST_Collect(collections),4326);
  30. id := i;
  31. return next;
  32. i := i+1;
  33. EXIT WHEN i > counts; ------ 退出条件
  34. END LOOP;
  35. END
  36. $$ LANGUAGE plpgsql;