Геометрический тип данных
- О чём это занятие
- Типы геометрий 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.
- Материалы к занятию
-
- В директории Student создайте папку Группа_ФИО и разархивируйте скачанные материалы.
- Презентация к практике
- Архив данных
1. Загрузка данных
- Скачайте архив данных и разархивируйте файлы.
- Откройте pgAdmin.
- Откройте панель 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, добавляя поддержку геометрических типов данных и операций с ними. Основные геометрические типы:
- POINT (точка) — геометрический объект, представляющий одно местоположение в пространстве с заданными координатами. Используется для хранения местоположений объектов: GPS-координаты зданий, деревьев, остановок транспорта.
- LINESTRING (линия) — набор связанных точек, образующих линейный объект: дороги, реки, железнодорожные пути и другие протяжённые объекты.
- POLYGON (полигон) — замкнутая линия, описывающая площадь на карте: земельные участки, озёра, территории зданий.
- MULTIPOINT (множественная точка) — набор точек, хранимый как один объект: местоположения датчиков, вышек связи, точек интереса.
- MULTILINESTRING (множественная линия) — несколько линий в одном объекте: многополосные дороги, сети водоснабжения.
- MULTIPOLYGON (множественный полигон) — несколько полигонов в одном объекте: территории из нескольких участков, административные районы.
- GEOMETRYCOLLECTION (коллекция геометрий) — набор различных типов геометрических объектов (точек, линий, полигонов) как один объект: гибкий тип, позволяющий хранить в одном поле комбинации геометрий.
Вставьте этот пример 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).
Координаты условные (как в таблице geometries); вычисления выполняются в декартовой плоскости — как ST_Length и ST_Area для типа geometry без указания SRID.
5. Метаданные к геометрии
В соответствии со спецификацией Simple Features for SQL (SFSQL) PostGIS предоставляет две важные таблицы для отслеживания и описания геометрических типов базы данных.
1. spatial_ref_sys — таблица со сведениями обо всех системах пространственной привязки (SRID), известных базе данных. Каждая запись описывает систему координат: её SRID, текстовое описание и параметры преобразования координат из одной системы в другую. Подробнее о системах координат — в лекции 4.
2. geometry_columns — фактически представление, а не таблица, но играет ключевую роль в отслеживании геометрических объектов базы. Для каждой таблицы с геометрией оно предоставляет:
- имя таблицы, содержащей геометрические данные;
- название столбца с геометрией;
- тип геометрии (точка, линия, полигон и т. д.);
- SRID — систему пространственной привязки геометрии.
Посмотрим на geometry_columns в нашей базе — вставьте команду в инструмент запроса:
SELECT * FROM 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) официально определил способы представления таких данных.
Таблица может содержать разные типы геометрий. Для получения общей информации о каждом объекте используются функции чтения метаданных геометрии:
- ST_GeometryType(geometry) — возвращает тип геометрии;
- ST_NDims(geometry) — возвращает количество измерений;
- ST_SRID(geometry) — возвращает идентификатор системы пространственной привязки (SRID).
SELECT name, ST_GeometryType(geom), ST_NDims(geom), ST_SRID(geom) FROM geometries;
| name | st_geometrytype | st_ndims | st_srid |
|---|---|---|---|
| Point | ST_Point | 2 | 0 |
| Polygon | ST_Polygon | 2 | 0 |
| PolygonWithHole | ST_Polygon | 2 | 0 |
| Collection | ST_GeometryCollection | 2 | 0 |
| Linestring | ST_LineString | 2 | 0 |
6.1. Точка
Точка представляет одно местоположение на поверхности Земли и описывается одной координатой с 2, 3 или 4 измерениями. Точки используются, когда точные размеры и форма не важны в целевом масштабе: на карте мира города — точки, на карте штата те же города могут быть полигонами.
SELECT ST_AsText(geom) FROM geometries WHERE name = 'Point';
Результат: POINT(0 0). Функции для работы с точками:
- ST_X(geometry) — возвращает координату X (долгота);
- ST_Y(geometry) — возвращает координату Y (широта).
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). Функции для работы с линиями:
- ST_Length(geometry) — длина линии;
- ST_StartPoint(geometry) — первая точка линии;
- ST_EndPoint(geometry) — последняя точка линии;
- ST_NPoints(geometry) — количество точек в линии.
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%';
| name | st_area |
|---|---|
| Polygon | 1 |
| PolygonWithHole | 99 |
Полигон с дырой имеет площадь внешней оболочки (квадрат 10 × 10) минус площадь дыры (квадрат 1 × 1).
(0 0, 1 0, 1 1, 0 1, 0 0).
7. Ввод и вывод геометрических данных
В базе данных геометрии хранятся на диске в формате, используемом только программой PostGIS. Чтобы внешние программы могли вставлять и извлекать полезные геометрии, их необходимо преобразовать в формат, понятный другим приложениям. PostGIS поддерживает множество форматов:
- Well-known text (WKT):
- ST_GeomFromText(text, srid) — возвращает geometry;
- ST_AsText(geometry) — возвращает text;
- ST_AsEWKT(geometry) — возвращает text.
- Well-known binary (WKB):
- ST_GeomFromWKB(bytea) — возвращает geometry;
- ST_AsBinary(geometry) — возвращает bytea;
- ST_AsEWKB(geometry) — возвращает bytea.
- Geographic Mark-up Language (GML): ST_GeomFromGML(text), ST_AsGML(geometry);
- Keyhole Mark-up Language (KML): ST_GeomFromKML(text), ST_AsKML(geometry);
- GeoJSON: ST_AsGeoJSON(geometry);
- Scalable Vector Graphics (SVG): ST_AsSVG(geometry).
Пример вывода геометрии в GeoJSON:
SELECT ST_AsGeoJSON(ST_GeometryFromText('LINESTRING(0 0,1 0)'));
Вывод: {"type":"LineString","coordinates":[[0,0],[1,0]]}
8. Практика
Эти функции будут полезны для выполнения упражнений:
- sum(expression) — агрегат: сумма по набору записей;
- count(expression) — агрегат: количество записей в наборе;
- ST_GeometryType(geometry) — тип геометрии;
- ST_SRID(geometry) — идентификатор системы пространственной привязки;
- ST_X(point), ST_Y(point) — координаты точки;
- ST_Length(linestring) — длина линии;
- ST_StartPoint(geometry), ST_EndPoint(geometry) — первая и последняя точки линии;
- ST_NPoints(geometry) — количество точек в линии;
- ST_Area(geometry) — площадь полигона.
Таблицы, с которыми мы работаем:
- nyc_census_blocks (поля: blkid, popn_total, boroname, wkb_geometry);
- nyc_streets (поля: name, type, wkb_geometry);
- nyc_subway_stations (поля: name, wkb_geometry);
- nyc_neighborhoods (поля: name, boroname, wkb_geometry).
Какова площадь района Уэст-Виллидж?
показать ответ
1 044 614.5296486 (м², в системе координат данных)
Каков геометрический тип улицы Pelham St? Какова её длина?
показать ответ
ST_MultiLineString, длина 50.323
Как записана станция метро Брод-Стрит (Broad St) в GeoJSON?
показать ответ
{"type":"Point",
"crs":{"type":"name","properties":{"name":"EPSG:26918"}},
"coordinates":[583571.905921312,4506714.341192182]}
Какова общая протяжённость улиц (в километрах) в Нью-Йорке?
показать ответ
10 418.9047172
Какая станция метро самая западная?
показать ответ
Tottenville
Какова протяжённость улиц Нью-Йорка в разбивке по типам?
показать ответ
| type | length |
|---|---|
| residential | 8629870.33786606 |
| motorway | 403622.478126363 |
| tertiary | 360394.879051303 |
| motorway_link | 294261.419479668 |
| secondary | 276264.303897926 |
| unclassified | 166936.371604458 |
| primary | 135034.233017947 |
| footway | 71798.4878378096 |
| service | 28337.635038596 |
| trunk | 20353.5819826076 |
| cycleway | 8863.75144825929 |
| pedestrian | 4867.05032825026 |
| construction | 4803.08162103562 |
| residential; motorway_link | 3661.57506293745 |
| trunk_link | 3202.18981240201 |
| primary_link | 2492.57457083536 |
| living_street | 1894.63905457332 |
| primary; residential; motorway_link; residential | 1367.76576941335 |
| undefined | 380.53861910346 |
| steps | 282.745221342127 |
| motorway_link; residential | 215.07778911517 |
Контрольные вопросы
-
POINT — станция метро; LINESTRING — улица, река; POLYGON — граница района, озеро; MULTIPOINT — сеть датчиков одним объектом; MULTILINESTRING — многополосная дорога; MULTIPOLYGON — регион из нескольких участков; GEOMETRYCOLLECTION — произвольная комбинация типов в одном поле.
-
spatial_ref_sys — все известные базе системы пространственной привязки: SRID, описание, параметры преобразований. geometry_columns (представление) — реестр геометрических столбцов: таблица, столбец, тип геометрии, размерность и SRID; по нему ГИС-клиенты понимают, чего ожидать от данных без проверки каждой геометрии.
-
Первое кольцо — внешняя оболочка, квадрат 10 × 10 площадью 100; второе кольцо — дыра, квадрат 1 × 1 площадью 1. ST_Area возвращает площадь оболочки минус площади дыр: 100 − 1 = 99.
-
Замкнутая линия начинается и заканчивается в одной и той же точке. Простая — не пересекает саму себя (самопересечение допустимо только в точке замыкания). Кольца полигонов обязаны быть замкнутыми простыми линиями.
-
Точка: ST_X, ST_Y. Линия: ST_Length, ST_StartPoint, ST_EndPoint, ST_NPoints. Полигон: ST_Area. Общие для любых геометрий: ST_GeometryType, ST_NDims, ST_SRID, ST_AsText.
-
WKT (человекочитаемый текст), WKB (двоичный), GML и KML (XML-форматы гео-обмена), GeoJSON (веб-приложения), SVG (векторная графика). Внутренний формат хранения понятен только PostGIS, поэтому для каждого класса внешних программ нужен свой формат экспорта/импорта: ST_AsText, ST_AsGeoJSON, ST_GeomFromText и другие.
-
ALTER TABLE … ALTER COLUMN geom TYPE Geometry(MultiPolygon, 26918) USING ST_SetSRID(geom, 26918); — ST_SetSRID помечает геометрию новым SRID (без пересчёта координат; для пересчёта используется ST_Transform).
Источники
- Introduction to PostGIS — PostGIS Workshop : [сайт]. — URL: https://postgis.net/workshops/postgis-intro/ (дата обращения: 18.08.2026).
- 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).
- PostGIS Documentation. Geometry Accessors : [сайт]. — URL: https://postgis.net/docs/reference.html (дата обращения: 18.08.2026).