【问题标题】:Convert closed Linestrings from OSMnx graph into Multipolygon将 OSMnx 图中的封闭线串转换为多面体
【发布时间】:2020-10-05 20:41:39
【问题描述】:

我正在使用 OSMnx 库从 OpenStreetMap 中检索一些几何图形,代码如下:

G = ox.graph_from_place('Casco Viejo, Bilbao, Spain', network_type='walk', 
                        retain_all=True, buffer_dist = 50, which_result = 2,
                        infrastructure = 'relation["highway" = "pedestrian"]')

产生以下由匀称的线串组成的图形:

然后我将图形转换为 geopandas 地理数据框:

ped = ox.graph_to_gdfs(G, nodes = False)

我已经尝试将Linestrings 转换为Points,然后将Points 转换为Multipolygon

有没有办法将此线串转换为匀称的Multipolygon

from shapely import geometry, ops

# combine them into a multi-linestring
multi_line = geometry.MultiLineString(list(ped['geometry']))

merged_line = ops.linemerge(multi_line)

from shapely.geometry import Point, MultiPoint

points = []
for i in range(0, len(merged_line)):
    points.append((Point(list(merged_line[i].coords[1]))))

coords = [p.coords[:][0] for p in points]

poly = Polygon(coords)

这会产生一个奇怪的错误几何:

shape(poly)

如果我尝试:

MultiPolygon(points)

它给出了这个错误消息:TypeError: 'Point' object is not subscriptable

有没有办法将Linestrings 转换为Multipolygon 并将其转换为GeoDataFrame

【问题讨论】:

    标签: python shapely osmnx


    【解决方案1】:

    如果您尝试使用 ox.graph_from_X 函数构建图形,那么使用 polgon 或 multipolygon 是没有意义的,因为图形模型只是一组通过边相互连接的元素(节点)。

    如果您只想要该区域中可步行元素的几何(点、多边形、多多边形等),那么您应该使用pois 模块来获取几何的 GeoDataFrame(没有任何图形拓扑),例如:

    import osmnx as ox
    ox.config(use_cache=True, log_console=True)
    place = 'Casco Viejo, Bilbao, Spain'
    gdf = ox.pois_from_place(place, which_result=2, tags={'highway':'pedestrian'})
    gdf.shape #(87, 56)
    

    最后,请注意,您对 infrastructure 参数的使用在几个版本之前已被弃用,并在之前的版本中被删除。您可能需要将软件包更新到最新版本。

    【讨论】:

    • 谢谢,Geoff,但结果对我的目的来说还不够好。打印结果时,许多多边形的性能存在错误。 fig, ax = ox.plot_shape(gdf.loc[(gdf.geom_type == 'Polygon') | (gdf.geom_type == 'MultiPolygon')])
    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多