GIS-LAB

Географические информационные системы и дистанционное зондирование

Конвертация из формата shape в OSM XML с переназначением полей с помощью ogr2osm

Описание работы с инструментом и исправленная его версия

Обсудить в форуме Комментариев — 8

Это статья описывает процесс перевода векторных данных в формате shape в формат OSM XML, пригодный для загрузки в базу данных проекта OpenStreetMap - открытой карты России и всего мира. Пожалуйста, перед загрузкой, убедитесь, что ваши данные лицензионно чисты, вы получили их по открытым источникам или источникам, для которых вы имеете право переводить в их векторную форму. Снимки геосервисов Google, Microsoft и подобных такими данными - не являются!

Оглавление

  1. Получение и установка
  2. Конвертация
  3. Переназначение полей и значений

1. Получение и установка

Скачать оригинальную версию ogr2osm можно здесь.

Если в shape-файлах есть атрибутика использующая кириллицу, лучше воспользоваться исправленной версией (исправления внесены Александром Дежиным, в комплект также входит пример исходных и результирующих данных и файл настроек правил переназначения полей и значений с помощью которого результат был получен).

Внимание: для правильного перевода атрибутов, DBF таблица должна иметь кодировку UTF8. Если таблица имеет другую кодировку, можно использовать конвертор, чтобы перевести ее в UTF8.

Для работы программы нужен GDAL/OGR, установить его можно с помощью OSGeo4W, для работы рекомендуются пакеты gdal16 или gdaldev.

Запускаем шелл OSGeo4W и в нем выполняем gdal16 или gdaldev, после этого можно конвертировать.

2. Конвертация

Запустить конвертор очень просто:

ogr2osm input.shp

Результатом конвертации будет файл с таким же именем и расширением osm. Система координат данных будет прочитана из файла PRJ, если его нет, подразумевается что данные в Lat/Long WGS84.

3. Переназначение полей и значений

Атрибутивная информация, содержащаяся в DBF файле, будучи очень полезной, часто не отвечает условиям обозначения объектов в OSM. Это статья не объясняет, как правильно описывать атрибуты, для этого служат специальные справочники. Здесь мы опишем как правильно настроить сам процесс и приведем примеры.

Для переназначения полей и значений необходимо иметь специальный файл, где эти переназначения описаны, он должен лежать в папке translations. Запускается конвертор в этом случае с ключем -t, за которым следует имя файла описания, без расширения py:

python ogr2osm.py -t vmap0 built-utf.shp

С помощью файла описания можно:

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

Файл описания является небольшой программой на языке Python, представляющей собой функцию, которой передаются атрибуты shape-файла (attrs):

# -*- coding: utf-8 -*-
def translateAttributes(attrs):
	if not attrs: return

Внимание: должна обязательно быть указана строка кодировки UTF8 и сам текст должен быть в этой же кодировке.

После этого, стандартного начала идет описание правил, оно обычно начинается с очистки поля деятельности:

tags = {}

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

Переименование поля

По умолчанию названия полей превращаются в названия тегов, чтобы этого избежать, можно их переименовывать. Этот пример показывает как поле CODE, содержащее некоторые значения, переименовывается при экспорте в тег cladr:code, содержащий собственно значения.

if attrs['CODE']:
		tags.update({'cladr:code':attrs['CODE']})

Переименование поля и замена значения по условию

Все создаваемые объекты для записей, у которых в поле TYPE в shape-файле записана буква 'с' должны получить тег cladr:suffix со значением 'Село':

if attrs['TYPE'] == 'с':
		tags.update({'cladr:suffix':'Село'})

Изменение строк

При изменении значений можно использовать любые функции питона. Это пример например переводит строку в нижний регистр и делает первую букву заглавной.

if attrs['NAM']:
		str = attrs['NAM'].lower().capitalize()
		tags.update({'name:en':str})

Теги/ключи попадают в результирующий файл неотсортированными по имени, но они будут автоматически отсортированы при работе с данными в JOSM.

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

Обсудить в форуме Комментариев — 8

Последнее обновление: September 09 2021

Дата создания: 13.06.2010
Автор(ы): Максим Дубинин