Python OSMnx等时线

Python OSMnx等时线,python,pandas,geopandas,osmnx,Python,Pandas,Geopandas,Osmnx,我有大量的位置数据(10k行)(lat、lon),我想用OSMnx从每个点开始计算10分钟的行走等时线。(我尝试使用openrouteservice,但有一些限制)。 我试着用这个例子: 将熊猫作为pd导入 作为gpd导入geopandas 从shapely.geometry导入点,多边形 将networkx导入为nx 将osmnx作为ox导入 ox.config(log\u console=True,use\u cache=True) def get_等时线(lon、lat、行走时间=10,速

我有大量的位置数据(10k行)(lat、lon),我想用OSMnx从每个点开始计算10分钟的行走等时线。(我尝试使用openrouteservice,但有一些限制)。 我试着用这个例子:

将熊猫作为pd导入
作为gpd导入geopandas
从shapely.geometry导入点,多边形
将networkx导入为nx
将osmnx作为ox导入
ox.config(log\u console=True,use\u cache=True)
def get_等时线(lon、lat、行走时间=10,速度=4.5):
loc=(横向,纵向)
G=ox.graph\u from\u point(loc,simplify=True,network\u type='walk')
gdf_节点=ox.graph_to_gdfs(G,边=False)
x、 y=gdf_节点['geometry'].一元联合.centroid.xy
中心节点=ox.get\u最近节点(G,(y[0],x[0]))
米/分钟=速度*1000/60公里/小时至米/分钟
对于u、v、k,G边中的数据(数据=真,关键点=真):
数据['time']=数据['length']/每分钟米
子图=nx.ego\u图(G,中心节点,半径=行走时间,距离=时间)
node_points=[节点的点(数据['x'],数据['y']),子图中的数据。节点(数据=真)]
polys=gpd.GeoSeries(节点点)。一元联合。凸包
返回多边形
然后将其应用于我的大型熊猫数据帧:

df.apply(lambda x: get_isochrone(x.lon, x.lat), axis=1)
但是花了这么多时间。100行大约是3分钟的运行时间。有没有其他方法、包装来实现这个目标?有合理的运行时间吗

最后一个问题,OSMnx请求的限制是什么,特别是对于大数据?
谢谢

这将是一个固有的缓慢过程。如果您有10000个位置,并且它们彼此相距很远,那么您需要下载10000个本地街道网络并对其建模,以计算每个点周围的可达性。这意味着10000次服务器调用、数据下载、图形构建和拓扑清理等

因此,在3分钟内完成100行对我来说似乎相当快,特别是考虑到这意味着您可以在大约300分钟(即5小时)内完成所有10000行的估计时间。只要在睡觉前开始这个过程,当你醒来的时候就可以了。这假设这是一个一次性的计算,不需要经常重新计算

另一种选择是将其并行化,将其划分为10个容器或流程,每个容器或流程处理1000个位置。根据您估计的时间,这将在约30分钟内完成

最后一个问题,OSMnx请求的限制是什么,特别是对于大数据


使用OSMnx处理大规模网络模型的限制是计算机上的RAM数量。

可以做的一个改进是尝试避免多次下载图形边缘。如果您的
df
中有许多点的距离比步行10分钟还要近,那么您会一次又一次地丢失大量下载图形数据的时间。一种解决方案可能是在
get_isochrone
之外(例如使用
osmnx.graph.graph\u from_polygon
)将数据集封套的整个图形下载到内存中(如果合适的话)@LuisBlanche这就是问题所在。我的(纬度、经度)点相距很远。从<多边形> <代码>中考虑<代码>图形,将考虑单个中心节点。我认为您需要理解<代码> GETSISOISORNON/<代码中的时间。为此,可以使用
cProfile.run(df.apply(lambda x:get_等时线(x.lon,x.lat),axis=1))
Yes。我昨天运行了这个程序,但是遇到了一个API越界错误。但是,是的,我将再次这样做,希望在这个过程中不会遇到这个错误。