База данных Countries (PostGIS): пространственные таблицы и SQL-задачи
Countries — база PostGIS для изучения пространственного SQL: страны и столицы мира, а также слои Нью-Йорка с переписными кварталами, районами, улицами и станциями метро. На 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уникальный идентификатор записи (PK)
- nameназвание страны
- borderгеометрия страны (MultiPolygon, SRID 4326)
| id | name | border |
|---|---|---|
| 1 | Франция | MultiPolygon(...) [SRID=4326] |
- PRIMARY KEY, btree (id)
- idуникальный идентификатор записи (PK)
- nameназвание столицы
- country_idссылка на страну (FK)
- locationкоординаты столицы (Point, SRID 4326)
| id | name | country_id | location |
|---|---|---|---|
| 1 | Париж | 1 | Point(...) [SRID=4326] |
- PRIMARY KEY, btree (id)
- FOREIGN KEY (country_id) REFERENCES countries(id)
- gidуникальный идентификатор записи (PK)
- blkidID переписного блока
- 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] |
- PRIMARY KEY, btree (gid)
- gidуникальный идентификатор записи (PK)
- incident_dдата инцидента
- boronameназвание района
- num_victimчисло жертв
- primary_moосновной мотив
- idID инцидента
- 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] |
- PRIMARY KEY, btree (gid)
- gidуникальный идентификатор записи (PK)
- boronameназвание района
- nameназвание района
- geomгеометрия района (MultiPolygon, SRID 4326)
| gid | boroname | name | geom |
|---|---|---|---|
| 1 | Манхэттен | Финансовый район | MultiPolygon(...) [SRID=4326] |
- PRIMARY KEY, btree (gid)
- gidуникальный идентификатор записи (PK)
- idID улицы
- nameназвание улицы
- onewayиндикатор одностороннего движения
- typeтип улицы
- geomгеометрия улицы (LineString, SRID 4326)
| gid | id | name | oneway | type | geom |
|---|---|---|---|---|---|
| 1 | 1 | Бродвей | NO | avenue | LineString(...) [SRID=4326] |
- PRIMARY KEY, btree (gid)
- gidуникальный идентификатор записи (PK)
- objectidID объекта
- idID станции
- 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 | Таймс-сквер | Times Sq | 7th Ave | Times Square-42nd Street | Times Sq | Манхэттен | Midtown | 1,2,3,7,A,C,E,N,Q,R,S,W | 42nd St | Красный | Да | Нет | Point(...) [SRID=4326] |
- PRIMARY KEY, 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-задачи по темам
Задач по PostGIS на этой базе: 11 — расстояния, площади, длины, преобразование в текст и JSON и пространственные соединения. Решение проверяется автоматически на настоящем PostgreSQL с PostGIS. Число справа — количество задач в теме, цветные метки — диапазон сложности.
С чего начать
Первые задачи по базе Countries:
- Извлечь геометрию как текст
- Извлечь геометрию как JSON
- Расстояние между городами
- Площадь страны
- Станции метро Манхэттена
- Вычислить площадь микрорайона
- Площадь микрорайона
- Средняя площадь района
- Длина улиц Нью-Йорка
- Станции "Little Italy"
Частые вопросы
Нужно ли устанавливать PostGIS, чтобы работать с этой базой?
Нет. Задачи и песочница на SQLtest.online выполняют запросы на сервере, достаточно браузера. В песочнице выберите PostgreSQL 17 + PostGIS WorkShop.
Что такое SRID?
Идентификатор пространственной системы координат: он говорит, в какой системе записаны координаты. 4326 — долгота и широта в градусах (WGS 84), 26918 — UTM, зона 18N, в метрах, её используют для Нью-Йорка.
Откуда взяты таблицы Нью-Йорка?
Из набора данных практикума «Introduction to PostGIS», опубликованного на postgis.net, — частой отправной точки для изучения PostGIS.