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): один файл, без этих лимитов.