Практики · занятие 4

Геометрический тип данных

О чём это занятие
Типы геометрий PostGIS — от точки до коллекции, метаданные пространственных таблиц, функции чтения свойств геометрии и форматы обмена: WKT, WKB, GML, KML, GeoJSON и SVG. В середине занятия — WKT-песочница, которая рисует введённую геометрию и считает её метрики.
Аннотация
Занятие начинается с загрузки данных: SQL-файлы переносятся в Query Tool и выполняются по очереди. Затем повторяется структура учебных таблиц Нью-Йорка — блоки переписи, районы, улицы, станции метро и социодемографические данные. Основная часть посвящена семи геометрическим типам PostGIS: POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON и GEOMETRYCOLLECTION; учебная таблица geometries наполняется примерами, включая полигон с дырой. Разобраны таблицы метаданных spatial_ref_sys и geometry_columns, спецификация Simple Features for SQL и функции чтения свойств: ST_GeometryType, ST_NDims, ST_SRID, ST_X и ST_Y для точек, ST_Length для линий, ST_Area для полигонов. Завершают занятие форматы ввода-вывода геометрии и шесть заданий по базе nyc_data с проверкой ответов.
Пререквизиты
Практика 3 — созданная база с PostGIS и восстановленная nyc_data; базовый SELECT.
Материалы к занятию

1. Загрузка данных

  1. Скачайте архив данных и разархивируйте файлы.
  2. Откройте pgAdmin.
  3. Откройте панель Query Tool.
  4. Перенесите файл в панель и выполните код.
  5. Повторите для всех файлов.
Загрузка SQL-файлов в Query Tool перетаскиванием

2. Описание данных

Данные практикума включают четыре шейп-файла Нью-Йорка и одну атрибутивную таблицу с социодемографическими переменными. Мы загрузили шейп-файлы как таблицы PostGIS; социодемографические данные добавим позже в ходе занятия. Для изучения структуры таблиц в pgAdmin нажмите ПКМ на таблице и выберите Properties — список атрибутов находится в разделе Columns.

2.1. Таблица nyc_census_blocks

Блок переписи — самая мелкая географическая единица сбора данных переписи; более крупные единицы формируются объединением блоков. К блокам прикреплены демографические данные. Записей: 38 794.

Блоки переписи Нью-Йорка
АтрибутОписание
blkidуникальный 15-значный код блока переписи
popn_totalобщее количество людей в блоке
popn_white«белые»
popn_black«темнокожие»
popn_nativ«коренные американцы»
popn_asian«азиаты»
popn_otherдругие категории
boronameокруг Нью-Йорка (Манхэттен, Бронкс, Бруклин, Статен-Айленд, Куинс)
geomполигональная граница блока

2.2. Таблица nyc_neighborhoods

Районы — социальные конструкции, не всегда совпадающие с административными границами. Записей: 129.

Районы Нью-Йорка
АтрибутОписание
nameназвание района
boronameназвание округа
geomполигональная граница района

2.3. Таблица nyc_streets

Центральные линии улиц — транспортная сеть города; улицы классифицированы по типам. Записей: 19 091.

Улицы Нью-Йорка
АтрибутОписание
nameназвание улицы
onewayодносторонняя ли улица («yes» = да, «» = нет)
typeтип дороги (primary, secondary, residential, motorway)
geomцентральная линия улицы

2.4. Таблица nyc_subway_stations

Станции метро связывают поверхность с подземной сетью; их расположение определяет доступность для разных категорий населения. Записей: 491.

Станции метро Нью-Йорка
АтрибутОписание
nameназвание станции
boroughокруг Нью-Йорка
routesлинии метро через станцию
transfersлинии для пересадки
expressостановка экспресс-поездов («express» = да, «» = нет)
geomточечное местоположение станции

2.5. Таблица nyc_census_sociodata

Социоэкономические данные на уровне переписных участков; для пространственного анализа их необходимо связать с географией блоков или участков.

АтрибутОписание
tractidуникальный 11-значный код переписного участка
transit_totalвсего работников в участке
transit_privateработники на частном транспорте
transit_publicработники на общественном транспорте
transit_walkходящие пешком
transit_otherдругие виды транспорта
transit_noneработающие из дома
transit_time_minsминуты, проведённые в пути
family_countколичество семей
family_income_medianмедианный доход семьи
family_income_meanсредний доход семьи
edu_totalлюдей с образовательной историей
edu_no_highschool_diplбез диплома средней школы
edu_highschool_diplс дипломом средней школы
edu_college_diplс дипломом колледжа
edu_graduate_diplс дипломом магистра

3. Геометрические типы данных

PostGIS расширяет функциональные возможности PostgreSQL, добавляя поддержку геометрических типов данных и операций с ними. Основные геометрические типы:

