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%项目都用)

  1. ST_GeomFromText → 创建面
  2. ST_AsGeoJSON → 前端显示
  3. ST_Contains → 点是否在面内
  4. ST_Intersects → 是否相交
  5. ST_Area → 算面积
  6. ST_Centroid → 中心点
  7. ST_Buffer → 缓冲区
  8. ST_Union → 合并面
  9. ST_DumpPoints → 获取所有顶点
  10. GeometryType → 判断是不是面

扫码加入猫哥的AI群
最后修改:2026 年 04 月 20 日
点赞的人是最酷的