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) -- XYZ
SRID=32632;POINT(0 0) -- XY with SRID
POINTM(0 0 0) -- XYM
POINT(0 0 0 0) -- XYZM
SRID=4326;MULTIPOINTM(0 0 0,1 2 1) -- XYM with SRID
MULTILINESTRING((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 geometry
SELECT ST_AsGeoJSON('LINESTRING(1 2 3, 4 5 6)');
select ST_Centroid(geom)::jsonb as geometry from geometries
ST_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 $$
DECLARE
collections geometry[]; --- 用于存放航道按距离分割后的结果
lengths integer; ---- 保存航道的长度
counts integer := 10; ---- 保存航道的数量
i integer := 1; --- 控制最外层循环
j integer; --- 内层循环,用于记录每条航道分割后的结果
geom_Measure geometry; --- 航道插值后的数据
start_value integer; --- 航道分段时,开始位置
end_value integer; --- 航道分段时,结束位置
BEGIN
select count(*) into counts from polylines; --- 得到航道的数量
LOOP
select 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;
LOOP
end_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;