Shapefile и другие векторные форматы

Урок про Shapefile — самый распространённый векторный формат на планете — и его наследников вроде GeoPackage.

Shapefile — векторный формат от компании Esri, хранящий один слой в виде набора из нескольких связанных файлов с общим именем.

Если вы скачаете границы регионов или дорожную сеть из официального источника, с большой вероятностью получите Shapefile. Формату больше тридцати лет, он морально устарел, но из-за инерции отрасли остаётся стандартом де-факто. Понимать его устройство нужно хотя бы чтобы не удивляться, почему «один слой» приехал кучей файлов.

Один слой — много файлов

Странность Shapefile: это не один файл, а комплект с одинаковым именем и разными расширениями. Минимально нужны три:

ФайлЧто хранит
.shpсама геометрия (координаты)
.shxиндекс для быстрого доступа к геометрии
.dbfтаблица атрибутов (dBASE)
.prjсистема координат (часто, но не всегда)

Если потерять .dbf, останется геометрия без свойств; без .prj неизвестно, в какой системе координаты. Поэтому Shapefile всегда передают целым комплектом, обычно в одном ZIP-архиве.

Ограничения, из-за которых от него уходят

  • Имена полей до 10 символов. Наследие dBASE: population_2024 обрежется до populatio.
  • Размер до 2 ГБ на каждый файл.
  • Только один тип геометрии в слое и нет нормальной поддержки Unicode в старых версиях — кириллица в атрибутах превращается в кашу при неверной кодировке.

Современная замена — GeoPackage (.gpkg): это один файл (внутри — база SQLite), без лимита на длину имён, с поддержкой нескольких слоёв и Unicode. По сути целая ГИС-база в одном файле, который удобно копировать.

Как работает под капотом

Связь геометрии (.shp) и атрибутов (.dbf) — позиционная: первая запись геометрии соответствует первой строке таблицы, вторая — второй и так далее. Никакого явного ключа нет, всё держится на порядке. Промышленный код читает Shapefile через библиотеку — geopandas одной строкой:

import geopandas as gpd

# Читаем .shp вместе со спутниками .dbf, .shx, .prj
gdf = gpd.read_file("regions.shp")
print(gdf.crs)          # система координат из .prj
print(gdf.head())       # геометрия + атрибуты как таблица
# Сохранить в современный формат:
gdf.to_file("regions.gpkg", driver="GPKG")

Под капотом geopandas обращается к движку GDAL/OGR — это «переводчик» между десятками форматов, ядро почти всех ГИС-инструментов.

Частые ошибки

  • Переслать только .shp. Без .dbf и .shx файл бесполезен; шлите весь комплект (ZIP).
  • Ожидать длинные имена полей. Планируйте короткие коды атрибутов или переходите на GeoPackage.
  • Игнорировать кодировку. Кириллица в .dbf требует указать encoding (часто cp1251), иначе текст «поедет».

Почему ветеран всё ещё жив

Логично спросить: если Shapefile так устарел, почему он до сих пор стандарт де-факто? Ответ — сетевой эффект и инерция огромной отрасли. За тридцать с лишним лет в этом формате накоплены гигантские архивы государственных и корпоративных данных, под него заточены пайплайны, его понимает буквально любая ГИС-программа на планете, и любой чиновник знает, что «прислать слой» значит прислать ZIP с .shp. Сменить такой стандарт — всё равно что заставить весь мир разом перейти на новую раскладку клавиатуры: технически давно пора, организационно почти невозможно. Поэтому Shapefile переживёт ещё не одно поколение более удачных форматов.

Практический вывод для инженера — уметь с ним работать, но не строить на нём новое. Принимая Shapefile, всегда проверяйте кодировку атрибутов (русский текст в старом .dbf часто в cp1251 и без явного указания превращается в «кракозябры»), наличие .prj с системой координат и целостность комплекта файлов. А вот для собственного хранения и обмена внутри проекта берите GeoPackage или, для веба, GeoJSON — так вы избежите обрезанных имён полей, лимита в 2 гигабайта и вечной возни с кодировками. Shapefile — это формат, который вы читаете чужой, но не пишете свой.

Итог

  • Shapefile — один слой в комплекте файлов (.shp/.shx/.dbf/.prj).
  • Связь геометрии и атрибутов — по порядку записей, без явного ключа.
  • Ограничения: имена до 10 символов, 2 ГБ, один тип геометрии.
  • Современная замена — GeoPackage (.gpkg): один файл, без этих лимитов.
Проверьте себя
1. Почему один слой Shapefile приезжает несколькими файлами?
AЭто ошибка экспорта
BГеометрия (.shp), индекс (.shx) и атрибуты (.dbf) лежат раздельно
CКаждый файл — отдельный объект
DДля красоты
2. Какое ограничение Shapefile часто мешает на практике?
AНельзя хранить точки
BИмена полей не длиннее 10 символов
CРаботает только в одной стране
DНе хранит координаты
3. Что предлагают как современную замену Shapefile?
AGeoPackage (.gpkg) — один файл-база SQLite
BФайл .txt
CНовый Shapefile
DPDF