Привет, Хабр! Я историк, работаю над историко-географическими базами данных в российском генеалогическом сервисе familio.org. В этой статье расскажу, как мы сделали карту исторических промыслов Костромской губернии для фестиваля семейной истории в Кинешме. Надеюсь, что материал будет интересен не только любителям исторической географии, но и тем, кто интересуется визуализацией своих данных на карте.
Наша команда собирает, обрабатывает и публикует в электронном виде исторические данные, которые полезны для генеалогического поиска. Особое место среди них занимают списки населённых мест (прим. «населённое место» — это то же самое, что и «населённый пункт», но до 1920-х годов преимущественно использовался первый термин). Эти списки в большинстве случаев издавались в губерниях, из-за чего у них значительно варьируется формат и содержимое.
К примеру, есть замечательный список населённых мест по Витебской губернии 1906 года, в котором для каждого населённого пункта указано к какому церковному приходу тот относился — а это ключевая информация для генеалогического поиска, т.к. в церквях велись все записи о рождениях, браках и смертях.
Во многих случаях списки населённых мест составлялись по результатам земских социально-экономических исследований (прим. земство — дореволюционный орган местного самоуправления). К одному из таких изданий относится и список населённых мест Костромской губернии 1907 года, в нём содержатся сведения о местных промыслах. Оригинал справочника, вернее, его скан, с которого начинается вся работа, выглядит следующим образом.
Этот текст из справочника мы распознаём в формате таблицы, приводим к единому формату нашей базы данных, а потом связываем с существующей базой населённых пунктов, в основу которой положены современные реестры ОКТМО и АГКГН (они покрывают примерно до двух третей от общего количества исторически существовавших на территории России населённых пунктов в течение последних двух-трёх веков). Связывание записей с н/п — процедура довольно трудоёмкая, т.к. многие населённые пункты, упоминаемые в дореволюционных документах, ныне уже не существуют, но используя данные о расстояниях (прим. одна из наиболее часто встречающихся характеристик в подобных изданиях — расстояние от деревни до города, волостного правления и т.д.) большую часть подобных лакун удаётся реконструировать и нанести отсутствующие метки на карту. Этим у нас занимаются специально подготовленные люди, которые умеют работать со старыми картами, например, с ресурсом etomesto.ru. Сильно помогают и деревни с уникальными названиями, например, Выхино в Российской империи было только одно.
Теперь у нас есть данные, с которыми можно работать в табличных, текстовых и ГИС-редакторах. Для начала просто устроим перекрёстную проверку и посмотрим насколько хорошо были привязаны деревни к базе населённых пунктов. Для этого открываем QGIS, добавляем osm-подложку, и загружаем через CTRL+SHIFT+T единую таблицу с координатами и вышестоящими уровнями. Потом кликаем правой мышкой на слой и отрываем Properties этого слоя, где указываем Symbology как Categorized, где последовательно выбираем разные атрибуты (уезд, волость, дистанцию и прочее).
Теперь нужно стандартизировать промыслы. Костромская губерния наряду с соседней Ярославской была одной из самых развитых губерний в плане промыслов, огромное количество местных крестьян уходило на заработки в столицу и другие города. Сводная таблица показывает, что уникальных значений в колонке с промыслами под 2000 объектов, причем во многих случаях сокращения неодинаковые и зачастую в ячейке перечислено несколько промыслов таким образом. Нам, конечно, нужен только самый популярный, но терять информацию жалко, поэтому надо развернуть все промыслы построчно. Делается это следующим образом: заменяем запятую с пробелом на разделитель "|", притягиваем через такой же разделитель уникальный идентификатор записи (у нас в этом качестве используется uuid-4), а после в текстовом редакторе при помощи регулярных выражений заменяем все разделители на перенос строки. Далее в экселе в каждой строке формулой дублируем идентификаторы до следующего встречного идентификатора.
Теперь предстоит унифицировать эти значения, и когда они все развёрнуты построчно, то сделать это уже гораздо проще. Сортируем по алфавиту получившиеся уникальные значения и приводим к единому значению («пл.», «плот.», «плотн.» → «плотники»). Перед сортировкой не забываем сохранить оригинальный порядок в отдельную табличку, так как нам интересен именно самый распространенный промысел, т. е. первый в списке для каждой деревни. В результате всех этих операций получается набор в виде 11 607 населённых пунктов с координатами, на которые приходится 111 доминирующих там промыслов: от ассенизаторов до штукатуров.
Карта уже становится достаточно интересной: видны большие кластеры фабричных рабочих на юго-западе (современная Ивановская область), маляров в окрестностях Галича, а также портных около Неи. Но для удобства восприятия хорошо бы как-то закрасить и объединить промежуточные области. Для этого отлично подходит диаграмма Вороного, её можно найти в QGIS в разделе Vector → Geometry Tools → Voronoi Polygons. Получившейся диаграмме присваиваем атрибуты деревень через Vector → Data Management Tools → Join Attributes by Location.
Обрезаем получившийся результат через Vector → Geoprocessing Tools → Intersection по примерной границе Костромской губернии.
А после объединяем отдельные полигоны через Vector → Geoprocessing Tools → Dissolve, указав в качестве критерия поле с промыслом. При использовании диаграммы Вороного часто получаются довольно «рваные» границы с резкими углами, поэтому мы генерируем гексагональную сетку через Vector → Research Tools → Create Grid с шагом в километр, а потом присваиваем ей атрибуты с диаграммы Вороного через Vector → Data Management Tools → Join Attributes by Location.
Получившуюся карту уже вполне можно показывать, но этот момент до фестиваля остаётся всего-ничего времени, а хочется как-нибудь быстро сделать доступную онлайн карту, чтобы слушатели могли прямо во время презентации её посмотреть и приблизить интересующие их места. Вариантов тут не очень много, основных два: Google карты и Яндекс карты. Яндекс, к сожалению, отпадает сразу, т.к. такие большие объекты импортировать нельзя.
Остаются Google карты, в которых также выяснятся, что импортировать kml файл размером больше 5 МБ нельзя.
А у нас как раз получилась карта немногим больше 5 МБ, обидно! Начинаем смотреть начинку kml файла в поисках того, что можно пустить под нож и обнаруживаем излишне длинные координаты в 12–13 символов после запятой (в нашем случае 5 символов после запятой хватит с запасом). Возвращаемся в QGIS и экспортируем kml ещё раз с ограничением символов после запятой. Получается 3 МБ, файл успешно импортируется, и после небольшой раскраски карта наконец готова!
Теперь проделанной работой можно любоваться. Некоторые избранные места на карте:
Думаю, что читатель, дошедший до этого места, и сам найдёт на карте интересные места.
Спасибо за чтение!