按地点对 osmnx 地图进行着色(使用 graph_from_place() 方法)

发布于 2025-01-19 19:29:46 字数 1593 浏览 0 评论 0原文

我们绘制了2个位置:

# Get data
import osmnx as ox
place = ["Broughton Hackett", "Crowle"]
G = ox.graph_from_place(place, retain_all=True, simplify = True, network_type='all')

# Prepare data
u = []
v = []
key = []
data = []
for uu, vv, kkey, ddata in G.edges(keys=True, data=True): # added ww
    u.append(uu)
    v.append(vv)
    key.append(kkey)
    data.append(ddata)

# Define colors according to length of streets
roadCols = []

for item in data:    
    if "length" in item.keys():
        if item["length"] <= 200:
            color = "#FFFFF0"             
        elif item["length"] > 200 and item["length"] <= 1000:
            color = "#6a0dad"  
        else:
            color = "#00FFFF"
    else:
        color = "#FFFFFF"         
    roadCols.append(color)

#Plot 
bgcolor = "#1e1e1e"
fig, ax = ox.plot_graph(G, node_size=0, 
                        dpi = 100,bgcolor = bgcolor,
                        save = False, edge_color=roadCols,
                        edge_linewidth=1, edge_alpha=1)
fig.tight_layout(pad=0)
fig.savefig("stack.jpg", dpi=100, bbox_inches='tight', format="jpg", 
            facecolor=fig.get_facecolor(), transparent=False)


正如我们在下面的输出中看到的那样,街道已根据其长度进行着色。

我的问题:我们如何为 place 而不是长度彩色街道吗?因此,第一村的所有街道都采用一种颜色,而另一村的所有街道都采用另一种颜色?

与长度相反,该位置不包含在data对象中,我不知道如何检索它。

这是一个模拟的例子,我有意选择了小村庄。实际上,我想通过一系列整个城市进行着色。

We plot 2 places:

# Get data
import osmnx as ox
place = ["Broughton Hackett", "Crowle"]
G = ox.graph_from_place(place, retain_all=True, simplify = True, network_type='all')

# Prepare data
u = []
v = []
key = []
data = []
for uu, vv, kkey, ddata in G.edges(keys=True, data=True): # added ww
    u.append(uu)
    v.append(vv)
    key.append(kkey)
    data.append(ddata)

# Define colors according to length of streets
roadCols = []

for item in data:    
    if "length" in item.keys():
        if item["length"] <= 200:
            color = "#FFFFF0"             
        elif item["length"] > 200 and item["length"] <= 1000:
            color = "#6a0dad"  
        else:
            color = "#00FFFF"
    else:
        color = "#FFFFFF"         
    roadCols.append(color)

#Plot 
bgcolor = "#1e1e1e"
fig, ax = ox.plot_graph(G, node_size=0, 
                        dpi = 100,bgcolor = bgcolor,
                        save = False, edge_color=roadCols,
                        edge_linewidth=1, edge_alpha=1)
fig.tight_layout(pad=0)
fig.savefig("stack.jpg", dpi=100, bbox_inches='tight', format="jpg", 
            facecolor=fig.get_facecolor(), transparent=False)


As we can see in output below, streets have been colored according to their length.

Output map

My question: how do we color streets by place, not length? So that all streets of the first village are in one color, and that all streets of the other village are in another color?

Contrary to length, the place is not contained in the data object, and I don't know how to retrieve it.

This is a mock example and I have intentionally chosen tiny villages. In reality I want to color by a series of whole cities.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

兲鉂ぱ嘚淚 2025-01-26 19:29:46
  • 能够根据地点对边缘进行着色的核心是知道该地点
  • 已使用获取每个地点的 osmnx* 图表并为其分配地点的方法
  • ,然后使用 geopandas 就很简单/ folium 与颜色边缘的集成
  • 也显示了似乎是首选的方式 ma​​tplotlib

Matplotlib

# Get data
import osmnx as ox
import pandas as pd
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt

plt.style.use('dark_background')

place = ["Broughton Hackett", "Crowle"]
gdf_nodes = gdf_edges = None
for place in place:
    G = ox.graph_from_place(place, retain_all=True, simplify = True, network_type='all')
    n_, e_ = ox.graph_to_gdfs(G)
    n_["place"] = place
    e_["place"] = place
    if gdf_nodes is None:
        gdf_nodes = n_
        gdf_edges = e_
    else:
        gdf_nodes = pd.concat([gdf_nodes, n_])
        gdf_edges = pd.concat([gdf_edges, e_])

# it's a bit imperfect way to map a value to a color
colors = {'Broughton Hackett':'red', 'Crowle':'blue'}
gdf_edges.plot(column="place", cmap=ListedColormap([colors[k] for k in sorted(colors.keys())]))

在此处输入图像描述

大叶

# Get data
import osmnx as ox
import pandas as pd
place = ["Broughton Hackett", "Crowle"]
gdf_nodes = gdf_edges = None
for place in place:
    G = ox.graph_from_place(place, retain_all=True, simplify = True, network_type='all')
    n_, e_ = ox.graph_to_gdfs(G)
    n_["place"] = place
    e_["place"] = place
    if gdf_nodes is None:
        gdf_nodes = n_
        gdf_edges = e_
    else:
        gdf_nodes = pd.concat([gdf_nodes, n_])
        gdf_edges = pd.concat([gdf_edges, e_])

gdf_edges.explore(column="place", height=300, width=500)


在此处输入图像描述

  • core to being able to color edges based on place is knowing the place
  • have used approach of getting osmnx* graph for each place and assigning place to it
  • then it's simple to use geopandas / folium integration to color edges
  • also shown what appears to be preferred way matplotlib

Matplotlib

# Get data
import osmnx as ox
import pandas as pd
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt

plt.style.use('dark_background')

place = ["Broughton Hackett", "Crowle"]
gdf_nodes = gdf_edges = None
for place in place:
    G = ox.graph_from_place(place, retain_all=True, simplify = True, network_type='all')
    n_, e_ = ox.graph_to_gdfs(G)
    n_["place"] = place
    e_["place"] = place
    if gdf_nodes is None:
        gdf_nodes = n_
        gdf_edges = e_
    else:
        gdf_nodes = pd.concat([gdf_nodes, n_])
        gdf_edges = pd.concat([gdf_edges, e_])

# it's a bit imperfect way to map a value to a color
colors = {'Broughton Hackett':'red', 'Crowle':'blue'}
gdf_edges.plot(column="place", cmap=ListedColormap([colors[k] for k in sorted(colors.keys())]))

enter image description here

folium

# Get data
import osmnx as ox
import pandas as pd
place = ["Broughton Hackett", "Crowle"]
gdf_nodes = gdf_edges = None
for place in place:
    G = ox.graph_from_place(place, retain_all=True, simplify = True, network_type='all')
    n_, e_ = ox.graph_to_gdfs(G)
    n_["place"] = place
    e_["place"] = place
    if gdf_nodes is None:
        gdf_nodes = n_
        gdf_edges = e_
    else:
        gdf_nodes = pd.concat([gdf_nodes, n_])
        gdf_edges = pd.concat([gdf_edges, e_])

gdf_edges.explore(column="place", height=300, width=500)


enter image description here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文