【问题标题】:Extract constrained polygon using OSMnx使用 OSMnx 提取约束多边形
【发布时间】:2020-04-04 19:41:57
【问题描述】:

我正在使用 OSMnx 包来解决以下任务: - 地图上有一个由经纬度定义的点X - 我们需要检测包含该点 X 并受相邻道路约束的多边形 - 所以基本上点 X 在多边形内,相邻的道路将是该多边形的边界。

到目前为止,我只设法在地图上绘制图表的可视化并找到最接近点 X 的边/节点。

在附图中,我用红色突出显示了我要提取的区域。

【问题讨论】:

  • 我会在网络上做shapely.ops.polygonize,然后与生成的多边形相交。

标签: networkx openstreetmap geopandas osmnx


【解决方案1】:

当您试图找到一个包含您的点的多边形时,您首先需要从多线串几何图形中生成多边形。由于您没有提供数据,我正在使用 OSMnx 从 OSM 下载样本。

import osmnx as ox
import geopandas as gpd
import shapely

point = (40.742623, -73.977857)

streets_graph = ox.graph_from_point(point, distance=500, network_type='drive')
streets_graph = ox.project_graph(streets_graph)

我重新投影了它,因为它比使用度数更方便,特别是如果你想测量任何东西。

然后您必须将 OSMnx 图形转换为 geopandas GeoDataFrame。

streets = ox.save_load.graph_to_gdfs(streets_graph, nodes=False, edges=True,
                                     node_geometry=False, fill_edge_geometry=True)

为了得到一些我可以使用的点,我将只使用这个地理数据框中心的那个。

point = streets.unary_union.centroid

这就是它的样子。

接下来,您需要按照我在上面评论中的建议使用shapely.ops.polygonize 获取由街道定义的街区的多边形,并将它们存储为 GeoSeries。

polygons = shapely.ops.polygonize(streets.geometry)
polygons = gpd.GeoSeries(polygons)

接下来你唯一要做的就是找出哪个多边形包含你的点。

target = polygons.loc[polygons.contains(point)]

再次绘制:

ax = target.plot()
gpd.GeoSeries([point]).plot(ax=ax, color='r')

如果您想知道哪些街道构成了该多边形的边界,只需将其与原始网络相交即可。我正在过滤 MultiLineString 以排除仅在一个点与多边形相交的街道。

target_streets = streets.loc[streets.intersection(target.iloc[0]).type == 'MultiLineString']

这就是结果的样子。

ax = target_streets2.plot()
gpd.GeoSeries([point]).plot(ax=ax, color='r')

希望对你有帮助。

【讨论】:

  • 您好,我正在尝试重现您的代码,但无法绘制它,您能帮帮我吗? stackoverflow.com/questions/60119176/…非常感谢
  • 您好,很抱歉再次打扰您,但是您知道如何简单地测量多边形边缘的长度吗?或者我必须通过解析几何“从头开始”来做这件事,非常感谢:)
  • @Mechatrnk 提出一个新问题,隐藏在 cmets 中的答案对其他人无济于事。
猜你喜欢
  • 2019-11-14
  • 1970-01-01
  • 2015-02-01
  • 2021-12-03
  • 2020-11-07
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多