2017-01-05 4 views
0

J'ai défini une région d'intérêt où j'ai suivi, par ex. évaporation dans le temps. Maintenant je veux représenter cette région sur une parcelle de fond de carte en traçant seulement ses limites. La région est définie comme un groupement lat/lon (presque) global rempli seulement avec 1 aux coordonnées de la Région (comme un masque terrestre/marin, mais pour ma région spécifique). Si les gens veulent tracer les limites d'une certaine géométrie, ils se réfèrent souvent à des fichiers de formes (que je ne connais pas), mais cela semble être un moyen facile de créer un polygone et de tracer ce polygone sur un fond de carte. Cependant, je ne trouve pas d'informations sur la création d'un fichier de formes à partir d'un tableau similaire à mon 'tableau de régions'.Limites de tracé d'une région spécifique dans la carte de base

Quelle est votre suggestion?

+0

Si vous avez un tableau, vous n'avez pas besoin d'un fichier de formes. il suffit de l'ajouter comme patch matplotlib: http://matplotlib.org/devdocs/examples/shapes_and_collections/path_patch_demo.html –

+0

C'est un mauvais exemple. L'utilisation d'un PolygonPatch régulier devrait suffire: http://matplotlib.org/devdocs/examples/shapes_and_collections/artist_reference.html –

Répondre

0

Merci pour les réponses, je l'ai résolu en faisant un polygone avec les coordonnées des cellules de bord-grille de ma région.

{

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

Cela ne fonctionnera que pour une région fermée. Le masque terrestre global (lsm) a été téléchargé à partir des archives de l'ERA-I et tronqué pour obtenir la région désirée, effectuée ici par la boucle «for lat and for lon». –