空间数据类型
SQL 中的点、线和多边形。
空间数据类型 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
什么是空间数据
空间数据描述现实世界中的位置、形状和区域。与普通数字或字符串不同,空间值包含几何意义——地图上的一个点、一段道路或一个国家的边界。
PostGIS 是 PostgreSQL 的扩展,它添加了强大的空间数据类型和函数,将您的数据库变成完整的地理信息系统(GIS)。
-- Enable the PostGIS extension
CREATE EXTENSION IF NOT EXISTS postgis;GEOMETRY 类型
PostGIS 中的核心空间类型是几何类型。它在平面(欧几里得)坐标空间中存储形状。创建列时,您可以指定 POINT、LINESTRING 或 POLYGON 等子类型作为约束。
在子类型旁指定 SRID(空间参考 ID),可以告诉 PostGIS 您的数据使用哪种坐标系。
CREATE TABLE locations (
id SERIAL PRIMARY KEY,
name TEXT,
geom geometry(POINT, 4326)
);插入 POINT
POINT 表示由 X(经度)和 Y(纬度)坐标确定的单个位置。ST_GeomFromText 函数可将熟知文本(WKT)字符串转换为几何值。
SRID 4326 是全球 GPS 设备使用的 WGS 84 坐标系。
INSERT INTO locations (name, geom)
VALUES
('Eiffel Tower', ST_GeomFromText('POINT(2.2945 48.8584)', 4326)),
('Big Ben', ST_GeomFromText('POINT(-0.1246 51.5007)', 4326)),
('Colosseum', ST_GeomFromText('POINT(12.4922 41.8902)', 4326));
SELECT name, ST_AsText(geom) AS wkt FROM locations;LINESTRING 类型
LINESTRING 是由两个或更多个点按顺序组成、并由直线段连接而成的序列。它非常适合表示道路、河流或任何线性要素。
WKT 中的每一对数字代表一个顶点(经度、纬度)。PostGIS 会将整条路径存储为一个几何值。
CREATE TABLE roads (
id SERIAL PRIMARY KEY,
name TEXT,
path geometry(LINESTRING, 4326)
);
INSERT INTO roads (name, path)
VALUES (
'High Street',
ST_GeomFromText(
'LINESTRING(-0.125 51.500, -0.120 51.502, -0.115 51.505)',
4326
)
);
SELECT name, ST_Length(path) AS length_degrees FROM roads;POLYGON 类型
POLYGON 定义一个封闭区域。它的外边界是一个环——一个首尾闭合的 LINESTRING,其中第一个点和最后一个点完全相同。多边形还可以包含内环(孔洞),以表示公园内湖泊之类的区域。
所有环都必须闭合:在末尾重复起始坐标。
CREATE TABLE zones (
id SERIAL PRIMARY KEY,
name TEXT,
area geometry(POLYGON, 4326)
);
INSERT INTO zones (name, area)
VALUES (
'Central Park Approx',
ST_GeomFromText(
'POLYGON((-73.9817 40.7681, -73.9580 40.7681,
-73.9580 40.7964, -73.9817 40.7964,
-73.9817 40.7681))',
4326
)
);
SELECT name, ST_Area(area) AS area_sq_deg FROM zones;GEOGRAPHY 与 GEOMETRY
PostGIS 提供两类空间类型:几何类型使用平面笛卡尔坐标系,而地理类型将地球建模为曲面椭球体。
当您需要在大范围区域内获得准确的现实世界米制距离时,请使用地理类型。当您使用本地投影坐标系或需要最高性能时,请使用几何类型。
CREATE TABLE cities (
id SERIAL PRIMARY KEY,
name TEXT,
geog geography(POINT, 4326)
);
INSERT INTO cities (name, geog) VALUES
('New York', ST_GeogFromText('POINT(-74.0060 40.7128)')),
('London', ST_GeogFromText('POINT(-0.1278 51.5074)'));
-- Distance in metres using geography
SELECT
a.name AS from_city,
b.name AS to_city,
ROUND(ST_Distance(a.geog, b.geog)::NUMERIC) AS distance_m
FROM cities a, cities b
WHERE a.name = 'New York' AND b.name = 'London';熟知文本(WKT)和 WKB
空间数据可以使用两种标准格式进行序列化。熟知文本(WKT)便于人类阅读:POINT(2.29 48.86)。熟知二进制(WKB)是一种紧凑的二进制表示形式,供内部使用和数据传输使用。
PostGIS 提供 ST_AsText 和 ST_AsBinary,用于在内部存储与这些格式之间进行转换。
SELECT
name,
ST_AsText(geom) AS wkt,
ST_AsEWKT(geom) AS ewkt,
encode(ST_AsBinary(geom), 'hex') AS wkb_hex
FROM locations
LIMIT 2;MULTIPOINT、MULTILINESTRING、MULTIPOLYGON
PostGIS 还支持多几何体类型,可将多个同类形状组合成一个值。当一个现实世界要素由彼此分离的部分组成时,这种类型非常有用——例如,将群岛建模为 MULTIPOLYGON。
所有标准空间函数对多几何体的工作方式都相同。
SELECT ST_AsText(
ST_GeomFromText(
'MULTIPOLYGON(
((0 0, 4 0, 4 4, 0 4, 0 0)),
((10 10, 14 10, 14 14, 10 14, 10 10))
)'
)
) AS multi_poly;
SELECT ST_NumGeometries(
ST_GeomFromText(
'MULTIPOLYGON(
((0 0, 4 0, 4 4, 0 4, 0 0)),
((10 10, 14 10, 14 14, 10 14, 10 10))
)'
)
) AS part_count;GEOMETRYCOLLECTION
GEOMETRYCOLLECTION 是最通用的空间类型,可以在一个值中同时容纳点、线和多边形。这种灵活性适用于数据集可能包含不同几何类型,而这些类型又存储在同一列中的情况。
您可以使用 ST_GeometryN 提取单个成员。
SELECT ST_AsText(
ST_GeomFromText(
'GEOMETRYCOLLECTION(
POINT(1 1),
LINESTRING(0 0, 1 1, 2 2),
POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))
)'
)
) AS collection;
SELECT ST_AsText(
ST_GeometryN(
ST_GeomFromText(
'GEOMETRYCOLLECTION(POINT(1 1), LINESTRING(0 0, 1 1))'
),
1
)
) AS first_member;使用 GIST 的空间索引
检查包含关系或邻近关系的空间查询必须比较每一行的几何数据,这可能需要扫描数百万个形状。GIST 索引通过为几何数据的包围盒建立索引,大幅提升查询速度,使 PostgreSQL 可以跳过不可能匹配的行。
对于经常查询的几何类型或地理类型列,请始终创建 GIST 索引。
-- Create a GIST index on a geometry column
CREATE INDEX idx_locations_geom
ON locations
USING GIST (geom);
-- PostgreSQL will now use the index for spatial operators
EXPLAIN ANALYZE
SELECT name
FROM locations
WHERE ST_DWithin(
geom,
ST_GeomFromText('POINT(2.3 48.9)', 4326),
1.0
);读取几何属性
PostGIS 提供属性访问函数,可以从任意几何数据中提取属性。ST_X 和 ST_Y 返回点的坐标,ST_SRID 返回空间参考 ID,而 ST_GeometryType 返回子类型名称。
这些函数对于检查和验证空间数据至关重要。
SELECT
name,
ST_X(geom) AS longitude,
ST_Y(geom) AS latitude,
ST_SRID(geom) AS srid,
ST_GeometryType(geom) AS geom_type,
ST_IsValid(geom) AS is_valid
FROM locations;快速测验
检验您对 PostGIS 空间数据类型的理解。
课程回顾
在本课中,您探索了 PostGIS 提供的核心空间数据类型。您了解到 POINT、LINESTRING 和 POLYGON 是三种基本几何子类型,而多几何体变体(MULTIPOINT、MULTILINESTRING、MULTIPOLYGON)以及用于容纳各种类型的 GEOMETRYCOLLECTION 可以表示更复杂的形状。
您了解了平面几何类型与椭球面地理类型之间的区别,以及如何在两者之间进行选择。熟知文本(WKT)让您可以使用便于人类阅读的字符串读写空间值,而 GIST 索引可以让大规模空间查询保持快速。ST_X、ST_SRID 和 ST_GeometryType 等属性访问函数可以让您直接在 SQL 中检查任意几何值。
常见问题解答
「空间数据类型」课时是免费的吗?
是的 — 「空间数据类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「空间数据类型」这节课中我会学到什么?
SQL 中的点、线和多边形。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「空间数据类型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。