参考这个问题,是否可以有比例尺(以米为单位投影,例如3857)以及纬度、经度投影(4326)中的x,y轴和指北针?
我没有看到使用 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()
输出给出:
对于那些通过某种搜索引擎遇到这个问题的人:这可以通过我最近开发的一个名为 matplotlib-map-utils 的包实现。
指北针: 它具有专用函数 (
north_arrow()
) 和类 (NorthArrow
),用于创建具有大量自定义功能的函数(查看 GitHub 存储库中的
docs\howto_north_arrow
以查看详细信息)。如果将投影坐标系作为参数传递,它还将考虑投影坐标系的旋转。
# Importing
from matplotlib_map_utils.core.north_arrow import NorthArrow, north_arrow
# Setting up a plot
fig, ax = matplotlib.pyplot.subplots(1,1, figsize=(5,5), dpi=150)
# Adding a north arrow to the upper-right corner of the axis,
# in the same projection as whatever geodata you plotted
north_arrow(ax=ax, location="upper right", rotation={"crs":3857, "reference":"center"})
比例尺:同样,它有一个专用函数(
scale_bar()
)和类(ScaleBar
)来创建它们,还具有大量自定义功能(查看GitHub存储库中的
docs\howto_scale_bar
以查看详细信息) ).
# Importing
from matplotlib_map_utils.core.scale_bar import ScaleBar, scale_bar
# Setting up a plot
fig, ax = matplotlib.pyplot.subplots(1,1, figsize=(5,5), dpi=150)
# Adding a scale bar to the upper-right corner of the axis,
# in the same projection as whatever geodata you plotted
# Here, this scale bar will have the "boxes" style
scale_bar(ax=ax, location="upper right", style="boxes", bar={"projection":3857})
至关重要的是,对于OP的问题,如果传递了一个unprojected坐标系(例如
4326
),你可以传入一个desired单位,它会自动为你计算大圆距离。这不会像投影的 CRS 那样准确,但它允许 OP 在绘图轴上保持所需的纬度/经度,同时以 metres
(或英里、公里或其他)显示单位。