如何在Python中用OSMnx填充水体?

问题描述 投票:0回答:1

我目前在一个项目中使用OSMnx来绘制一个区域的道路网。

现在我想添加水体,这样我们就可以清楚地看到一个区域的哪些部分是水和陆地。

到目前为止,我已经能够使用OSMnx的图形函数的custom_filter参数来识别水体。然后,我可以使用 plot_graph 函数勾勒出水体的轮廓。

理想的情况是,我希望将水体填满(而不是仅仅勾勒出水体的轮廓)。我觉得这应该是可能的,因为在OpenStreetMap中,水体是被填充的,但我不知道如何在OSMnx中做到这一点。有人有什么想法吗?

这是我目前的情况。

import osmnx as ox

# Get water bodies map of the New York City area
G = ox.graph_from_bbox(40.9666,40.4362,-73.6084,-74.3254, custom_filter='["natural"~"water|coastline"]', retain_all = True)

# Plot the graph in blue on a white background
ox.plot_graph(G, bgcolor='white', node_size=0, equal_aspect=True, edge_color='blue')

产生了这张图片

NYC Water Bodies Image

我需要在PlotShape中使用geodataframe吗? 还是我需要plot_footprints?我一直没有找到人们绘制水体的例子。好像GDF一般是用来绘制一个地方的地图,而footprints是用来绘制建筑物的。虽然由于这些都是面向多边形的图,我觉得这可能是正确的方法。

python gis openstreetmap osmnx
1个回答
1
投票

这并不完美,但它让你几乎达到了目的。

import osmnx as ox
ox.config(log_console=True, use_cache=True)

# add more items here to get all the landforms you want
places = ['Manhattan, NY, USA', 'Brooklyn, NY, USA', 'Queens, NY, USA', 'Bronx, NY, USA']
land = ox.gdf_from_places(places)

# get the water bodies
left, bottom, right, top = land.total_bounds
bbox = top, bottom, right, left
poly = ox.utils_geo.bbox_to_poly(*bbox)
water = ox.pois_from_polygon(poly, tags={'natural': 'water'})

# constrain the plotting window as desired
c = land.unary_union.centroid
bbox = ox.utils_geo.bbox_from_point((c.y, c.x), dist=12000)

water_color = 'blue'
land_color = '#aaaaaa'
fig, ax = ox.plot_footprints(water, bbox=bbox,
                             color=water_color, bgcolor=water_color,
                             show=False, close=False)
ax = land.plot(ax=ax, zorder=0, fc=land_color)

osm land vs water

关键的问题是,我目前还不清楚OSM是否可以持续地查询到直接的陆地与水的多边形(我在研究中通常不处理陆地与水的边界)。该 places 可能是政治边界,这可能与现实生活中的水区域重叠。你可能想在这里实验一下你queryplot作为陆地与水的关系。

© www.soinside.com 2019 - 2024. All rights reserved.