跳到主要内容

几何类型

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 系统,却没有评估坐标系和空间分析需求。