是否有一种方法来分析大面积(德国)的OMS(开放街道地图)pbf文件,而不会遇到内存问题?



我的任务是创建一个包含德国所有街道名称和城镇名称的数据库。由于这是一个很大的查询,我选择下载带有pythonpyrosm包的pbf文件。一旦我用OSM()解压缩数据并使用get_network(),我就会遇到内存问题,因为加载的DataFrame太大了。参见这里的道路(这适用于较小的区域,如德国的地区):

from pyrosm import get_data
from pyrosm import OSM
import pandas as pd
#Downloading the germany Data
de = get_data("germany")
#Turning it into an OSM object
de_osm = OSM(de)
#Extracting all driving objects, e.g. roads
roads = osm_object.get_network(network_type="driving")
#Extract all road names and turning it into a list
road_names = pd.Series(roads.name).values
road_names = list(road_names)

我想用生成器函数来解决这个问题,但我似乎无法像使用csv文件一样迭代数据。以下是我失败的尝试:

osm.object= (OSM(obj) for obj in de)
#Extracting all driving objects, e.g. roads
roads = osm_object.get_network(network_type="driving")

#Extract all road names and turning it into a list
road_names = pd.Series(roads.name).values
road_names = list(road_names)

替代:

def generator_osm():
for i in OSM(de).get_network(network_type="driving"):
yield i
res = generator_osm()
#Extract all road names and turning it into a list
road_names = list()
for i in res:
road_names = road_names.append(pd.Series(i.name).values)

提前感谢您提供的任何提示:)

建议使用pyosmium。它允许您轻松地分析osm文件,而不必处理几何图形。我尝试了pyrosm一点,我认为它试图在使用.get_network(…)时创建一个道路网络,如果你只想知道osm文件中道路对象的名称,这是不必要的。

我举了一个pyossmium文档的例子,并在一个简短的例子中应用它来收集道路名称:

import osmium
from collections import Counter
# handler that processes your file 
class RoadNameHandler(osmium.SimpleHandler):
def __init__(self):
super(RoadNameHandler, self).__init__()
self.road_names = []
def way(self, o):
if 'highway' in o.tags and 'name' in o.tags:
self.road_names.append(o.tags['name'])

# process file
h = RoadNameHandler()
h.apply_file("germany-latest.osm.pbf")
# some examples to print & count the names
print(h.road_names)
print(Counter(h.road_names))
print(len(h.road_names))

这个脚本占用不超过500- 600mb的内存,pbf文件必须从Geofabrik手动下载。

注::如果你想有一个不同的道路名称列表,你可以使用Counter()set代替listself.road_names

最新更新