Skip to content
kiselev-dv edited this page Nov 19, 2014 · 4 revisions

Gazetteer - консольная утилита для генерации адресного индекса по данным OpenStreetMap.

Индекс в дальнейшем может быть использован как данные для GazetteerWeb так и любым другим способом. Сам индекс не содержит каких либо привязок для конкретной БД или системы поиска.

Использование

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

Типичный workflow

Обычно процесс выглядит так:

  1. split
  2. slice
  3. join
  4. out

Так-же опционально доступны:

  1. synchronize
  2. diff

Указание опций:

Обратите внимание, что есть опции java машины, они задаются до имени jar файла опции всего приложения в целом, они задаются до имени команды опции конкретной команды, они задаются после имени команды

например

java -Xmx6g -Dfile.encoding=utf8 -jar gazetteer.jar --data-dir /tmp/gazetteer slice poi

где -Xmx6g и -Dfile.encoding=utf8 - опции ява машины, --data-dir /tmp/gazetteer - опция всего приложения в целом. slice - имя команды, poi - позиционный аргумент команды slice

split

java -jar gazetteer.jar split /path/to/Country.osm.bz2

На данном этапе в рабочей директории будет создана папка data с 3мя файлами nodes.osm.gz ways.osm.gz rels.osm.gz

Для производительности важна скорость чтени/записи в эту папку. Путь до папки можно поменять опцией --data-dir

java -jar gazetteer.jar --data-dir /tmp/gazetteer split /path/to/Country.osm.bz2

По умолчанию временные файлы сжимаются gzip. Чтобы отключить компрессию используйте ключ --no-compress

java -jar gazetteer.jar --data-dir /tmp/gazetteer --no-compress split /path/to/Country.osm.bz2

Возможно использование как часть конвеера:

wget -O - http://be.gis-lab.info/data/osm_dump/dump/latest/RU.osm.bz2 gazetteer.jar split - bz2

pbf пока не поддерживается.

Также доступны опции:

--threads - ограничение числа потоков используемых при параллельных вычислениях

--log-level - Уровень логирования

--log-file - Фаил логирования

slice

java -Xmx6g -jar gazetteer.jar slice

Если до этого вы использовали отличную от умолчальной директорию для хранения данных:

java -Xmx6g -jar gazetteer.jar --data-dir /tmp/gazetteer slice

На данном этапе данные осм парсятся, собирается геометрия полигонов и веев. Происходит разбор ПОИ. Потребление памяти можно сократить разбирая данные осм поотдельности для разных типов объектов.

java -Xmx1g -jar gazetteer.jar slice boundaries places
java -Xmx1g -jar gazetteer.jar slice highways
java -Xmx1g -jar gazetteer.jar slice addresses
java -Xmx1g -jar gazetteer.jar slice pois

slice boundaries places - не опечатка, можно задать обработку нскольких типов.

В результате будут созданы файлы stripe####.gjson.gz (или stripe####.gjson если использовалась опция --no-compress). Каждая строка файла - 1 json объект. Данные можно посмотреть и проверить при помощи (z)grep.

Доступные опции:

--poi-catalog Путь до каталога osm-doc - необходим для разбора ПОИ. По умолчанию будет использованна версия каталога "зашитая" в osm-doc-java

java -Xmx6g -jar gazetteer.jar --data-dir /tmp/gazetteer slice --poi-catalog /home/osm/osm-doc/catalog

--excclude-poi-branch Исключить при разборе пои тот или иной тип пои.

Например osm-ru:transport где osm-ru - это имя иерархии osm-doc а transport имя ветки каталога либо имя класса пои. Для имени класса пои, иерархию можно не указывать. Можно указать несколько исключаемых веток/классов.

java -Xmx6g -jar gazetteer.jar --data-dir /tmp/gazetteer slice \
--poi-catalog /home/osm/osm-doc/catalog \
--excclude-poi-branch osm-ru:transport traffic_lights

--named-poi-branch Указанные здесь классы пои будут проиндексированы только в том случае если для них заполнен тег name.

--drop исключить объекты по osm id. Например --drop r123 w1234 n21345

--boundaries-fallback-file Путь до файла, содержащего сохраненную копию границ. Например (см join) вы фильтруете объекты по попаданию в границу государства --check-boundaries r60189 при этом, если на этапе slice граница не была разобрана или содержала неисправимые ошибки геометрии и не попала в индекс, после этапа join набор данных будет пуст. При использовании boundaries-fallback-file границы которые не удалось построить будут проверены в этом файле. Сам фаил - это простой csv с табуляцией в качестве разделителя, где первая колонка это id, например r60189 вторая колонка - timestamp добавления границы в фаил, третья - геометрия границы в формате WKT. Данные файла обновляются автоматически последней удачно-собранной версией границы.

