Mic*_*oth 3 python gis openstreetmap osmnx
我目前在一个项目中使用 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')
Run Code Online (Sandbox Code Playgroud)
产生这个图像:
我是否需要以某种方式将地理数据框与 PlotShape 一起使用?或者是我需要的plot_footprints?我还没有找到人们绘制水体的例子。看来GDF一般用于绘制某个地点的地图,而足迹则用于绘制建筑物。尽管这些都是面向多边形的图,但我觉得这可能是正确的方法。
小智 5
为了我的一个小项目,我已经为此奋斗了一段时间。可接受的解决方案的作用是将获取的土地绘制在背景顶部water_color,并添加使用标签获取的闭合多边形{'natural':'water'}。land仅当覆盖整个视野时,此功能才能正常工作。如果您只保留列表中的一个地点(例如'Manhattan, NY, USA'),那么您在蓝色的海洋中就只有这片选定的土地。
很好,如果这就是你想要的。
我想做的,以及我怀疑OP也想要的(因为他们从边界框获取信息),是将所有水陆界面都包含在边界框内。如果需要的是轮廓,则包括海岸线即可完成工作,但海岸线不是封闭的多边形(并且它们位于单独的段中),因此没有简单的方法可以做到这一点。
我开始研究使用osmnx.geometries.linemerge然后osmnx.geo_utils.split打破沿着海岸线的多边形,但我最终发现有人已经完成了所有工作:
https://osmdata.openstreetmap.de/contact.html
该存储库将所有海岸线连接成多边形(无论是在水侧还是在陆地侧)。github 存储库是https://github.com/fossgis。
所以我想说,执行OP要求的干净方法是下载并使用这些形状文件。假设水多边形文件已解压到工作目录中,这是一个工作示例:
import osmnx as ox
import geopandas as gpd
# Bounding box
bN, bS, bE, bW = 40.9666, 40.4362, -73.6084, -74.3254
# Fetch water
G = ox.geometries.geometries_from_bbox(bN, bS, bE, bW, tags={"natural": "water"})
# Load coastline polygons
water = gpd.read_file('water-polygons-split-4326/water_polygons.shp', bbox=(bW, bN, bE, bS))
# Plot
fig, ax = ox.plot_footprints(water, bbox=(bN, bS, bE, bW),
color=water_color, bgcolor=land_color,
show=False, close=False)
ax = G.plot(ax=ax, fc=water_color, markersize=0)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2432 次 |
| 最近记录: |