为什么企业级项目一定要用 PostGIS?和普通存经纬度到底有什么区别?
PostGIS作为PostgreSQL的空间扩展,远非仅存储经纬度,而是提供了完整的空间计算能力。相比普通数据库将经纬度作为普通字段存储,PostGIS具备三大核心优势:1)真正的空间数据类型,能理解点线面等地理对象;2)高效的空间索引,支持千万级数据的快速查询;3)数百个成熟的空间函数,解决距离计算、区域判断等复杂需求。在企业级应用中,PostGIS能确保空间计算的准确性、高性能和可扩展性,避免
文章目录
很多人以为 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 不是加分项,是基础设施。
更多推荐
所有评论(0)