2016-05-25 5 views
2

私は衛星の地面をプロットしようとしています。私は緯度と経度のリストを度で持っています。経度の値はすべて-180〜+ 180度です。私の最初の問題は(私はとても奇妙に見える構文を許し、PyCall.jlパッケージ経由ジュリアでこれを使用している方法で)latlonキーワードを使用している:これはベースマップにラップされたパスをプロットする

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

です。 ..それはどのように見えるべきではない。私は本当に問題が何であるかは分かりません。私はマップに変換する場合は、最初の座標:

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

Better plot

これは、経度は+180から-180に折り返さた時点でラインの除いてはるかに優れています。これをより良く見せるための提案はありますか?

これらのプロットを生成するために使用される緯度、経度のペア(度)はhereです。

+0

単にLAT-long値のリストを再発注を開始し、マップの端で終了するために、任意のチャンスが働くだろうか?言い換えれば、-180から180までの経度に基づいて並べ替えます。 – dagrha

+0

並べ替えを試みましたが、太平洋上のオーバーラップのために、パスは上部と下部の間を行き来します。 – Chris

+0

このような解決策が役立つかもしれません:http://stackoverflow.com/a/27139390/3651127 – dagrha

答えて

6

これはold issueBasemapに関連する可能性があると私は考えました。しかし、私はあなたの問題は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

決定的な解決策は、複数のトラックであなたの地上トラックを分割してもhereを説明したように、LineCollectionを使用してそれらをプロットすることです。単純なアプローチ(あなたが経度で1つの不連続を期待している場合):

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

+0

これは素晴らしいです、ありがとう。私の最初の例で何が起こっているか考えていますか( 'latlon = true')? – Chris

+1

@Chris That _ is_'Basemap' [バグ](https://github.com/matplotlib/matplotlib/issues/3404)です。私はバグへの言及と可能な解決策を用いて答えを更新しました。 – lmillefiori

関連する問題