很多人以为 PostGIS 只是“存经纬度”的工具,其实这是一个非常大的误解。
本文从工程实践角度,讲清楚:
👉 为什么普通数据库方案会踩坑
👉 PostGIS 到底解决了什么问题
👉 企业为什么几乎都会选 PostGIS


一、先说结论

普通数据库只能“存坐标”,PostGIS 才能“理解空间”。

如果你的系统里出现过下面任何一个需求:

  • 附近 500 米 / 1 公里查询
  • 点是否在某个区域内
  • 是否与禁区、行政区相交
  • 轨迹、路线、缓冲区分析
  • 数据量达到百万级以上

👉 不用 PostGIS,迟早会重构。


二、不用 PostGIS 时,我们通常是怎么做的?

最常见的做法是:把经纬度当普通字段存

CREATE TABLE poi (
  id BIGINT PRIMARY KEY,
  lng DOUBLE,
  lat DOUBLE
);

然后做“附近查询”时,写类似这样的 SQL:

SELECT *
FROM poi
WHERE
  SQRT(
    POWER(lng - 116.40, 2) +
    POWER(lat - 39.90, 2)
  ) < 0.01;

这种做法的问题非常多

❌ 1. 计算不准确

  • 经纬度不是平面坐标
  • 地球是球体,纬度越高误差越大

❌ 2. 没有距离单位概念

0.01 是多少?
是米?公里?还是拍脑袋?

❌ 3. 完全用不了索引

  • 每次查询都是 全表扫描
  • 数据一多,性能直接崩

❌ 4. 做不了复杂空间关系

  • 点在面内?
  • 是否相交?
  • 距离某条路线多远?

👉 这些根本不是“数学问题”,而是“空间计算问题”


三、PostGIS 到底多了什么?

PostGIS 不是一个库,而是 PostgreSQL 的空间能力扩展,它本质上给数据库增加了三样“硬核能力”。


1️⃣ 真正的空间数据类型(不是 lng + lat)

geom geometry(Point, 4326)

这意味着:

  • 它知道这是 点 / 线 / 面
  • 它知道使用的是 哪种坐标系
  • 它知道空间拓扑关系

对数据库来说:

这不是两个数字,而是一个“地理对象”


2️⃣ 空间索引(性能的质变)

CREATE INDEX idx_geom ON poi USING GIST (geom);

这是企业用 PostGIS 的最核心原因之一

普通索引 空间索引
B-Tree GiST
一维比较 多维空间
比大小 比“区域关系”

👉 千万级数据做附近查询,普通表会直接拖死数据库,PostGIS 可以稳定运行


3️⃣ 数百个成熟的空间函数

你不用自己造轮子,直接用:

业务需求 PostGIS 函数
附近 N 米 ST_DWithin
距离计算 ST_Distance
点在面内 ST_Within
是否相交 ST_Intersects
缓冲区 ST_Buffer
轨迹长度 ST_Length

四、同一个需求的“硬对比”

场景:查询“附近 1 公里的商家”


❌ 普通数据库方案

SELECT *
FROM shop
WHERE
  SQRT(
    POWER(lng - :lng, 2) +
    POWER(lat - :lat, 2)
  ) < 0.01;

问题:

  • ❌ 不准
  • ❌ 没索引
  • ❌ 性能差
  • ❌ 后期难维护

PostGIS 方案

SELECT *
FROM shop
WHERE ST_DWithin(
  geom::geography,
  ST_GeomFromText('POINT(116.40 39.90)', 4326)::geography,
  1000
);

优势:

  • ✅ 单位就是
  • ✅ 自动走空间索引
  • ✅ 地球曲率正确
  • ✅ 数据量大也稳

👉 这已经不是“写法不同”,而是“计算模型完全不同”


五、为什么企业级项目几乎都会选 PostGIS?

📌 1. 业务一定会变复杂

今天你只查“附近”
明天就会出现:

  • 在某行政区内
  • 不在禁行区
  • 距路线 300 米内
  • 多区域叠加判断

👉 普通表结构根本撑不住这种演进


📌 2. 性能是刚需,不是优化项

数据量 普通方案 PostGIS
10 万 勉强可用
100 万 开始慢
1000 万 几乎不可用 依然可用

📌 3. 数据正确性非常重要

在这些系统里:

  • 风控
  • 调度
  • 选址
  • 合规判断

👉 距离/边界算错 = 业务事故

PostGIS 使用的是严谨的地理与数学模型,不是“经验公式”。


六、什么时候可以暂时不用 PostGIS?

如果你满足以下所有条件:

  • 数据量 < 1 万
  • 只是简单展示
  • 没有空间判断逻辑
  • 不做扩展

👉 那你可以先不用

但只要出现以下任何一个需求:

  • 点在不在区域
  • 距离是否小于 X
  • 是否与某区域相交

👉 不用 PostGIS,就是在给未来挖坑


七、总结

普通数据库:我帮你存坐标
PostGIS:我帮你理解真实世界

如果你的系统和“空间”有关,
PostGIS 不是加分项,是基础设施。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