Геометрические типы PostGIS

Вставьте этот пример SQL-кода в окно редактора SQL pgAdmin (удалив текст, который может быть там по умолчанию), а затем выполните:

CREATE TABLE geometries (name varchar, geom geometry);

INSERT INTO geometries VALUES
('Point', 'POINT(0 0)'),
('Linestring', 'LINESTRING(0 0, 1 1, 2 1, 2 2)'),
('Polygon', 'POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),
('PolygonWithHole', 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))'),
('Collection', 'GEOMETRYCOLLECTION(POINT(2 0),POLYGON((0 0, 1 0, 1 1, 0 1, 0 0)))');

SELECT name, ST_AsText(geom) FROM geometries;

Пример создаёт таблицу geometries и вставляет пять геометрических объектов: точку, линию, многоугольник, многоугольник с отверстием и коллекцию. Затем вставленные строки выбираются и отображаются на панели вывода.

4. WKT-песочница

Каждую геометрию из примера можно не только вставить в базу, но и «увидеть». Введите WKT-строку — песочница нарисует геометрию на координатной сетке и посчитает её свойства теми же функциями, что и PostGIS: тип, число точек, длину и площадь (для полигона с дырой площадь дыры вычитается — сравните Polygon и PolygonWithHole).

Песочница: геометрия из WKT

Координаты условные (как в таблице geometries); вычисления выполняются в декартовой плоскости — как ST_Length и ST_Area для типа geometry без указания SRID.

5. Метаданные к геометрии

В соответствии со спецификацией Simple Features for SQL (SFSQL) PostGIS предоставляет две важные таблицы для отслеживания и описания геометрических типов базы данных.

1. spatial_ref_sys — таблица со сведениями обо всех системах пространственной привязки (SRID), известных базе данных. Каждая запись описывает систему координат: её SRID, текстовое описание и параметры преобразования координат из одной системы в другую. Подробнее о системах координат — в лекции 4.

2. geometry_columns — фактически представление, а не таблица, но играет ключевую роль в отслеживании геометрических объектов базы. Для каждой таблицы с геометрией оно предоставляет:

Представление geometry_columns

Посмотрим на geometry_columns в нашей базе — вставьте команду в инструмент запроса:

SELECT * FROM geometry_columns;
Содержимое geometry_columns учебной базы
Примечание

f_table_catalog, f_table_schema и f_table_name дают полное имя таблицы объектов с заданной геометрией; поскольку PostgreSQL не использует каталоги, f_table_catalog, как правило, пуст. f_geometry_column — имя столбца с геометрией: для таблиц с несколькими геометрическими столбцами будет по одной записи на каждый. coord_dimension и srid определяют размерность геометрии (2-, 3- или 4-мерная) и идентификатор системы пространственной привязки, ссылающийся на таблицу spatial_ref_sys.

Запрашивая эту таблицу, ГИС-клиенты и библиотеки могут определить, чего ожидать при получении данных, и выполнять необходимое проецирование, обработку или рендеринг без проверки каждой геометрии.

Изменение системы координат столбца
ALTER TABLE nyc_neighborhoods
ALTER COLUMN wkb_geometry
TYPE Geometry(MultiPolygon, 26918)
USING ST_SetSRID(wkb_geometry, 26918);

6. Спецификация Simple Features for SQL

Спецификация SFSQL, изначально бывшая стандартом для разработки PostGIS, определяет, как объекты реального мира представляются в пространственной базе данных: форма и размеры объекта преобразуются в цифровую форму с фиксированным разрешением — достаточно точное представление объекта. Первоначально SFSQL работала только с двумерными объектами; PostGIS расширил возможности до 3- и 4-мерных представлений, а стандарт SQL-Multimedia Part 3 (SQL/MM) официально определил способы представления таких данных.

Таблица может содержать разные типы геометрий. Для получения общей информации о каждом объекте используются функции чтения метаданных геометрии:

SELECT name, ST_GeometryType(geom), ST_NDims(geom), ST_SRID(geom)
FROM geometries;
namest_geometrytypest_ndimsst_srid
PointST_Point20
PolygonST_Polygon20
PolygonWithHoleST_Polygon20
CollectionST_GeometryCollection20
LinestringST_LineString20

6.1. Точка

Точка представляет одно местоположение на поверхности Земли и описывается одной координатой с 2, 3 или 4 измерениями. Точки используются, когда точные размеры и форма не важны в целевом масштабе: на карте мира города — точки, на карте штата те же города могут быть полигонами.

SELECT ST_AsText(geom)
FROM geometries
WHERE name = 'Point';

Результат: POINT(0 0). Функции для работы с точками:

