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

问题描述 投票:0回答:2

参考这个问题,是否可以有比例尺(以米为单位投影,例如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()
python matplotlib geopandas matplotlib-basemap geoplot
2个回答
2
投票

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()

输出给出:

enter image description here


0
投票

对于那些通过某种搜索引擎遇到这个问题的人:这可以通过我最近开发的一个名为 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"})

rendered north arrow on a plot

比例尺:同样,它有一个专用函数(

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})

rendered scale bar on a plot

至关重要的是,对于OP的问题,如果传递了一个unprojected坐标系(例如

4326
),你可以传入一个desired单位,它会自动为你计算大圆距离。这不会像投影的 CRS 那样准确,但它允许 OP 在绘图轴上保持所需的纬度/经度,同时以
metres
(或英里、公里或其他)显示单位。

© www.soinside.com 2019 - 2024. All rights reserved.