访问量: 112 次浏览

PostGIS的空间分析功能:PostGIS是一个强大的开源空间数据库扩展,用于PostgreSQL系统,能够实现空间数据的存储、处理与分析。
在本文中, PostGIS函数按使用类型进行排序或分组,我们将通过具体示例演示如何为每种情况构建基础的空间SQL查询。
空间数据库是开发大多数基于空间信息的项目时不可或缺的工具。 在所有空间数据库中,地理技术及地理信息系统领域应用最广泛的当属PostgreSQL - PostGIS组合。 PostGIS实现了数量庞大的地理对象处理函数,使我们能够对存储的数据进行复杂查询、关联与分析。
1.ST_Area:返回面或多面体的面积。需传入包含几何图形的列作为参数。对于非多边形几何图形将返回0值。计量单位与几何图形坐标参考系统中包含的单位一致。
SELECT ST_Area(geom) AS area
FROM datos.poligonos;
2.ST_Perimeter:返回面或多面体图形的边界周长。需传入包含几何图形的列作为参数。对非面状几何图形将返回0值。计量单位与几何图形坐标参考系统中包含的单位一致。
SELECT ST_Perimeter(geom) AS perímetro
FROM datos.poligonos;
3.ST_Length:返回线或多线型几何图形的二维长度。需传入包含几何图形的列作为参数。对非线状几何图形将返回0值。计量单位与几何图形坐标参考系统中包含的单位一致。
SELECT ST_Length(geom) AS longitud
FROM datos.lineas;
4.ST_MakePoint:支持创建二维点对象(x,y坐标值)、三维点对象(x,y,z坐标值)及四维点对象(x,y,z,m坐标值)。
SELECT ST_MakePoint(10 15);
SELECT ST_MakePoint(-3.7018, 40.3185);
5.ST_MakeLine:支持基于点要素创建线型几何图形,提供多种构建方法: 最简方式:
SELECT ST_MakeLine(geom) AS linea
FROM datos.puntos;
通过数值字段有序标识线段连接顺序:
SELECT ST_MakeLine(id_puntos.geom) AS linea
FROM (
SELECT puntos.id, geom
FROM datos.puntos
ORDER BY puntos.id
) AS id_puntos ;
或通过点坐标数组直接生成:
SELECT ST_MakeLine(
ARRAY[
ST_MakePoint(5,2),
ST_MakePoint(4,5),
ST_MakePoint(8,10)
]
);
6.ST_MakePolygon:支持基于线型几何图形构建面状几何图形。要求线性几何必须封闭,即其起始节点与终止节点需完全重合。
SELECT ST_MakePolygon(
ST_GeomFromText(
'LINESTRING(10 10, 15 10, 20 15, 10 15, 10 10)'
)
);
7.ST_GeomFromText:通过WKT(已知文本)格式的几何定义表达式,返回对应的几何对象。
SELECT ST_GeomFromText('POINT(20 20)')
SELECT ST_GeomFromText('LINESTRING(-5 10, 10 10, 10 15, 20 40, -10 20)')
SELECT ST_GeomFromText('POLYGON((10 10, 15 10, 10 15, 5 5, 10 10))')
8.AddGeometryColumn与DropGeometryColumn:用于创建或删除数据表中存储地理对象的几何列。操作时需要指定表结构、字段名称、SRID坐标系、几何类型及维度参数。
SELECT AddGeometryColumn('datos', 'nuevospuntos', 'geom', 25830, 'POINT', 2)
SELECT DropGeometryColumn('datos', 'nuevospuntos', 'geom')
9.ST_Buffer:返回表示与给定几何对象距离在指定半径内的所有点构成的几何图形。计算将基于几何对象的SRID坐标系。
SELECT ST_Buffer(geom, 750)
FROM datos.lineas;
10.ST_SymDifference:返回表示表A与表B中几何对象不相交部分的几何图形。该函数具有对称性,即无论哪个表作为第一个参数,结果都相同:ST_SymDifference(A,B) = ST_SymDifference(B,A)。
SELECT ST_SymDifference(
parques.geom,
ST_Buffer(papeleras.geom, 500))
FROM
datos.poligonos as parques,
datos.puntos as papeleras;
11.ST_Intersection:返回表示两个输入几何图形共同点集的几何图形。该函数同样具有对称性:ST_Intersection(A,B) = ST_Intersection(B,A)。
SELECT ST_Intersection(
parques.geom,
ST_Buffer(papeleras.geom, 500))
FROM
datos.poligonos as parques,
datos.puntos as papeleras;
12.ST_Union:返回表示两个空间数据表几何图形合并结果的几何图形。
SELECT ST_Union(lineas.geom, poligonos.geom)
FROM datos.lineas, datos.poligonos;
13.ST_Centroid:返回根据输入几何图形计算得到的质心坐标。
SELECT ST_Centroid(poligonos.geom)
FROM datos.poligonos;
14.ST_Envelope:返回表示表中几何图形最小外接矩形的几何图形。
SELECT ST_Envelope(lineas.geom)
FROM datos.lineas;
15.ST_Contains:当几何体B完全包含于几何体A且不超出其边界时返回布尔值True,否则返回False。
SELECT ST_Contains(poligonos.geom, lineas.geom)
FROM datos.lineas, datos.poligonos;
16.ST_Intersects:若几何体A与B存在任何共同点则返回True,即两者在空间某处存在重叠。
SELECT ST_Intersects(poligonos.geom, lineas.geom)
FROM datos.lineas, datos.poligonos;
17.ST_Overlaps:当几何体B与A维度相同且部分重叠(但互不包含)时返回True。
SELECT ST_Overlaps(poligonos_a.geom, poligonos_b.geom)
FROM datos.poligonos_a, datos.poligonos_b;
18.ST_Touches:若几何体A与B的边界存在接触点则返回True。对于点要素,则判断其坐标是否与面要素边界重合。
SELECT ST_Touches(poligonos.geom, lineas.geom)
FROM datos.lineas, datos.poligonos;
19.ST_Covers:当几何体A能够完全覆盖几何体B(B无任何点位于A外部)时返回True。
SELECT ST_Covers(poligonos.geom, lineas.geom)
FROM datos.lineas, datos.poligonos;
此处需特别说明表间空间关系分析的核心功能:空间连接。
20.ST_Translate:支持对几何体进行二维或三维平移,需输入几何体及各坐标轴位移值作为参数。
SELECT ST_Translate(geom, -0.05, 0.25)
FROM datos.poligonos;
21.ST_Transform:实现几何体坐标系统转换。示例演示将面要素从原始SRID(EPSG:25830)转至EPSG:4326。
SELECT ST_Transform(geom, 4326)
FROM datos.poligonos;
22.ST_SRID:查看几何体的SRID编码值。返回列显示对应EPSG代码(示例返回ETRS89 UTM 30N对应的25830)。
SELECT ST_SRID(geom)
FROM datos.poligonos;
23.ST_SetSRID:为几何体设置坐标参考系统。示例为已定义坐标的点要素分配EPSG:4326(WGS84)。
SELECT ST_SetSRID(ST_Point(-3.7018, 40.3185), 4326);
24.GeometryType:返回几何对象的类型标识。输出值包括ST_Point、ST_Linestring、ST_Polygon、ST_Multipoint等PostGIS标准类型。
SELECT ST_GeometryType(geom) as tipo
FROM datos.poligonos;
25.ST_IsValid:验证几何体是否有效,为每个几何体返回布尔值。
SELECT ST_IsValid(geom) as validez
FROM datos.poligonos;
若需统计表中有效/无效几何体数量,可采用类似查询语句:
SELECT ST_IsValid(geom) as validez,
(select count(ST_IsValid(geom)) as numero)
FROM datos.poligonos
GROUP BY validez