Countries 数据库(PostGIS):空间表和 SQL 练习
Countries 是用于学习空间 SQL 的 PostGIS 数据库:包含世界各国及首都,以及纽约市的人口普查街区、街区、街道和地铁站图层。 在 SQLtest.online 上,你可以直接在浏览器中查询它:做自动判题的练习,或在练习场中运行自己的查询,无需安装任何软件。
- 7 张空间表
- 246 个国家
- 491 个地铁站
- 11 道 SQL 练习
什么是 Countries
PostGIS 是 PostgreSQL 的扩展,增加了几何类型和数百个空间函数:距离、面积、相交、坐标转换等。这个数据库让你可以在熟悉的数据上试用它们。
纽约市的表来自著名的 PostGIS 教程 "Introduction to PostGIS",世界数据表包含各国边界和首都。它们共同涵盖了两种坐标系中的点、线和多边形。
数据库包含什么
这些表分为两组。
世界
带边界多边形的 countries 和带点坐标的 capitals,均为 SRID 4326(经度和纬度)。
纽约市
nyc_census_blocks、nyc_neighborhoods、nyc_streets、nyc_subway_stations 和 nyc_homicides,SRID 为 26918(UTM 18N 区,单位为米)。
最需要记住的一点:世界数据表存储的是度,纽约数据表存储的是米。纽约图层中的距离和面积直接以米为单位;对于世界数据表,需要先转换为 geography 或对几何进行投影变换。
各表的数据量:
| 表 | 行数 | 内容 |
|---|---|---|
| countries | 246 | 国家及其边界 |
| capitals | 192 | 首都 |
| nyc_census_blocks | 38,794 | 带人口数据的普查街区 |
| nyc_neighborhoods | 129 | 街区 |
| nyc_streets | 19,091 | 街道 |
| nyc_subway_stations | 491 | 地铁站 |
| nyc_homicides | 3,982 | 凶杀案 |
表结构
点击表名可查看它的列、示例行和键。
表列表
- id唯一记录标识符(主键)
- name国家名称
- border国家几何形状(MultiPolygon,SRID 4326)
| id | name | border |
|---|---|---|
| 1 | 法国 | MultiPolygon(...) [SRID=4326] |
- 主键,btree (id)
- id唯一记录标识符(主键)
- name首都名称
- country_id国家引用(外键)
- location首都位置(Point,SRID 4326)
| id | name | country_id | location |
|---|---|---|---|
| 1 | 巴黎 | 1 | Point(...) [SRID=4326] |
- 主键,btree (id)
- 外键 (country_id) 引用 countries(id)
- gid唯一记录标识符(主键)
- blkid人口普查区ID
- popn_total总人口
- popn_white白人人口
- popn_black黑人总人口
- popn_nativ本土人口
- popn_asian亚裔人口
- popn_other其他人口
- boroname区名
- geom人口普查区几何形状(MultiPolygon,SRID 4326)
| gid | blkid | popn_total | popn_white | popn_black | popn_nativ | popn_asian | popn_other | boroname | geom |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 360050001001000 | 1000 | 500 | 200 | 50 | 150 | 100 | 曼哈顿 | MultiPolygon(...) [SRID=4326] |
- 主键,btree (gid)
- gid唯一记录标识符(主键)
- incident_d事件日期
- boroname区名
- num_victim受害者人数
- primary_mo主要动机
- id事件ID
- weapon使用的武器
- light_dark光线或黑暗条件
- year事件年份
- geom事件位置(Point,SRID 4326)
| gid | incident_d | boroname | num_victim | primary_mo | id | weapon | light_dark | year | geom |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 2003-01-01 | 曼哈顿 | 1 | 未知 | 1 | 火器 | D | 2003 | Point(...) [SRID=4326] |
- 主键,btree (gid)
- gid唯一记录标识符(主键)
- boroname区名
- name社区名称
- geom社区几何形状(MultiPolygon,SRID 4326)
| gid | boroname | name | geom |
|---|---|---|---|
| 1 | 曼哈顿 | 金融区 | MultiPolygon(...) [SRID=4326] |
- 主键,btree (gid)
- gid唯一记录标识符(主键)
- id街道ID
- name街道名称
- oneway单行道指示
- type街道类型
- geom街道几何形状(LineString,SRID 4326)
| gid | id | name | oneway | type | geom |
|---|---|---|---|---|---|
| 1 | 1 | 百老汇 | 否 | 大道 | LineString(...) [SRID=4326] |
- 主键,btree (gid)
- gid唯一记录标识符(主键)
- objectid对象ID
- id车站ID
- name车站名称
- alt_name替代名称
- cross_st交叉街道
- long_name长名称
- label标签
- borough区
- nghbhd社区
- routes路线
- transfers换乘
- color颜色
- express快车指示
- closed关闭指示
- geom车站位置(Point,SRID 4326)
| gid | objectid | id | name | alt_name | cross_st | long_name | label | borough | nghbhd | routes | transfers | color | express | closed | geom |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 时代广场 | 时代广场 | 第七大道 | 时代广场-42街 | 时代广场 | 曼哈顿 | 中城 | 1,2,3,7,A,C,E,N,Q,R,S,W | 42街 | 红色 | 是 | 否 | Point(...) [SRID=4326] |
- 主键,btree (gid)
示例查询
这些查询展示了数据之间是如何关联的。复制任意一条,在练习场中运行即可。
首都位于本国境内:用 ST_X / ST_Y 获取点坐标,并用 ST_Contains 做空间判断。
SELECT c.name AS capital, co.name AS country,
round(ST_Y(c.location)::numeric, 2) AS lat,
round(ST_X(c.location)::numeric, 2) AS lon,
ST_Contains(co.border, c.location) AS inside_border
FROM capitals c
JOIN countries co ON co.id = c.country_id
ORDER BY c.name
LIMIT 3;
| capital | country | lat | lon | inside_border |
|---|---|---|---|---|
| Abu Dhabi | United Arab Emirates | 24.30 | 54.70 | true |
| Abuja | Nigeria | 9.08 | 7.40 | true |
| Accra | Ghana | 5.60 | -0.19 | true |
地铁站及其 SRID:纽约图层使用投影坐标系 26918。
SELECT s.name AS station, s.borough, s.routes, ST_SRID(s.geom) AS srid
FROM nyc_subway_stations s
ORDER BY s.gid
LIMIT 3;
| station | borough | routes | srid |
|---|---|---|---|
| Cortlandt St | Manhattan | R,W | 26918 |
| Rector St | Manhattan | 1 | 26918 |
| South Ferry | Manhattan | 1 | 26918 |
按主题分类的 SQL 练习
这个数据库上共有 11 道 PostGIS 练习:距离、面积、长度、转换为文本和 JSON 以及空间连接。答案会在带 PostGIS 的真实 PostgreSQL 上自动检查。 右侧数字是该主题的练习数量,彩色圆点表示难度范围。
从哪里开始
Countries 数据库的前几道练习:
常见问题
使用这个数据库需要安装 PostGIS 吗?
不需要。SQLtest.online 的练习和练习场都在我们的服务器上执行查询,有浏览器就够了。在练习场中选择 PostgreSQL 17 + PostGIS WorkShop 即可。
什么是 SRID?
空间参考标识符:它说明坐标使用的是哪种坐标系。4326 表示以度为单位的经纬度(WGS 84);26918 表示以米为单位的 UTM 18N 区,用于纽约。
纽约的表来自哪里?
来自 postgis.net 上发布的 "Introduction to PostGIS" 教程数据集,这是学习 PostGIS 的常见起点。