AI摘要
本文提供了一份全面的PostGIS面(Polygon)处理函数指南,包括创建面、查询/查看面、面的核心计算函数、空间判断函数、面编辑/处理函数等六个部分,每个部分都包含具体的SQL示例和用法说明。文章最后还提供了一个实战万能示例和10个必须记住的面函数,方便读者直接复制使用。
PostGIS 面(Polygon)处理函数 超全实战指南
我给你整理最常用、做地图必用的面函数,全部带用法+示例SQL,你直接复制就能用!
面 = Polygon,就是地图上的区域、围栏、行政区划、商圈、多边形范围。
一、创建面的函数(最基础)
1. 文本转面(WKT → Polygon)
ST_GeomFromText('POLYGON((x1 y1, x2 y2, x3 y3, x1 y1))', 4326)必须闭合:最后一个点 = 第一个点
2. 点集合 → 生成面
ST_MakePolygon(ST_GeomFromText('LINESTRING(116 39, 117 39, 117 40, 116 40, 116 39)',4326))3. 快速创建矩形范围
ST_MakeEnvelope(最小经度, 最小纬度, 最大经度, 最大纬度, 4326)二、查询/查看面(必用)
1. 查看面的坐标文本
SELECT ST_AsText(geom) FROM 表;2. 转 GeoJSON(前端地图直接用)
SELECT ST_AsGeoJSON(geom) FROM 表;3. 判断是不是面
GeometryType(geom) = 'POLYGON'三、面的核心计算函数(超级常用)
1. 计算面积(平方米 / 平方公里)
-- 平方米
ST_Area(geom::geography)
-- 平方公里(除以100万)
ST_Area(geom::geography)/1000000 2. 获取面的中心点(地图居中)
ST_Centroid(geom) 3. 获取面的外接矩形
ST_Envelope(geom)4. 获取面的周长
ST_Perimeter(geom::geography)四、空间判断函数(面最常用)
1. 点是否在面内(判断定位、围栏、电子围栏)
ST_Contains(面geom, 点geom)示例:
SELECT ST_Contains(
geom,
ST_SetSRID(ST_Point(116.4,39.9),4326)
) FROM 区域表;2. 两个面是否相交
ST_Intersects(面A, 面B)3. 面A 是否完全包含 面B
ST_Contains(面A, 面B)4. 点距离面是否在指定范围内
ST_DWithin(点, 面, 距离米)五、面编辑/处理函数(地图高级功能)
1. 面生成缓冲区(向外扩圈)
ST_Buffer(geom::geography, 500)::geometry -- 向外扩500米2. 合并多个面
ST_Union(geom1, geom2)3. 面交集(两个面重叠部分)
ST_Intersection(面A, 面B)4. 面差集(A减去B的部分)
ST_Difference(面A, 面B)5. 简化面(减少坐标点,前端更流畅)
ST_Simplify(geom, 0.0001)6. 获取面的所有顶点
ST_DumpPoints(geom)7. 判断面是否为空
ST_IsEmpty(geom)8. 判断面是否有效(是否自相交)
ST_IsValid(geom)六、实战万能示例(直接复制运行)
1. 创建一个面并插入数据库
INSERT INTO gis_test(name,geom)
VALUES (
'北京区域面',
ST_GeomFromText('POLYGON((
116.0 39.5,
116.8 39.5,
116.8 40.2,
116.0 40.2,
116.0 39.5
))',4326)
);2. 查询面积(平方公里)
SELECT
name,
ROUND(ST_Area(geom::geography)/1000000,2) AS 面积_平方公里
FROM gis_test
WHERE GeometryType(geom)='POLYGON';3. 查询中心点
SELECT ST_AsText(ST_Centroid(geom)) FROM gis_test;4. 判断点是否在面内
SELECT
ST_Contains(geom, ST_SetSRID(ST_Point(116.4,39.9),4326))
FROM gis_test;5. 转 GeoJSON 给前端地图
SELECT ST_AsGeoJSON(geom) FROM gis_test;七、你必须记住的 10 个面函数(90%项目都用)
ST_GeomFromText→ 创建面ST_AsGeoJSON→ 前端显示ST_Contains→ 点是否在面内ST_Intersects→ 是否相交ST_Area→ 算面积ST_Centroid→ 中心点ST_Buffer→ 缓冲区ST_Union→ 合并面ST_DumpPoints→ 获取所有顶点GeometryType→ 判断是不是面