Включение методов класса обработчика для получения атрибутов экземпляра

Этот вопрос касается пакета pyosmiumконкретно. Мне просто было интересно, возможна ли следующая функция, и если нет, как ее можно реализовать.

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

В настоящее время мы можем сделать следующее:

class Handler(osmium.SimpleHandler):
    def __init__(self):
        osmium.SimpleHandler.__init__(self)
        self.edge_and_nodes = [] 
    def way(self, w): 
        self.edge_and_nodes.append({'edge_id': w.id, 
                                        'nodes': [w.nodes[i].ref for i in range(len(w.nodes))]})
h = Handler()
h.apply_file("test.osm.pbf")
print("Edges and their connected nodes: {}".format(h.edge_and_nodes))

Однако при работе с большими регионами это не масштабируется.

Мне нужен способ создания объекта словаря, который включает в себя WayIds и связанные с ними NodeIds (а также теги и т. Д.) Для каждого WayObject. Это возможно?

Я ищу что-то вроде этого:

class StreamHandler(osmium.SimpleHandler):
    def __init__(self):
        osmium.SimpleHandler.__init__(self)
        self.edge_and_nodes = [] 
    def way(self, w): 
        yield {'edge_id': w.id, 
               'nodes': [w.nodes[i].ref for i in range(len(w.nodes))]}
h = StreamHandler()
h.apply_file("test.osm.pbf")
for row in h.way(w): 
    print(row) 

Но я не знаю, как пройти w параметр (WayObject), поскольку это, похоже, решается внутренне с помощью apply_file() метод (и я не могу найти исходный код для этого метода).

Спасибо!

Изменить: исходный код можно найти здесь

1 ответ

Решение

Я нашел обходной путь. Используя pydriosm, я смог добавить несколько пользовательских генераторов, которые полностью анализируют и транслируют файлы *.osm.pbf на Python. Это идеально подходит для задания Spark или Dataflow, которое передает данные в базу данных.

Другие вопросы по тегам