-
Notifications
You must be signed in to change notification settings - Fork 21
Gazetteer
Индекс в дальнейшем может быть использован как данные для GazetteerWeb так и любым другим способом. Сам индекс не содержит каких либо привязок для конкретной БД или системы поиска.
Подготовка индекса проходит в 4 этапа. Каждый этап запускается отдельно. Этапы запускаются отдельно т.к. на разных этапах сильно различается потребление памяти. Ява не освобождает однажды занятую под хип память, поэтому чтобы иметь возможность комбинировать емкие к памяти процессы и процессы не требующие памяти но занимающие время, каждый этап запускается как отдельное ява приложение.
Обычно процесс выглядит так:
Так-же опционально доступны:
Обратите внимание, что есть опции 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
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 - Фаил логирования
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
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 и на русский.
Доступны два формата выгрузок 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 объекта.
Возможен следующий сценарий использования, когда перед join вы получаете данные из нескольких источников. Тогда перед join необходимо будет запустить synchronize чтобы удалить дубликаты и использовать последние версии объектов.
Позволяет сгенерировать файл с изменениями для объектов. Чтобы в дальнейшем обновить индекс не целиком а по частям. Работает пока только для данных в формате json.
--out-file Куда аписать результат, по умолчанию результат выводится в STDOUT. Если файл оканчивается на gz или bz2 файл будет упакован соответсвующим архиватором.
--old условно старый набор данных --new условно новый набор данных
На выходе файл где каждая строчка начинается с символа O N + - или = отделенных пробелом от json объекта. При этом,
- '+' - объект был добавлен
- '-' - объект был удален
- 'O' - объект был изменен, файл --old содержит более новую версию
- 'N' - объект был изменен, файл --new содержит более новую версию