如何使用 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 地图

如何获得以米为单位的距离

如何设置以米为单位的世界坐标的转换矩阵(用于增强现实)

在MYSQL中用2个坐标以米为单位计算地球距离的最佳方法是啥?

如何在 iOS 应用程序中每 1/2 秒获取步行距离(以米为单位)和方向?