SELECT ST_X(geom), ST_Y(geom)
FROM geometries
WHERE name = 'Point';

Пример реальных точечных данных — таблица станций метро:

SELECT name, ST_AsText(wkb_geometry)
FROM nyc_subway_stations
LIMIT 1;

6.2. Линия

Линия представляет путь между местоположениями и состоит из упорядоченной последовательности двух или более точек: дороги, реки. Линия замкнута, если начинается и заканчивается в одной точке, и проста, если не пересекает саму себя (кроме замыкания концов).

SELECT ST_AsText(geom)
FROM geometries
WHERE name = 'Linestring';

Результат: LINESTRING(0 0, 1 1, 2 1, 2 2). Функции для работы с линиями:

SELECT ST_Length(geom)
FROM geometries
WHERE name = 'Linestring';

6.3. Полигон

Полигон — область, границы которой описываются замкнутым контуром. Внешняя граница представлена кольцом — замкнутой простой линией; внутренние «дыры» также описываются кольцами. Полигоны представляют объекты, для которых важны размер и форма: границы городов, парки, контуры зданий, водоёмы.

SELECT ST_AsText(geom)
FROM geometries
WHERE name LIKE 'Polygon%';

Результат:

POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))
POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))

Первый полигон содержит только одно кольцо, второй — внутреннюю «дыру». Большинство графических систем знают понятие «полигон», но ГИС уникальны тем, что позволяют полигонам содержать явные внутренние дыры.

SELECT name, ST_Area(geom)
FROM geometries
WHERE name LIKE 'Polygon%';
namest_area
Polygon1
PolygonWithHole99

Полигон с дырой имеет площадь внешней оболочки (квадрат 10 × 10) минус площадь дыры (квадрат 1 × 1).

Типичная ошибка Незамкнутое кольцо полигона: первая и последняя точки каждого кольца обязаны совпадать, иначе PostGIS откажется принимать WKT. Сравните: у квадрата из четырёх углов в WKT пять точек — (0 0, 1 0, 1 1, 0 1, 0 0).

7. Ввод и вывод геометрических данных

В базе данных геометрии хранятся на диске в формате, используемом только программой PostGIS. Чтобы внешние программы могли вставлять и извлекать полезные геометрии, их необходимо преобразовать в формат, понятный другим приложениям. PostGIS поддерживает множество форматов:

Пример вывода геометрии в GeoJSON:

SELECT
ST_AsGeoJSON(ST_GeometryFromText('LINESTRING(0 0,1 0)'));

Вывод: {"type":"LineString","coordinates":[[0,0],[1,0]]}

8. Практика

Эти функции будут полезны для выполнения упражнений:

Таблицы, с которыми мы работаем:

Задание 1

Какова площадь района Уэст-Виллидж?

показать ответ

1 044 614.5296486 (м², в системе координат данных)

Задание 2

Каков геометрический тип улицы Pelham St? Какова её длина?

показать ответ

ST_MultiLineString, длина 50.323

Задание 3

Как записана станция метро Брод-Стрит (Broad St) в GeoJSON?

показать ответ
{"type":"Point",
 "crs":{"type":"name","properties":{"name":"EPSG:26918"}},
 "coordinates":[583571.905921312,4506714.341192182]}
Задание 4

Какова общая протяжённость улиц (в километрах) в Нью-Йорке?

показать ответ

10 418.9047172

Задание 5

Какая станция метро самая западная?

показать ответ

Tottenville

Задание 6

Какова протяжённость улиц Нью-Йорка в разбивке по типам?

показать ответ
typelength
residential8629870.33786606
motorway403622.478126363
tertiary360394.879051303
motorway_link294261.419479668
secondary276264.303897926
unclassified166936.371604458
primary135034.233017947
footway71798.4878378096
service28337.635038596
trunk20353.5819826076
cycleway8863.75144825929
pedestrian4867.05032825026
construction4803.08162103562
residential; motorway_link3661.57506293745
trunk_link3202.18981240201
primary_link2492.57457083536
living_street1894.63905457332
primary; residential; motorway_link; residential1367.76576941335
undefined380.53861910346
steps282.745221342127
motorway_link; residential215.07778911517

Контрольные вопросы

Источники

  1. Introduction to PostGIS — PostGIS Workshop : [сайт]. — URL: https://postgis.net/workshops/postgis-intro/ (дата обращения: 18.08.2026).
  2. OpenGIS Implementation Specification for Geographic information — Simple feature access — Part 2: SQL option / Open Geospatial Consortium. — 2010. — URL: https://www.ogc.org/standards/sfs (дата обращения: 18.08.2026).
  3. PostGIS Documentation. Geometry Accessors : [сайт]. — URL: https://postgis.net/docs/reference.html (дата обращения: 18.08.2026).