- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前在一个项目中使用 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')
生成这张图片的原因:
我是否需要以某种方式将地理数据框与 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)
关于python - 如何在 Python 中使用 OSMnx 填充水体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62285134/
我是一名优秀的程序员,十分优秀!