Skip to main content
[ PIER ]

PostGIS

PostgreSQL 的地理空间超能力 — 地图、路由、地理围栏。

Database #sql#relational#gis#spatial#postgresql

PostGIS 是 PostgreSQL 的金标准地理空间扩展。它添加了 geometry 和 geography 类型、1000+ 空间函数、R 树索引、投影支持和拓扑 — 将 Postgres 变成功能齐全的 GIS 服务器,被国家测绘机构、网约车平台和现场服务应用全球使用。

使用 Pier 部署

  1. 1 打开 Pier 控制台,点击 Add service。
  2. 2 从模板列表中选择 PostGIS。
  3. 3 选择版本、设置服务名称,Pier 会自动配置容器、存储和端口。
  4. 4 如需 HTTPS,请绑定域名。Traefik 会自动签发 Let's Encrypt 证书。

什么是 PostGIS?

PostGIS 是 PostgreSQL 的规范地理空间扩展。由 Refractions Research 于 2001 年 创建,它已成长为开源 GIS 栈的基础:OpenStreetMap 在 PostGIS 中存储其数据, Mapbox 将其用作后端,每个涉足 OSS 的国家测绘机构在生产中某处都有 PostGIS 服务器。

技术上它是你在 Postgres 数据库中安装的扩展,但实际上你几乎总是使用已编译 的 Postgres 发行版(官方 postgis/postgis Docker 镜像)。启用后,你的 Postgres 数据库获得空间类型、1000+ 空间函数、用于快速几何查询的 GIST 索引以及栅格、 拓扑和瓦片工作的工具。

Pier 如何部署它

Pier 使用官方 postgis/postgis Docker 镜像,将 /var/lib/postgresql 挂载为 数据卷。默认版本为 latest(PostGIS 3.5 on PostgreSQL 18);18-master17-master16-master15-master 可用于版本固定。

通过 Pier 的 UI 创建数据库时,你将获得要安装的 PostGIS 扩展清单(postgis、 postgis_topology、postgis_raster、fuzzystrmatch、postgis_tiger_geocoder)。 Pier 通过 CREATE EXTENSION … CASCADE 按依赖顺序安装它们。

所有 Postgres 工具都有效 — pg_dump、psql、ORM、pgAdmin、DBeaver。Pier 的 备份和复制功能以与原生 postgresql 模板相同的方式应用。

何时不要使用 PostGIS

如果不需要空间函数,使用常规 PostgreSQL — PostGIS 增加磁盘和内存开销。 如果你唯一的地理需求是”存储经纬度并在半径内查找项目”,Postgres 加上 (lat, lon) 的 btree 和 Haversine 函数可能就够了。一旦需要多边形、投影或 栅格,立即迁移到 PostGIS。

核心功能

空间类型

GEOMETRY(平面)和 GEOGRAPHY(球面)类型,支持点、线、多边形、多重多边形、集合。SRID 感知 — 在 5000+ 坐标参考系统中存储数据。

1000+ 空间函数

ST_Distance、ST_Within、ST_Intersects、ST_Buffer、ST_Union、ST_ConvexHull、ST_Centroid — 每个标准 OGC 空间函数加上 PostGIS 特有的额外功能。

R 树 GIST 索引

几何列上的 GIST 索引使空间查询(ST_DWithin、ST_Intersects)即使在数亿要素的表上也能达到亚毫秒级。

栅格支持

PostGIS Raster 处理卫星图像、高程数据、天气网格。在一个 SQL 语句中共同查询栅格和矢量。

拓扑

postgis_topology 建模拓扑关系(共享边、面)— 对地籍、交通网络和政治边界工作至关重要,其中一致性很重要。

100% PostgreSQL

它仍然是 PostgreSQL — 相同的驱动、相同的事务、相同的备份。在一个查询中结合空间查询与关系连接、JSONB、全文和存储过程。

应用场景

地图与制图

矢量瓦片服务器(pg_tileserv、Martin)实时从 PostGIS 提供数百万个地图瓦片。通过 ST_AsMVT() 的 Mapbox Vector Tiles。

地理围栏与警报

当车辆进入或退出多边形时通知 — 针对地理围栏多边形的 ST_Within。正确索引时亚毫秒级。

路由网络

pgRouting 在 PostGIS 道路网络上添加 Dijkstra、A*、K 条最短路径。OpenStreetMap 数据 + pgRouting = 你自己的路由引擎。

车队与资产跟踪

将 GPS 信号作为 POINT(经度, 纬度) 存储。用一个 SQL 语句查询"过去一小时内总部 5 公里内的所有资产"。

风险与保险建模

客户地址与洪水区、犯罪地图、断层线的空间连接。批量返回每个保单的风险评分。

