2017-01-05 16 views
0

私は追跡した対象領域を定義しました。時間の蒸発。ここでは、境界線だけをプロットすることで、この領域をベースマッププロット上に描きたいと考えています。リージョンは、リージョンの座標(土地/海のマスクのようなものですが、特定の地域の座標)で1だけ埋められた(ほぼ)グローバルな緯度/経度の配列として定義されます。ベースマップ内の特定の領域のプロット境界

幾何学の境界線をプロットする場合は、シェイプファイル(よくわからない)を参照することはよくありますが、ポリゴンを作成してこのベースライン上にプロットするのは簡単な方法です。しかし、私は私の '地域配列'に似た配列からシェイプファイルを作ることについての情報を見つけることができません。

あなたの提案は何ですか?

+0

あなたは配列を持っている場合は、シェープファイルは必要ありません。 matplotlibパッチとして追加してください:http://matplotlib.org/devdocs/examples/shapes_and_collections/path_patch_demo.html –

+0

これは悪い例です。通常のPolygonPatchを使用すると、次のような問題が発生します。http://matplotlib.org/devdocs/examples/shapes_and_collections/artist_reference.html –

答えて

0

本当にありがとうございました。実際には、私の領域のエッジグリッドセルの座標でポリゴンを作成することで解決しました。

{

import numpy as np 
from netCDF4 import Dataset 

def getRegion(latnrs,lonnrs, latitude, longitude, lsm): 
lsm_globe = lsm 
for lat in range(0,len(latitude)): 
    for lon in range(0,len(longitude)): 
     if longitude[lon] < 1.5: 
      lsm_globe[lat,lon] = 0. 
     if longitude[lon] > 15: 
      lsm_globe[lat,lon] = 0. 
     if latitude[lat] < 48: 
      lsm_globe[lat,lon] = 0. 
     if latitude[lat] > 54: 
      lsm_globe[lat,lon] = 0. 

Region = lsm_globe 



import matplotlib.path as mpath 

coord_region = np.argwhere(Region>0) 

lats = np.zeros(len(coord_region)) 
lons = np.zeros(len(coord_region)) 
for i in range(len(coord_region)): 

    lats[i] = coord_region[i][0] 
    lons[i] = coord_region[i][1] 

uppergp = [] 
lowergp = [] 
for i in range(len(coord_region)-1): 
    if lats[i] < lats[i+1]: 
     uppergp.append([lats[i], lons[i]]) 
     lowergp.append([lats[i+1], lons[i+1]]) 
uppergp.append([lats[-1], lons[-1]]) 
lowergp.insert(0, [lats[0], lons[0]]) 
lowergp.reverse() 
boundgp = uppergp + lowergp 


vertlist = []  
for i in range(len(boundgp)): 
    vertlist.append((longitude[int(boundgp[i][1])]+1.125/2., latitude[int(boundgp[i][0])]-1.125/2.)) 

verts = vertlist 
# adding last vert to list to close poly 
verts.append(verts[-1]) 


Path = mpath.Path 
lineto = Path.LINETO 
codes = [Path.MOVETO, Path.CLOSEPOLY] 
for i in range(len(boundgp)-1): 
    codes.insert(1, lineto) 


boundgpcoord = mpath.Path(verts, codes) 
return boundgpcoord, Region 

}

+0

これは囲まれた領域でのみ機能します。世界陸上海洋マスク(lsm)はERA-Iアーカイブからダウンロードされ、ここでは 'for latとfor lon loop'によって行われ、希望の地域を得るために切り詰められました。 –

関連する問題