Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Модели пространственных данных

Модель пространственных данных — это способ описания и представления объектов реального мира в цифровой форме с помощью определённых структур и правил.

В ГИС выделяют две основные модели пространственных данных — растровую и векторную.

1. Векторная модель данных — объекты описываются координатами и представлены в виде точек, линий и полигонов. Такая модель используется для представления дискретных объектов с чёткими границами. Например, здания, дороги, административные границы.

2. Растровая модель данных — пространство представляется как регулярная сетка ячеек (cells), каждая из которых содержит значение. Эта модель применяется для описания непрерывных явлений. Например: рельеф, температура, плотность населения.

В этом разделе рассмотрим библиотеки и классы Python, применяемые для работы с векторными и растровыми пространственными данными

1. Векторный формат данных

1.0. Импорт библиотек

from shapely.geometry import Point, LineString, Polygon
import geopandas as gpd
  • Shapely (shapely.geometry) — библиотека Python для работы с векторной геометрией. Она позволяет создавать и анализировать геометрические объекты (точки, линии и полигоны) и предоставляет стандартные операции.

  • GeoPandas (geopandas) — библиотека Python, расширение библиотеки pandas, предназначенное для работы с геопространственными данными. Позволяет загружать, обрабатывать и анализировать пространственные наборы данных в различных форматах.

1.1. Что такое векторные данные

Векторная модель представляет пространственные объекты через их координаты.

Объекты бывают трёх основных типов:

  • точки — представлены двумя (x, y) или тремя координатами (x, y, z).

  • линии — упорядоченная последовательность пар координат.

  • полигоны — замкнутая последовательность пар координат, где первая и последняя точки совпадают

Каждая геометрия связана с набором атрибутов — описательных характеристик объекта, которые хранятся в табличной форме

Также поддерживаются и составные объекты (MultiPoint, MultiLineString, MultiPolygon) — это несколько геометрий одного типа с общими атрибутами.

1.2. Геометрия: Shapely

Воспользуемся классами библиотеки Shapely и создадим точку, линию и полигон.

# точка
point = Point(30.2963, 59.9255)
print(point)
point
POINT (30.2963 59.9255)
Loading...
# линия
line = LineString([(30.2955, 59.9260), (30.2970, 59.9260), (30.2970, 59.9250)])
print(line)

# свойства объекта
print("Длина:", line.length)

line 
LINESTRING (30.2955 59.926, 30.297 59.926, 30.297 59.925)
Длина: 0.0025000000000048317
Loading...
# полигон
polygon = Polygon([(30.2955, 59.9260), (30.2970, 59.9260), (30.2970, 59.9250), (30.2955, 59.9250)])
print(polygon)

# свойства объекта
print("Площадь:", polygon.area)
print("Длина:", polygon.length)

polygon
POLYGON ((30.2955 59.926, 30.297 59.926, 30.297 59.925, 30.2955 59.925, 30.2955 59.926))
Площадь: 1.500000000007219e-06
Длина: 0.005000000000009663
Loading...

Однако на данном этапе мы работаем только с геометрией. Такие объекты сами по себе ещё не являются пространственными данными, поскольку не связаны с атрибутивной информацией и не имеют явно заданной системы координат.

1.3 Набор пространственных данных: GeoPandas

Набор пространственных данных в Python описывается классом GeoDataFrame из библиотеки geopandas.

Чтобы его создать, нам необходимо объединить геометрию и атрибутивные данные в единую табличную структуру, а также задать систему координат (CRS).

Создадим GeoDataFrame, используя ранее заданную геометрию point, добавим к ней атрибуты и систему координат (CRS).

gdf = gpd.GeoDataFrame(
    {"name": ["Мариинский театр"]},  # атрибуты
    geometry=[point],                # геометрия
    crs="EPSG:4326"                  # система координат
)

