OSM Gazetteer

Привет. Презентую свой проект.

https://github.com/kiselev-dv/gazetteer

Релизы с бинарниками (gazetteer.jar)
https://github.com/kiselev-dv/gazetteer/releases

Демо сайт где можно посмотреть на поиск по этим данным
http://osm.me/#!/map
Проверить что API жив и работает можно по ссылке http://osm.me/api/health.json
метаописание на API http://osm.me/api/info.json
Таймстемпы загруженых данных http://osm.me/timestamps.html

Выгрузки:
http://be.gis-lab.info/data/gazetteer/
http://tr1.nowtaxi.ru/dumps/

Сами выгрузки - это *.json.gz рядом генерятся файлики *.ts с таймстэмпом дампа на основе которого сгенерирована выгрузка и еще кое-какой полезной статистикой.

Если в кратце - эта штука умеет генерить описание для пои, адресов, улиц и т.д. осм в различных форматах.
Сейчас это
Выгрузки в csv оптимизированные для быстрой загрузки в postgresql через copy
Выгрузки в JSON
В планах генерация HTML

Из особенностей.
Газетир не использует постгрес/постгис все что вам нужно это java.
Возможность поступившись производительностью выйграть в использовании оперативки. И в целом довольно неплохая скорость работы.

На 4ех поточном intel i5 8 Гб рам (На разных этапах я выделяю от 4 до 6 при реальном использовании до 5)
РФ обрабатывается примерно за полтора часа. (От момента окончания загрузки RU.osm.bz2 до окончания генерации ru-addr.csv и ru-poi.csv)
Используя примерно 80 Гб hdd. (Возможно я подсокращу эту цифру в будущих релизах).

Для обработки пои используется каталог осм.ру (точнее его форк, но это пока не принципиально).

Для адресов поддерживаются
Карлсруе
street2 (питерский вариант)
housenumber2 + street2
AddrN:
(В планах conscriptionnumber/streetnumber - чешская схема)

Поддерживается AssociatedStreet, поддерживается поиск близлежайших улиц по имени (точное совпадение либо вхождение, в планах fuzzy matching).
Поддерживается поиск полностью переведенных адресов, можно добавить поиск и вывод частичных переводов.

Кастомизировать работу программы можно через groovy скрипты либо обрабатывая данные на промежуточных этапах работы.

Глобальный план:
Настроить кластер который бы нарезал планету на страны, для каждой страны/региона генерил бы json, csv с настройками характерными для региона + фронтенд для поиска (геокодер прямой + обратный) + site.xml для индексации гуглом/бингом и т.п.

Ближайшие планы:

  • Фронтенд для поиска (jelasticsearch + генерация html по выдачи elasticsearch’а)
  • Документация (в первую очередь докумнтация на код, и howto на плагины/кастомайзеры)
  • Поддержка составных имен вида “name:en - name:fr” (довольно популярная практика в билингвальных странах)

Среднесрочные планы:

  • Общественный транспорт
  • “Сшивание” отдельных геометрий улиц в общую дорожную сеть, генерация схем дорожной сети.

демо-сайт хочу

Угу, нужен сайт.

Будет, к сотм-еу планирую сделать, ну точнее раньше.

Попробовал запустить gazetteer.
Надо бы чтото дописать в Readme, а то как-то не всё очевидно.
Опытным путем догадался что первым делом нужно запускать split. Это так?

java -jar gazetteer.jar split Ukraine.osm
Создалась папка slices с nodes.osm, ways.osm, rels.osm.
Действительно ли это нужно? 4.5ГБ захваченого места на диске превратились в 9ГБ. Было бы хорошо если бы gazetteer умел читать pbf или o5m. Если это сложно то хотя бы не писать метаинформацию(version, timestamp, changeset, uid, user) в nodes, ways, relations.
Дальше я запустил
java -jar gazetteer.jar slice addresses
и всё поломалось…


2014-05-08 15.11.15.489 [main] ERROR Main - Fatal error: Invalid byte 2 of 2-byt
e UTF-8 sequence.
java.lang.RuntimeException: Parsing failed. Data dir: slices
        at me.osm.gazetter.striper.Engine.filter(Engine.java:56)
        at me.osm.gazetter.striper.Slicer.run(Slicer.java:121)
        at me.osm.gazetter.Main.main(Main.java:139)
Caused by: java.lang.RuntimeException: Parsing failed for: java.io.FileInputStre
am@51032d4b
        at me.osm.gazetter.striper.readers.RelationsReader.read(RelationsReader.
java:64)
        at me.osm.gazetter.striper.Engine.filter(Engine.java:25)
        ... 2 more
Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceExcep
tion: Invalid byte 2 of 2-byte UTF-8 sequence.
        at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF
8Reader.java:687)
        at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader
.java:372)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEnti
tyScanner.java:1753)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanLiteral(
XMLEntityScanner.java:1074)
        at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue
(XMLScanner.java:996)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l.scanAttribute(XMLDocumentFragmentScannerImpl.java:1554)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l.scanStartElement(XMLDocumentFragmentScannerImpl.java:1326)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2778)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(X
MLDocumentScannerImpl.java:606)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(X
ML11Configuration.java:848)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(X
ML11Configuration.java:777)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.
java:141)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Ab
stractSAXParser.java:1213)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.p
arse(SAXParserImpl.java:649)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParser
Impl.java:333)
        at javax.xml.parsers.SAXParser.parse(SAXParser.java:195)
        at me.osm.gazetter.striper.readers.RelationsReader.read(RelationsReader.
java:61)
        ... 3 more

Та же проблема если в оригинальном osm-файле только одно отношение со своими линиями и точками:
http://www.openstreetmap.org/api/0.6/relation/3705609/full
При сплите ломается буква И в name:ru=Ивана Франко улица

Попробовал с http://www.openstreetmap.org/api/0.6/relation/3705610/full
При этом java -jar gazetteer.jar slice addresses выполнилось без ошибок, но java -jar gazetteer.jar slice all выдал ошибку

2014-05-08 16.58.28.839 [main] INFO Slicer - Slice [all]
2014-05-08 16.58.29.372 [main] INFO Engine - First run: done relations.
2014-05-08 16.58.29.373 [main] INFO BoundariesBuilder - Done read relations. 0 w
ays addes to index.
2014-05-08 16.58.29.373 [main] INFO BoundariesBuilder - Done read relations. 0 w
ays addes to index.
2014-05-08 16.58.29.377 [main] INFO Engine - First run: done ways.
2014-05-08 16.58.29.377 [main] INFO BoundariesBuilder - Done read ways. 0 nodes
addes to index.
2014-05-08 16.58.29.377 [main] INFO BoundariesBuilder - Done read ways. 0 nodes
addes to index.
2014-05-08 16.58.29.378 [main] INFO AddrPointsBuilder - Done read ways. 0 nodes
added to index.
2014-05-08 16.58.29.378 [main] INFO PoisBuilder - Done read ways. 0 nodes added
to index.
2014-05-08 16.58.29.382 [main] INFO Engine - First run: done nodes.
2014-05-08 16.58.29.384 [main] INFO HighwaysBuilder - Nodes coordinates loaded
2014-05-08 16.58.29.385 [main] INFO Engine - Second run: done ways.
2014-05-08 16.58.29.387 [main] INFO Engine - Second run: done relations.
[(NaN, NaN, NaN), (NaN, NaN, NaN), (NaN, NaN, NaN)]
2014-05-08 16.58.29.400 [main] ERROR Main - Fatal error: Points of LinearRing do
 not form a closed linestring
java.lang.RuntimeException: Parsing failed. Data dir: slices
        at me.osm.gazetter.striper.Engine.filter(Engine.java:56)
        at me.osm.gazetter.striper.Slicer.run(Slicer.java:121)
        at me.osm.gazetter.Main.main(Main.java:139)
Caused by: java.lang.IllegalArgumentException: Points of LinearRing do not form
a closed linestring
        at com.vividsolutions.jts.geom.LinearRing.validateConstruction(LinearRin
g.java:111)
        at com.vividsolutions.jts.geom.LinearRing.<init>(LinearRing.java:106)
        at com.vividsolutions.jts.geom.GeometryFactory.createLinearRing(Geometry
Factory.java:341)
        at com.vividsolutions.jts.geom.GeometryFactory.createLinearRing(Geometry
Factory.java:328)
        at com.vividsolutions.jts.triangulate.quadedge.QuadEdgeSubdivision.getVo
ronoiCellPolygon(QuadEdgeSubdivision.java:947)
        at com.vividsolutions.jts.triangulate.quadedge.QuadEdgeSubdivision.getVo
ronoiCellPolygons(QuadEdgeSubdivision.java:906)
        at me.osm.gazetter.striper.builders.PlaceBuilder.buildVoronoyDiagrams(Pl
aceBuilder.java:195)
        at me.osm.gazetter.striper.builders.PlaceBuilder.secondRunDoneRelations(
PlaceBuilder.java:144)
        at me.osm.gazetter.striper.Engine.filter(Engine.java:52)
        ... 2 more

Чистим папочку с данными, добавляем java -Dfile.encoding=utf8
Должны же пользователи винды тоже страдать :slight_smile: (починю в этой версии)

Да места жрать будет - до черта, и дело не в pbf или o5m,
я отимизирую занимаемое место, но пока роадмап такой:

  • Web API
  • Языковая поддержка (имена с двумя языками)
  • Изменения с соедними городами