--boundaries-fallback-types вы можете ограничить набор сохраняемых границ, указав виды границ, например boundary:2 boundary:4

join

java -Xmx6g -jar gazetteer.jar join

На данном этапе для каждой адресной точки вычисляются границы в которых она содержится. Вычисляются соседи и прочие геометрические отношения. Форматируются алреса объектов.

Доступные опции:

--common Путь до файла с json объектами которые будут добавлены всем адресным точкам как часть адреса. Например, если вы обрабатываете Росссию по областям но хотите сохранить адресные данные самой РФ и добавить их в адреса.

--addr-order {HN_STREET_CITY,STREET_HN_CITY,CITY_STREET_HN} В каком порядке форматируются адреса. От большегок меньшему (Россия, восточная европа) От меньшего к большему (Америка, западная европа).

--addr-parser Путь до .groovy файла через который можно переопределить парсер адресов.

--check-boundaries Отфильтровать объекты по попаданию в границу. Например --check-boundaries r12345 w123456

--skip-in-text Пропускать в полных текстах адресов некоторый уровень адреса. --skip-in-text place:town boundary:6

--find-langs Добавлять к адресу полные переводы. Под полным переводом понимается адрес, все уровни которого содержат перевод на определенный язык. Например у всех уровней адреса (кроме addr:housenumber) есть name и name:ru в этом случае в индексе будут содержаться переводы адреса для оригинального name и на русский.

out

Доступны два формата выгрузок json и csv.

json:

java -Xmx6g -jar gazetteer.jar out-gazetteer

Доступные опции:

--out-file Куда аписать результат, по умолчанию результат выводится в STDOUT. Если файл оканчивается на gz или bz2 файл будет упакован соответсвующим архиватором.

--poi-catalog Путь до каталога osm-doc

--local-admin --locality --neighborhood Какие уровни границ использовать в качестве local-admin (уровень ниже штата/области но выше города), городов и районов города. ГРаницы могут пересекаться. Например:

--locality boundary:8 place:city place:town place:village place:town
--neighborhood  boundary:9 place:town place:village place:town

При этом если для place:village не заполнен locality (населенный пункт) то объект попадет на уровень locality если locality уже соержит более крупный place:city то объект с place:village будет помещен на уровень района города.

--all-names Добавить в выгрузку хеш с именами объектов.

Схему данных файла json см тут

Схема не содержит more_tags - разобранные согласно каталогу дополнительные атрибуты пои.


csv:

java -Xmx6g -jar gazetteer.jar out-csv

Опции:

--types {address,street,place,poi,boundaries} какие типы объектов выводить. Можно указать несколько типов объектов и выгрузить их в общий csv.

--columns Список колонок. Колонки могут быть раздеоены пробелом и/или запятой. Колонки также могут быть сгруппированы при помощи квадратных скобок [] при этом в результат будет добавлена первая совпавшая колонка.

--columns id uuid osm-id [name:ru name] geometry-full tags:hstore

--out-file Куда аписать результат, по умолчанию результат выводится в STDOUT. Если файл оканчивается на gz или bz2 файл будет упакован соответсвующим архиватором.

--poi-catalog Путь до каталога osm-doc

--line-handler Путь до .groovy файла с классом LineHandler позволяющим произвольно обработать строку выводимого в csv объекта.

synchronize

Возможен следующий сценарий использования, когда перед join вы получаете данные из нескольких источников. Тогда перед join необходимо будет запустить synchronize чтобы удалить дубликаты и использовать последние версии объектов.

diff

Позволяет сгенерировать файл с изменениями для объектов. Чтобы в дальнейшем обновить индекс не целиком а по частям. Работает пока только для данных в формате json.

--out-file Куда аписать результат, по умолчанию результат выводится в STDOUT. Если файл оканчивается на gz или bz2 файл будет упакован соответсвующим архиватором.

--old условно старый набор данных --new условно новый набор данных

На выходе файл где каждая строчка начинается с символа O N + - или = отделенных пробелом от json объекта. При этом,

  • '+' - объект был добавлен
  • '-' - объект был удален
  • 'O' - объект был изменен, файл --old содержит более новую версию
  • 'N' - объект был изменен, файл --new содержит более новую версию