您好我正在尝试使用Basemap(matplot lib的一部分)中的greatcircle函数将ip地址图绘制到世界地图上,但每次我连接跨越太平洋的两个点(即美国某处)西海岸和澳大利亚)在我的情节中有一条水平线。
我知道这是因为这个问题:
Note Cannot handle situations in which the great circle intersects the edge of the map projection domain, and then re-enters the domain. (http://matplotlib.org/basemap/api/basemap_api.html#mpl_toolkits.basemap.Basemap.drawgreatcircle)
只是想知道是否有人知道如何解决它或知道另一个包没有“有这个问题。谢谢!
答案 0 :(得分:8)
要在特定情况下在Basemap中解决此问题,您可以检查生成的路径中x顶点的差异。从那里,我们可以将坏道路分为两部分。我把自己用底图做的这个例子放在了一起:
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
m = Basemap(projection='cyl', lon_0=0, resolution='c')
m.fillcontinents(color='coral',lake_color='aqua')
m.drawmapboundary(fill_color='aqua')
places = {'Mexico City': (19.05, -99.366667),
'London': (51.507222, -0.1275),
'Sydney': (-33.859972, 151.211111),
'Cape Town': (-33.925278, 18.423889),
'Delhi': (28.61, 77.23),
}
network = [
('London', 'Delhi'),
('Mexico City', 'Sydney'),
]
for source, target in network:
lat1, lon1 = places[source]
lat2, lon2 = places[target]
line, = m.drawgreatcircle(lon1, lat1, lon2, lat2, lw=3)
p = line.get_path()
# find the index which crosses the dateline (the delta is large)
cut_point = np.where(np.abs(np.diff(p.vertices[:, 0])) > 200)[0]
if cut_point:
cut_point = cut_point[0]
# create new vertices with a nan inbetween and set those as the path's vertices
new_verts = np.concatenate(
[p.vertices[:cut_point, :],
[[np.nan, np.nan]],
p.vertices[cut_point+1:, :]]
)
p.codes = None
p.vertices = new_verts
plt.show()
结果:
这不是一般解决方案,只有在你拥有纬度和经度时才有效。解决一般问题是更多,更多更难,并且是cartopy (http://scitools.org.uk/cartopy/docs/latest/)的焦点。我将在接下来的几天内发布一个在cartopy中完全相同的情节的例子。
HTH
答案 1 :(得分:0)
另一个没有这个问题的软件包:cartopy(尚未宣布)。找到的示例here是相关的。
HTH