Включите методы класса обработчика для получения атрибутов экземпляра - PullRequest
2 голосов
/ 04 октября 2019

Этот вопрос касается пакета 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 Ответ

0 голосов
/ 13 октября 2019

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

...