如何使用 Geopandas 在地图上显示以米为单位的比例尺、指北针以及经纬度坐标轴?
Posted
技术标签:
【中文标题】如何使用 Geopandas 在地图上显示以米为单位的比例尺、指北针以及经纬度坐标轴?【英文标题】:How do you display the scale in meters, the north arrow and the axes in latitude and longitude on a map with Geopandas? 【发布时间】:2022-01-12 06:49:26 【问题描述】:参考这个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()
【问题讨论】:
【参考方案1】:来自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()
输出给出:
【讨论】:
此外,geopandas 似乎在他们的tutorial 之一中解决了同样的情况。这两种方法的唯一区别是它们使用不同的python函数来计算大圆距离。结果是一样的。 这个例子我没看过,非常感谢你的解释。以上是关于如何使用 Geopandas 在地图上显示以米为单位的比例尺、指北针以及经纬度坐标轴?的主要内容,如果未能解决你的问题,请参考以下文章
将圆的半径(以米为单位)缩放到 D3.js d3.geo.mercator 地图