如何使用 Geopandas 在地图上显示以米为单位的比例尺、指北针以及以纬度和经度表示的轴?

How do you display the scale in meters, the north arrow and the axes in latitude and longitude on a map with Geopandas?

参考这个 issue,是否可以使用比例尺(以米为单位投影,例如 3857) x,y 轴纬度、经度投影 (4326) 和指北针?

我没有看到使用 geopandas 执行此操作的交钥匙解决方案。虽然这似乎是 GIS 地图显示的基本设置。这有技术原因吗?

import geopandas as gpd
from matplotlib_scalebar.scalebar import ScaleBar
import matplotlib.pyplot as plt

df = gpd.read_file(gpd.datasets.get_path('nybb'))
ax = df.to_crs(4326).plot()
ax.add_artist(ScaleBar(1)) #how add ScaleBar for df in 3857? 
plt.show()

this开始,您似乎必须用坐标计算两个位置 A 和 B 之间的大圆距离 A=[longitudeA,latitudeA] 和 B=[longitudeA+1,latitudeA],在您感兴趣的纬度(在您的情况下为 ~40.7°)。要计算大圆距离,您可以使用 sklearn (here) 中的 'haversine_distances' 并将其乘以地球半径 6371000 以获得以米为单位的距离。 一旦你得到这个距离 dx,你可以用 ScaleBar(dx=dx,units="m").

将它传递给你的比例尺

总的来说,代码如下所示:

import numpy as np
import geopandas as gpd
from matplotlib_scalebar.scalebar import ScaleBar
import matplotlib.pyplot as plt
from sklearn.metrics.pairwise import haversine_distances

df = gpd.read_file(gpd.datasets.get_path('nybb'))
ax = df.to_crs(4326).plot()
A=[-74.5*np.pi/180.,40.7*np.pi/180.] #Latitude of interest here 40.7 deg, longitude -74.5
B=[-73.5*np.pi/180.,40.7*np.pi/180.] ##Latitude of interest here 40.7 deg, longitude -74.5+1
dx=(6371000)*haversine_distances([A,B])[0,1]
ax.add_artist(ScaleBar(dx=dx,units="m")) 
plt.show()

并且输出给出: