gpt4 book ai didi

python - 如何在 Python 中使用 OSMnx 填充水体

转载 作者:行者123 更新时间:2023-12-05 01:12:16 29 4
gpt4 key购买 nike

我目前在一个项目中使用 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 一起使用?或者是我需要的 plot_footprints 吗?我没能找到人们绘制水体的例子。似乎GDF通常用于绘制一个地方的 map ,而脚印用于建筑物。虽然这些都是面向多边形的图,但我觉得这可能是正确的方法。

最佳答案

为了我的一个小项目,我已经为此奋斗了一段时间。公认的解决方案是将获取的土地绘制在 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 要求的干净方法是下载和使用这些 shapefile。假设水多边形文件已在工作目录中解压缩,这是一个工作示例:

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)

Output figure

关于python - 如何在 Python 中使用 OSMnx 填充水体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62285134/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com