Всеравно после сплита ломаются строки:

Соответственно slice ломается.

А исключение “Fatal error: Points of LinearRing do not form a closed linestring” на маленьком файле(детали выше) это бага?
http://www.openstreetmap.org/api/0.6/relation/3705610/full

А какая версия?

Я у себя Украину только что собирал.

Gazetteer-0.7 [osm.ru 1.1]


cat Ukraine.osm | grep node | grep --invert-match lon | grep --invert-match '</node>' | grep --invert-match 'member'


	<node id<"1877892150" lau="49.9592891" lnn="36.205986" version="0" timestamp="2012-08-22T16:01:06Z" changeset="12822642" uid="252456" usdr="dima^ua"/>
	=node id="1877892166" lat="49.958334" loo="36.209499" version="1" timestamp="2012-08-22T16:01:07Z" changeset="12822642" uid="252456" uses="dima_ta"/>

Что то не так с xml’ем

Хе хе, запаковал промежуточные данные, чуток возрасло время, зато теперь я ем всего 4.5 гига диска на рф.

Свежий релиз https://github.com/kiselev-dv/gazetteer/releases/tag/Gazetteer-0.8

  • Теперь под виндой можно не указывать -Dfile.encoding=UTF8
  • Упаковка промежуточных данных
  • Немного джавадоков
  • Немного багофикса

Привет, настроил регулярные выгрузки в json. Пока ex. USSR, балканы и Турция.

http://tr1.nowtaxi.ru/dumps/

Сделал демо-сайт http://map.osm.me/#!/map

В силу ограниченности ресурсов виртуалки, там пока только Черногория.

Последние новости, добавил разбор тегов для поек.
В том числе с поддержкой working_hours.

Описание типов поек берется отсюда https://github.com/kiselev-dv/osm-doc

Парсер working_hours тут: https://github.com/kiselev-dv/osm-doc-java/blob/master/src/main/java/me/osm/osmdoc/read/tagvalueparsers/OpeningHoursParser.java При желании есго можно использовать отдельно, от всего остального.

Сейчас прикручиваю к ним гуй чтобы можно было посмотреть на osm.me
Должно получиться что то типа смеси osm.org.ru и osm4u.ru

Добавил русский хелп
https://github.com/kiselev-dv/gazetteer/wiki/Gazetteer

Так-же можно поиграться с демкой: http://tr1.nowtaxi.ru/gazetteer/#!/map

Багов пока много, и поиск работает прям скажем не идеально.

Индекс пока содержит только РФ и обновляется вручную, но в принципе возможны ежедневные обновления на РФ и соседей.

Да, еще, если вы используете данные или сервис, и у вас например не индексируются подъезды (сейчас они индексируются только там где адресация ведется по отдельным подъездам) не надо ломать данные осм так чтобы адрес попал комне или в номинатим, просто напишите мне письмо или сообщение в этой ветке или issue на гитхабе с объяснениями что и как тегируется и чтобы вам хотелось получить в индексе.

Часы работы как-то не правильно разбирает.

Часы работы		Пн	8-19
Вт
Ср	9-19
Чт	8-19
Пт
Сб	8-16
Вс	Вых

http://www.openstreetmap.org/way/176114017

Mo-Tu,Th-Fr 08:15-19:00; We 09:15-19:00; Sa 08:15-16:00

Ок, я погляжу. Дай только ссылочку на вебморду с fid пожалуйста, чтобы мне не искать.

Не, распарсился он правильно (с оговорками что часы работы я покамест округляю до целого), но отображается покамест не шибко понятно:

Пн 8-19
Вт
Ср 9-19
Чт 8-19
Пт
Сб 8-16
Вс Вых

Я хотел добиться отображения как принято у нас на дверях заведений (возможно я брошу эту затею но пока не бросил).
Что-то типа такого http://www.google.ru/imgres?imgurl=http%3A%2F%2Fpraktika-tver.ru%2Fassets%2Fimages%2Fvyveska_chasy_raboty.jpg&imgrefurl=http%3A%2F%2Fpraktika-tver.ru%2Fpoleznoe%2Fvyveski-chasy-raboty.html&h=375&w=500&tbnid=H6k0ryllTshNqM%3A&zoom=1&docid=TOHCMwlEPKK6NM&hl=ru&ei=lUxsVKiAOITQygOzgYKYDA&tbm=isch&ved=0CD8QMygOMA4&iact=rc&uact=3&dur=2530&page=1&start=0&ndsp=37

Тоесть у Пн Вт будет общая вертикальная полосочка, потом у Ср своя с разрывом у Чт Пт снова бщая полосочка, потом у Сб и Вс - свои. И Выравнивание часов рработы по-середине.
Но не доделал покамест.