Включение методов класса обработчика для получения атрибутов экземпляра
Этот вопрос касается пакета 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, которое передает данные в базу данных.