0Pricing
SQL Academy · 课时

使用 PostGIS 进行地理空间索引

添加 PostGIS 扩展,存储 geometry/geography,并使用 GiST 索引查询空间关系

使用 PostGIS 进行地理空间索引 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

什么是 PostGIS?

PostGIS 是所有开源数据库中功能最强大的地理空间扩展。它添加了 GEOMETRY/GEOGRAPHY 类型、数百个空间函数,以及用于快速空间查询的 GiST/SP-GiST 索引。

启用 PostGIS

它是一个 contrib 扩展:

CREATE EXTENSION postgis;

SELECT PostGIS_Version();

GEOMETRY 与 GEOGRAPHY

  • GEOMETRY — 平面坐标,速度快,单位为坐标系单位(通常是米或度)
  • GEOGRAPHY — 球面地球,速度较慢,单位始终为米

对于跨区域数据中“地球上的距离”,请选择 GEOGRAPHY;对于投影坐标系(区域 GIS、快速操作),请选择 GEOMETRY。

存储点

一种常见模式是将纬度/经度存储为 GEOGRAPHY 点:

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

INSERT INTO places (name, location)
VALUES ('Berlin', ST_GeogFromText('SRID=4326;POINT(13.405 52.520)'));

SRID

“空间参考 ID”定义了坐标系。WGS84(ID 为 4326)是 GPS 纬度/经度的标准坐标系。

GiST 空间索引

使用 GiST 为几何列建立索引:

CREATE INDEX places_location_idx ON places USING GIST (location);
-- Now spatial filters are fast.

最近邻:<->

使用索引时,<-> KNN 运算符可在几毫秒内返回最近的结果:

SELECT name, ST_Distance(location, ST_GeogFromText('SRID=4326;POINT(13.4 52.5)')) AS m
FROM places
ORDER BY location <-> ST_GeogFromText('SRID=4326;POINT(13.4 52.5)')
LIMIT 10;

距离范围内

查找距某个点 2 公里以内的地点:

SELECT name FROM places
WHERE ST_DWithin(
  location,
  ST_GeogFromText('SRID=4326;POINT(13.4 52.5)'),
  2000  -- meters
);

多边形和区域

存储并查询多边形(城市边界、配送区域):

CREATE TABLE zones (
  id BIGSERIAL PRIMARY KEY,
  name TEXT,
  area GEOGRAPHY(POLYGON, 4326)
);

-- Find places inside a zone:
SELECT p.name FROM places p
JOIN zones z ON ST_Within(p.location::GEOMETRY, z.area::GEOMETRY)
WHERE z.name = 'Mitte';

相交、包含、位于内部

丰富的空间谓词:ST_Intersects、ST_Contains、ST_Within、ST_Touches、ST_Disjoint、ST_Equals。

加载 GeoJSON

将 GeoJSON 直接导入 PostGIS:

INSERT INTO zones (name, area)
SELECT 'Mitte', ST_GeogFromGeoJSON('{"type":"Polygon","coordinates":[...]}');

生成矢量切片

PostGIS 3.0+ 可以直接使用 ST_AsMVT 生成 Mapbox 矢量切片——直接从数据库为地图界面提供支持。

回顾

PostGIS 将 Postgres 变成了功能强大的 GIS 引擎。

  • 使用 GEOMETRY 表示投影坐标,使用 GEOGRAPHY 表示地球距离
  • 使用 GiST 索引进行空间筛选和 KNN 查询
  • ST_DWithin、ST_Distance、ST_Within
  • SRID 4326 = WGS84 纬度/经度

快速检查

您将用户位置存储为 GEOGRAPHY(POINT)。哪种索引类型可以加速“查找 5 公里以内”的查询?

常见问题解答

「使用 PostGIS 进行地理空间索引」课时是免费的吗?

是的 — 「使用 PostGIS 进行地理空间索引」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「使用 PostGIS 进行地理空间索引」这节课中我会学到什么?

添加 PostGIS 扩展,存储 geometry/geography,并使用 GiST 索引查询空间关系 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 PostGIS 进行地理空间索引」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 三元组搜索(pg_trgm)与模糊匹配
  2. 使用 tsvector 和 GIN 进行全文搜索
  3. 使用 PostGIS 进行地理空间索引
  4. 使用 pgvector 进行向量搜索
← 返回 SQL Academy