python - 在 basemap 中绘制包裹路径

标签 python plot maps matplotlib-basemap

我正在尝试绘制卫星地面轨道。我有一个以度为单位的纬度和经度列表。经度值都在 -180 到 +180 度之间。我的第一个问题是使用 latlon 关键字(顺便说一句,我通过 PyCall.jl 包在 Julia 中使用它,所以请原谅看起来很奇怪的语法) :

map = Basemap.Basemap(projection="mill",lon_0=0)
map[:drawcoastlines]()
map[:drawparallels](-90:30:90,labels=[1,0,0,0])
map[:drawmeridians](map[:lonmin]:60:map[:lonmax]+30,labels=[0,0,0,1])
map[:plot](lon,lat,color="red",latlon=true)

Weird plot

这……不是应该的样子。我不太确定问题出在哪里。但是,如果我先转换为 map 坐标:

xx,yy = map(lon,lat) 
map[:plot](xx,yy,color="red")

Better plot

这要好得多,除了经度从 +180 到 -180 的那条线。有什么建议可以使它看起来更好吗?

可以找到用于生成这些图的纬度、经度对(以度为单位)here .

最佳答案

一开始我认为这可能与一个old issue有关 basemap 。但是,我认为您的问题不是由于 Basemap 引起的,它实际上正确地处理了经度环绕,如果您仅使用标记来绘制卫星地面轨迹,您会看到这一点。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

f = plt.figure(figsize(10,7.5))
m = Basemap(projection="mill", lon_0=0)

m.drawcoastlines()
m.drawparallels(np.arange(-90,91,30),labels=[1,0,0,0])
m.drawmeridians(np.arange(-180,181,60), labels=[0,0,0,1])

x,y = m(lon, lat)
m.plot(x, y, color="red", latlon=False, marker='.', linestyle='None')

enter image description here

最终的解决方案是将您的地面轨道分成多个轨道并使用 LineCollection 绘制它们,同样解释为 here .一种更简单的方法(如果您预计经度会出现一个不连续点):

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

latlon_ar = np.array(latlon)

threshold = 90
idx_wrap = np.nonzero(np.abs(np.diff(latlon_ar[:,1])) > threshold)[0]+1

lon_1 = lon[:idx_wrap]
lat_1 = lat[:idx_wrap]

lon_2 = lon[idx_wrap:]
lat_2 = lat[idx_wrap:]

f = plt.figure(figsize(10,7.5))
m = Basemap(projection="mill", lon_0=0)

m.drawcoastlines()
m.drawparallels(np.arange(-90,91,30),labels=[1,0,0,0])
m.drawmeridians(np.arange(-180,181,60), labels=[0,0,0,1])

x1, y1 = m(lon_1, lat_1)
x2, y2 = m(lon_2, lat_2)

m.plot(x1, y1, color="red", latlon=False)
m.plot(x2, y2, color="blue", latlon=False)

enter image description here

编辑confirmed bugBasemap 中负责问题第一个示例中的行为,其中 Basemap.plot 直接使用纬度和经度值调用,设置了 latlon 标志为 True。有一个solution ,即在绘图前手动移动输入坐标,如下代码。

lons, lats = m.shiftdata(lon, lat)
m.plot(lons, lats, color="blue", latlon=True, marker='.', linestyle='None')

enter image description here

关于python - 在 basemap 中绘制包裹路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37439186/

相关文章:

navigation - React Native 中的室内平面图

java - 将经纬度坐标转换为 map 像素图像 X 和 Y 坐标 Java

python - 使用 rpyc 更新远程对象的属性

python - 如何获取最长的用户名? (不和谐.py)

matlab - 5x1 的子图彼此相邻 - 为什么我总是看到前两个正在消失?

python - 用python画地形?

javascript - map 图 block 集的纬度和经度

python - 在Python中使用导入类的对象作为另一个类的全局变量

python - 当所有权正确时,为什么 `killpg` 会返回 “not permitted”?

r - 在实现这个图之前我应该​​如何格式化我的数据?