Python 在OSMnx贴图顶部打印多段线

Python 在OSMnx贴图顶部打印多段线,python,geospatial,geopandas,shapely,osmnx,Python,Geospatial,Geopandas,Shapely,Osmnx,使用OSMnx库,我试图在底图上绘制多边形线条(每个定义的坐标不附着于基础网络),但运气不佳。我确信我拥有的坐标在边界内,并且在添加它们时没有错误 这是我当前的代码,它生成了底图,并在网络下方添加了一个多多边形层。所以可以添加多边形,这让我觉得我的坐标可能有投影问题,但我没有运气设置不同的投影 任何帮助都将不胜感激 导入matplotlib.pyplot作为plt 从笛卡尔进口PolygonPatch 从shapely.geometry导入多边形、多多边形 将osmnx作为ox导入 ox.con

使用OSMnx库,我试图在底图上绘制多边形线条(每个定义的坐标不附着于基础网络),但运气不佳。我确信我拥有的坐标在边界内,并且在添加它们时没有错误

这是我当前的代码,它生成了底图,并在网络下方添加了一个多多边形层。所以可以添加多边形,这让我觉得我的坐标可能有投影问题,但我没有运气设置不同的投影

任何帮助都将不胜感激

导入matplotlib.pyplot作为plt
从笛卡尔进口PolygonPatch
从shapely.geometry导入多边形、多多边形
将osmnx作为ox导入
ox.config(log\u console=True,use\u cache=True)
牛市版__
def绘图(几何图形):
#把这个地方弄清楚
gdf=ox.gdf_(丹麦哥本哈根市)
gdf=ox.project\u gdf(gdf)
#获取街道网络,使用retain_all=True保留所有断开连接的岛屿网络
G=ox.graph\u来自丹麦哥本哈根市,网络类型为drive,保留为True)
G=ox.project\u图(G)
图,ax=ox.plot_图(G,图高度=10,显示=False,关闭=False,边缘颜色='777777')
#从gdf添加形状
对于gdf['geometry']中的几何体。tolist():
如果isinstance(几何体,(多边形,多多边形)):
如果isinstance(几何体、多边形):
几何体=多多边形([几何体])
对于几何图形中的多边形:
patch=PolygonPatch(多边形,fc='#cccc',ec='k',线宽=3,alpha=0.1,zorder=-1)
ax.添加补丁(补丁)
#添加行:
对于几何图形中的几何图形:
如果isinstance(几何体,(多边形,多多边形)):
如果isinstance(几何体、多边形):
几何体=多多边形([几何体])
对于几何图形中的多边形:
面片=多边形面片(多边形,fc='#148024',ec='#777777',线宽=10,alpha=1,zorder=2)
ax.添加补丁(补丁)
plt.savefig('images/cph.png',alpha=True,dpi=300)
绘图(几何图形)
几何图形
是一个包含以下多边形的列表:

POLYGON ((55.6938796 12.5584122, 55.6929711 12.5585957, 55.6921317 12.5579927, 55.6916918 12.5564539, 55.6909246 12.5553629, 55.6901215 12.554119, 55.6891181 12.5531433, 55.6881469 12.5526575, 55.687502 12.5538862, 55.6866445 12.5530816, 55.6856769 12.5524416, 55.6848185 12.5515929, 55.6838506 12.551074, 55.6829915 12.5504047, 55.6821492 12.5498124, 55.6812104 12.5492503, 55.680311 12.5486803, 55.6792187 12.547724, 55.6783172 12.5472156, 55.6774282 12.5466767, 55.6765291 12.5461124, 55.6755652 12.5453961, 55.6747743 12.5445313, 55.6738159 12.5439029, 55.673417 12.5454132, 55.6733398 12.5470051, 55.6731045 12.5486561, 55.6726013 12.5501493, 55.6727833 12.5520672, 55.6716717 12.5525378, 55.6706619 12.5528382, 55.6698239 12.5521737))
POLYGON ((55.6693768 12.5509383, 55.6684025 12.5511539, 55.6677405 12.5500371, 55.6668188 12.5501435, 55.6658323 12.550075, 55.665264 12.5487917, 55.6649187 12.5473085, 55.6645313 12.5457653))

在geopandas数据帧中,地理坐标为(经度、纬度)。下面是一个简单的演示代码,它绘制了一些示例数据

import geopandas as gpd
import pandas as pd
import matplotlib.pyplot as plt
import osmnx as ox
from shapely import wkt  #need wkt.loads

# simple plot of OSM data
gdf = ox.gdf_from_place('Copenhagen Municipality,Denmark')
gdf = gpd.GeoDataFrame(gdf, crs={'init': 'epsg:4326'})  #set CRS
ax1 = gdf.plot(color='lightgray')  # grab axis as `ax1` for reuse

# prep the polygons to plot on the axis `ax1`
# use (longitude latitude), and the last point must equal the 1st
pgon1 = "POLYGON((12.5584122 55.6938796, 12.5585957 55.6929711, 12.5579927 55.6921317, 12.5564539 55.6916918, 12.5553629 55.6909246, 12.554119 55.6901215, 12.5531433 55.6891181, 12.5526575 55.6881469, 12.5538862 55.687502, 12.5530816 55.6866445, 12.5524416 55.6856769, 12.5515929 55.6848185, 12.551074 55.6838506, 12.5504047 55.6829915, 12.5498124 55.6821492, 12.5492503 55.6812104, 12.5486803 55.680311, 12.547724 55.6792187, 12.5472156 55.6783172, 12.5466767 55.6774282, 12.5461124 55.6765291, 12.5453961 55.6755652, 12.5445313 55.6747743, 12.5439029 55.6738159, 12.5454132 55.673417, 12.5470051 55.6733398, 12.5486561 55.6731045, 12.5501493 55.6726013, 12.5520672 55.6727833, 12.5525378 55.6716717, 12.5528382 55.6706619, 12.5521737 55.6698239, 12.5584122 55.6938796))"
pgon2 = "POLYGON((12.5509383 55.6693768, 12.5511539 55.6684025, 12.5500371 55.6677405, 12.5501435 55.6668188, 12.550075 55.6658323, 12.5487917 55.665264, 12.5473085 55.6649187, 12.5457653 55.6645313, 12.5509383 55.6693768))"

# create dataframe of the 2 polygons
d = {'col1': [1, 2], 'wkt': [pgon1, pgon2]}
df = pd.DataFrame( data=d )

# make geo-dataframe from it
geometry = [wkt.loads(pgon) for pgon in df.wkt]
gdf2 = gpd.GeoDataFrame(df, \
                   crs={'init': 'epsg:4326'}, \
                   geometry=geometry)

# plot it as red polygons
gdf2.plot(ax=ax1, color='red', zorder=5)
输出曲线图:


在geopandas数据帧中,地理坐标为(经度、纬度)。下面是一个简单的演示代码,它绘制了一些示例数据

import geopandas as gpd
import pandas as pd
import matplotlib.pyplot as plt
import osmnx as ox
from shapely import wkt  #need wkt.loads

# simple plot of OSM data
gdf = ox.gdf_from_place('Copenhagen Municipality,Denmark')
gdf = gpd.GeoDataFrame(gdf, crs={'init': 'epsg:4326'})  #set CRS
ax1 = gdf.plot(color='lightgray')  # grab axis as `ax1` for reuse

# prep the polygons to plot on the axis `ax1`
# use (longitude latitude), and the last point must equal the 1st
pgon1 = "POLYGON((12.5584122 55.6938796, 12.5585957 55.6929711, 12.5579927 55.6921317, 12.5564539 55.6916918, 12.5553629 55.6909246, 12.554119 55.6901215, 12.5531433 55.6891181, 12.5526575 55.6881469, 12.5538862 55.687502, 12.5530816 55.6866445, 12.5524416 55.6856769, 12.5515929 55.6848185, 12.551074 55.6838506, 12.5504047 55.6829915, 12.5498124 55.6821492, 12.5492503 55.6812104, 12.5486803 55.680311, 12.547724 55.6792187, 12.5472156 55.6783172, 12.5466767 55.6774282, 12.5461124 55.6765291, 12.5453961 55.6755652, 12.5445313 55.6747743, 12.5439029 55.6738159, 12.5454132 55.673417, 12.5470051 55.6733398, 12.5486561 55.6731045, 12.5501493 55.6726013, 12.5520672 55.6727833, 12.5525378 55.6716717, 12.5528382 55.6706619, 12.5521737 55.6698239, 12.5584122 55.6938796))"
pgon2 = "POLYGON((12.5509383 55.6693768, 12.5511539 55.6684025, 12.5500371 55.6677405, 12.5501435 55.6668188, 12.550075 55.6658323, 12.5487917 55.665264, 12.5473085 55.6649187, 12.5457653 55.6645313, 12.5509383 55.6693768))"

# create dataframe of the 2 polygons
d = {'col1': [1, 2], 'wkt': [pgon1, pgon2]}
df = pd.DataFrame( data=d )

# make geo-dataframe from it
geometry = [wkt.loads(pgon) for pgon in df.wkt]
gdf2 = gpd.GeoDataFrame(df, \
                   crs={'init': 'epsg:4326'}, \
                   geometry=geometry)

# plot it as red polygons
gdf2.plot(ax=ax1, color='red', zorder=5)
输出曲线图:


您需要
多边形((长lat,长lat,长lat,…)
您需要
多边形((长lat,长lat,长lat,…)
。您好@swatchai,从(lat,lng)重新排列到(lng,lat)确实解决了问题,谢谢您的指针!但是,我要打印的数据是直线,而不是我要关闭的多边形。有没有办法强制不闭合路径?只需将我的代码中的
多边形
更改为
多行线
。在这种情况下,最后一点不必满足第一点。您好@swatchai,从(lat,lng)重新排列到(lng,lat)确实解决了问题,所以感谢您的指针!但是,我要打印的数据是直线,而不是我要关闭的多边形。有没有办法强制不闭合路径?只需将我的代码中的
多边形
更改为
多行线
。在这种情况下,最后一点不必满足第一点。