Понадобилось конвертировать osm в Json и сделать фильтр по тегам, написал вот такой простой скрипт, который можно использовать по своему усмотрению:
https://bitbucket.org/siberiano/osm2python
В репозитории есть пример, как конвертировать файл из .osm.bz2 в .json.bz2, osm2json. Вызывать так:
$ python osm2json.py myfile.osm.bz2 myfile.json.bz2
Размеры файлов на входе и выходе примерно равны.
Пример программного использования: открываем файл и пишем обработчик элементов (элементы - корневые, то есть точки отдельно, пути отдельно, отношения. Остальные - теги, члены отношений, точки путей - будут внутри выданных элементов.)
import bz2
import urllib
import osm2py
# откроем потоком и будем потоково распаковывать планету
infile = bz2.BZ2Decompressor(urllib.urlopen('http://planet.openstreetmap.org/planet-latest.osm.bz2'))
# нужны пути, чтобы в них был тег highway=*
def callback(element):
if element.get('children') and element['name'] == 'way': # see if the element is a highway
for child in element.get('children'):
if any([t.get('k') == 'highway' for t in child.get('children')]):
print element # элемент печатаем в stdout
osm2py.parse_file(infile, callback)
Зачем это нужно? JSON удобнее парсить, чем XML, можно хранить в БД NoSQL, можно читать и править в редакторе. Можно импортировать в Питон или в Яваскрипт (а не-броузерный яваскрипт уже распространяется!)
TODO:
- комментарии
- рефакторить библиотеку, чтобы не переписывать global output_callback (нужен совет)