2017-01-05 5 views
0

Я определил интересующую область, где я отслеживал, например. испарение во времени. Теперь я хочу изобразить этот регион на участке базовой карты, построив только его границы. Область определяется как (почти) глобальная матрица lat/lon, заполненная только 1 в координатах Региона (например, маска земли/моря, но для моего конкретного региона).Границы участка конкретного региона в базовой карте

Если люди хотят строить границы определенной геометрии, они часто ссылаются на шейп-файлы (которые я не знаком), но это простой способ создать многоугольник и построить этот многоугольник на базовой карте. Тем не менее, я не могу найти информацию о создании шейп-файла из массива, подобного моему «Region array».

Какое ваше предложение?

+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 и усечена для получения желаемой области, сделанной здесь «для lat и для lon loop». –

Смежные вопросы