代码示例

创建空间表 + GIST 索引 sql
CREATE EXTENSION IF NOT EXISTS postgis;

CREATE TABLE places (
  id     BIGSERIAL PRIMARY KEY,
  name   TEXT NOT NULL,
  geom   GEOGRAPHY(POINT, 4326) NOT NULL
);

CREATE INDEX places_geom_idx ON places USING GIST (geom);

INSERT INTO places (name, geom) VALUES
  ('北京', ST_GeogFromText('POINT(116.4074 39.9042)')),
  ('上海', ST_GeogFromText('POINT(121.4737 31.2304)'));
最近邻(KNN) sql
SELECT name,
       ST_Distance(geom, ST_MakePoint(116.4, 39.9)::geography) AS meters
FROM places
ORDER BY geom <-> ST_MakePoint(116.4, 39.9)::geography
LIMIT 10;
点在多边形内(地理围栏) sql
SELECT v.id, v.callsign
FROM vehicles v
JOIN geofences g ON ST_Within(v.last_position::geometry, g.area)
WHERE g.alert_zone = true;
构建 Mapbox 矢量瓦片 sql
SELECT ST_AsMVT(tile, 'places')
FROM (
  SELECT id, name,
         ST_AsMVTGeom(
           geom::geometry,
           ST_TileEnvelope(z, x, y),
           4096, 64, true
         ) AS geom
  FROM places
  WHERE geom && ST_TileEnvelope(z, x, y)
) AS tile;

对比

vs 原生 PostgreSQL PostgreSQL 不附带空间类型 — PostGIS 是事实上的扩展。如果你知道需要空间用专用 PostGIS 模板;常规 postgresql 模板可以通过 CREATE EXTENSION 后续安装 postgis。
vs Esri ArcGIS / Oracle Spatial PostGIS 是 OSS 等价物 — 具有竞争力的功能集,由美国人口普查局、法国 IGN、英国测绘局、柏林参议院和更多国家测绘机构使用。
vs MongoDB GeoJSON Mongo 的 2dsphere 涵盖基本地理查询;PostGIS 更深入(栅格、拓扑、投影、网络分析)。对于严肃的 GIS 工作选 PostGIS。
vs 专业瓦片服务器(Tegola、Mapnik) PostGIS 与瓦片服务器配对 — 它们从 PostGIS 读取。PostGIS 是你的地理真相源,而非瓦片渲染器本身。

常见问题

PostGIS 只是我安装在常规 PostgreSQL 中的扩展吗?
是 — 技术上。Pier 提供专用的 PostGIS 模板,因为 postgis/postgis Docker 镜像预编译了扩展。你可以通过 apt + CREATE EXTENSION 在 postgresql 模板上手动安装,但专用镜像更快更干净。
Pier 自动安装哪些扩展?
当你通过 Pier 的 UI 在 PostGIS 服务上创建新数据库时,Pier 提供一个清单 — `postgis`、`postgis_topology`、`postgis_raster`、`fuzzystrmatch`、`postgis_tiger_geocoder`。勾选你需要的;Pier 按顺序运行 CREATE EXTENSION ... CASCADE。
应该使用哪个 SRID?
大多数 GPS 数据使用 4326(WGS 84)。Web 地图瓦片使用 3857(Web Mercator)。ST_Transform 在它们之间转换。
GEOGRAPHY 与 GEOMETRY?
GEOGRAPHY 将地球视为球体 — 距离以米为单位,无投影。GEOMETRY 是平面的 — 距离以 SRID 单位为单位。对于"两个 GPS 点之间的距离"使用 GEOGRAPHY;对于在投影 CRS 中的制图工作使用 GEOMETRY。
PostGIS 模板使用哪个 PostgreSQL 版本?
默认 `latest`(当前 PostGIS 3.5 on PostgreSQL 18)。18-master、17-master、16-master、15-master 变体固定 Postgres 主版本。
备份与 Postgres 相同方式工作?
是 — pg_dump 捕获空间数据。备份格式为 .dump(pg_custom)。恢复保留几何类型和索引。
可以使用 pgRouting 吗?
pgRouting 是单独的扩展。在容器内手动安装 — 某些标签的 postgis/postgis 镜像包含 pgRouting。在 Docker Hub 上检查标签说明。

相关服务

在你的 VPS 上部署

PostGIS 是 PostgreSQL 的金标准地理空间扩展。它添加了 geometry 和 geography 类型、1000+ 空间函数、R 树索引、投影支持和拓扑 — 将 Postgres 变成功能齐全的 GIS 服务器,被国家测绘机构、网约车平台和现场服务应用全球使用。

部署此服务 →