几何类型
PostgreSQL 内置几何类型用于保存二维平面上的点、线段、矩形、路径、多边形和圆。它们适合简单的平面几何计算和教学示例;地理坐标、距离单位和复杂空间索引通常应使用 PostGIS。
类型概览
| 类型 | 含义 | 常见输入 |
|---|---|---|
point | 平面上的点 | (10,20) |
line | 无限延伸的直线 | {1,2,3} |
lseg | 有限线段 | [(0,0),(3,4)] |
box | 矩形 | ((10,10),(0,0)) |
path | 开放或闭合路径 | [(0,0),(1,1),(2,0)] |
polygon | 闭合多边形 | ((0,0),(3,0),(3,2)) |
circle | 圆 | <(0,0),5> |
建表和输入
CREATE TABLE locations (
location_id bigint PRIMARY KEY,
position point NOT NULL,
service_area circle
);
INSERT INTO locations (location_id, position, service_area)
VALUES (1, '(120.1, 30.2)', '<(120.1,30.2), 5>');
几何类型有专用构造函数、文本输入格式和运算符。实际 SQL 中应优先使用参数化查询,避免手工拼接括号和尖括号。
运算和访问字段
point 支持坐标访问、距离和位移等操作:
SELECT position[0] AS x, position[1] AS y
FROM locations;
SELECT point '(0,0)' <-> point '(3,4)' AS distance;
不同几何类型支持的运算符并不完全相同;<-> 的距离是平面距离,不是经纬度之间的地球表面距离。查询前确认运算符的参数类型和单位。
索引与边界框
几何类型可使用 GiST 索引支持相交、包含和距离相关查询:
CREATE INDEX locations_position_gist_idx
ON locations USING gist (position);
空间运算通常先使用外接矩形做快速筛选,再进行精确判断。索引是否生效取决于运算符、数据分布和查询写法,应通过 EXPLAIN 验证。
内置几何与 PostGIS
内置几何使用笛卡尔平面,没有 SRID、坐标参考系或地球曲率概念。经纬度不能直接当作平面坐标计算公里距离,尤其在高纬度和大范围区域误差明显。
需要以下能力时,优先评估 PostGIS:
- 地理坐标(
geography)和投影坐标(geometry); - 空间参考系、缓冲区、拓扑和复杂空间关系;
- 空间数据格式(GeoJSON、WKT、WKB)和丰富的 GiST/SP-GiST 运算符。
常见误区
- 把
point的经纬度直接当成米或公里计算。 - 认为几何列的排序代表空间上的远近。
- 没有检查输入多边形自交、方向和闭合规则。
- 直接把几何文本拼接进 SQL,忽略参数化和格式验证。
- 用内置几何替代已有 GIS 系统,却没有评估坐标系和空间分析需求。