首页 > 解决方案 > 使用 Cartopy 在给定的经纬度周围绘制等面积地图

问题描述

我想在用户输入的纬度和经度周围有一个方形地图。

import cartopy.crs as ccrs
import matplotlib.pyplot as plt 
import cartopy.feature  
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
x=float(input('Enter latitude:'))
y=float(input('Enter longitude:')) 

ax = plt.axes(projection=ccrs.PlateCarree())
ax.set_extent([y-10,y+10,x-10,x+10],ccrs.PlateCarree())

ax.coastlines()
ax.gridlines(draw_labels=True)
plt.show()

这是一个很好的情节,如果我不走向两极,这会奏效-

这是一个很好的情节

地球的球度在这里不计算,它停止在 90 度 -

地球的球度在这里不计算,停在90度

如果我将投影更改为正交,则极点问题可能会得到解决。

import cartopy.crs as ccrs
import matplotlib.pyplot as plt 
import cartopy.feature  
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
 
x=float(input('Enter latitude:'))
y=float(input('Enter longitude:')) 

ax = plt.axes(projection=ccrs.Orthographic(y,x))
ax.set_extent([y-10,y+10,x-10,x+10],ccrs.PlateCarree())


ax.coastlines()
ax.gridlines(draw_labels=True)

plt.show() 

我认为考虑了球形度,当我靠近赤道时,我可能会得到一个很好的正方形图。但是,当我接近两极时,正方形会开始缩小,最终我不会得到一个好的区域,因为我必须从那个正方形区域获取纬度和经度,并用它们计算一些值。

例如,下面是两个图

在 lat=80 long = 60 处绘制

这张图说明了这个问题。我也需要截然相反的一面,所以纬度应该再次从 90 开始减少到 0,但是经度会再次改变。这样,我无处可去,卡住了。

在此处输入图像描述

在 lat = 22 和 long = 78 处绘制

在此处输入图像描述

第一个变成长方形,第二个变成正方形。如何使它们与任何给定的经纬度面​​积相等?

即使我更改set_extenttoLCC或任何其他的投影,我也无法根据中心设置范围。

标签: pythonmatplotlibcartopy

解决方案


解决方案相当简单,我完全误解了正交投影的工作原理。在正交投影中投影和设置范围都可以正常工作。这是解决方案 -

import cartopy.crs as ccrs
import matplotlib.pyplot as plt 
import numpy as np 
x=float(input('Enter latitude:'))
y=float(input('Enter longitude:')) 
ax = plt.axes(projection=ccrs.Orthographic(y,x))
ax.set_extent((-1000000,1000000,-1000000,1000000),ccrs.Orthographic(y,x))
ax.coastlines('50m')
ax.gridlines(draw_labels=True)
plt.show()

在 lat = 90 和 long = 180 处绘制

在此处输入图像描述

在 lat=22 和 long = 88 处绘制

在此处输入图像描述

两张地图都清楚地覆盖了给定纬度、经度值周围的相同区域。谢谢!!!


推荐阅读