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

这是一个好地方 如果我不走极端的话,这行得通-

Its a good plot

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

The sphericity of the earth is not taken count here and it stops at 90 degree

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

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,ccrs.PlateCarree())


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

plt.show() 

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

例如,下面是两个图

以lat = 80 long = 60绘制图

图片澄清了问题。我也需要完全相反的一面,因此纬度应再次从90减小到0,但随后的经度将再次改变。这样,我就无路可走了。

enter image description here

以lat = 22和long = 78绘制图

enter image description here

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

即使将set_extent的投影更改为LCC或其他任何投影,也无法以中心为单位设置范围。

解决方法

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

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处的图

enter image description here

以lat = 22和long = 88绘制图

enter image description here

这两个地图都清楚地覆盖了给定纬度和经度值周围的同一区域。 谢谢!!!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...