Параметр crs задаёт систему координат — правило, по которому координаты объекта соотносятся с реальным положением на Земле. В данном случае используется географическая система координат WGS84 c кодом EPSG:4326, в которой координаты задаются в градусах. Подробнее о системах координат и их выборе мы поговорим во втором модуле.

Посмотрим на результат:

gdf
Loading...

На первый взгляд в таком виде он почти не отличается от обычных табличных данных DataFrame, но на самом деле поле geometry – не просто одно из полей - оно делает доступным пространственные операции.

С помощью метода explore() класса GeoDataFrame можно отобразить созданный объект на интерактивной карте и убедиться, что он корректно привязан к координатам. Этот метод использует библиотеки folium и mapclassify, которые необходимо предварительно установить:

gdf.explore(tiles='cartodbpositron')
Loading...

Точка появилась на карте в ожидаемом месте — значит, объект имеет корректную пространственную привязку, и на основе координат мы успешно создали набор пространственных данных.

Аналогичным образом можно работать с линейными и полигональными объектами.

2. Растровый формат данных

В этом разделе мы лишь кратко рассмотрим растровый формат данных, чтобы понять его основные особенности и отличие от векторной модели. Подробно к работе с растрами мы вернёмся в пятом модуле курса.

2.0. Импорт библиотек

import numpy as np
import rasterio
import rasterio.plot
  • NumPy (numpy) — библиотека для работы с многомерными массивами. В контексте растровых данных используется для хранения и обработки значений ячеек, поскольку растр по сути представляет собой массив чисел.

  • rasterio (rasterio) — это библиотека Python для работы с растровыми пространственными данными. Она предоставляет инструменты для чтения, записи и анализа растровых файлов (например, GeoTIFF), а также для работы с системой координат, разрешением и пространственной привязкой растра.

2.1. Что такое растровые данные

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

Основные характеристики растра:

  • ячейка (пиксель) — минимальный элемент растра, содержащий числовое значение;

  • разрешение — размер ячейки в пространстве;

  • размер растра — количество строк и столбцов (ширина и высота).

В отличие от векторных данных, растр не хранит отдельные объекты и их атрибуты. Вместо этого каждой ячейке присваивается значение некоторого показателя. Такой формат удобно использовать для описания непрерывных явлений — например, высоты, температуры или плотности населения.

2.2. Структура растровых данных

Растровые данные хранятся в виде массива значений, которому заданы пространственная привязка, система координат, размер ячейки (разрешение) и другие характеристики.

Создадим матрицу значений будущего растра и зададим его пространственную привязку — координаты верхнего левого угла и размер пикселя.

# создаём массив значений
data = np.array([
    [1, 2, 3, 4, 5],
    [2, 3, 4, 5, 6],
    [3, 4, 5, 6, 7],
    [4, 5, 6, 7, 8],
    [5, 6, 7, 8, 9]
], dtype=rasterio.float32)

# задаём пространственную привязку
transform = rasterio.transform.from_origin(37.6, 55.8, 0.01, 0.01)

Посмотрим на результат:

rasterio.plot.show(data, transform=transform)
<Figure size 640x480 with 1 Axes>
<Axes: >

Мы рассмотрели базовую структуру растровых данных — их представление в виде числовой матрицы и параметры пространственной привязки.

Подробно с растровым форматом, его характеристиками, типами данных, способами чтения и методами анализа мы познакомимся в модуле № 5.

3. Итог

В этом разделе мы познакомились с двумя основными моделями пространственных данных — векторной и растровой.

  • Векторная модель описывает отдельные объекты через их геометрию и атрибуты.

  • Растровая модель представляет пространство в виде массива значений с пространственной привязкой.

Мы рассмотрели, какие библиотеки Python используются для работы с каждым форматом.

В следующих разделах подробнее разберём работу с векторными данными, а ближе к концу курса также поработаем с растровыми.

Использованная литература

Campbell, J. B., & Shin, M. (2011). Essentials of geographic information systems. Saylor Academy. https://saylordotorg.github.io/text_essentials-of-geographic-information-systems/