2012-09-03 2 views
10

Sto cercando un modo per tracciare rettangoli pieni su una mappa di base. Potrei facilmente disegnare i bordi del rettangolo usando il metodo drawgreatcircle, ma non riesco a trovare un modo per riempire effettivamente questi rettangoli (specificando il colore e l'alfa).Come disegnare rettangoli su una mappa di base

risposta

24

È possibile aggiungere un oggetto matplotlib.patches.Polygon() direttamente agli assi. La domanda è se vuoi che i tuoi rettangoli definiscano le coordinate della trama (linee rette sulla trama) o in coordinate della mappa (grandi cerchi sulla trama). In entrambi i casi, si specificano i vertici nelle coordinate della mappa e quindi li si trasformano in coordinate di stampa chiamando l'istanza di Basemap (m() nell'esempio seguente), si costruisce un poligono e lo si aggiunge manualmente agli assi da rendere.

Per i rettangoli definiti nella trama coordinate, ecco un esempio:

from mpl_toolkits.basemap import Basemap 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.patches import Polygon 

def draw_screen_poly(lats, lons, m): 
    x, y = m(lons, lats) 
    xy = zip(x,y) 
    poly = Polygon(xy, facecolor='red', alpha=0.4) 
    plt.gca().add_patch(poly) 

lats = [ -30, 30, 30, -30 ] 
lons = [ -50, -50, 50, 50 ] 

m = Basemap(projection='sinu',lon_0=0) 
m.drawcoastlines() 
m.drawmapboundary() 
draw_screen_poly(lats, lons, m) 

plt.show() 

Per i rettangoli definiti coordinate della mappa, utilizzare lo stesso approccio, ma interpolare la vostra linea in mappa spazio prima di trasformarsi per tracciare le coordinate. Per ogni segmento di linea, dovrete fare:

lats = np.linspace(lat0, lat1, resolution) 
lons = np.linspace(lon0, lon1, resolution) 

Poi trasformare queste coordinate della mappa per tracciare le coordinate (come sopra, con m()) e di nuovo creare un poligono con le coordinate di trama.

1

risposta Simile alla precedente, ma il codice più fondamentale:

from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt 
from matplotlib.patches import Polygon 

map = Basemap(projection='cyl') 

map.drawmapboundary(fill_color='aqua') 
map.fillcontinents(color='coral',lake_color='aqua') 
map.drawcoastlines() 

x1,y1 = map(-25,-25) 
x2,y2 = map(-25,25) 
x3,y3 = map(25,25) 
x4,y4 = map(25,-25) 
poly = Polygon([(x1,y1),(x2,y2),(x3,y3),(x4,y4)],facecolor='red',edgecolor='green',linewidth=3) 
plt.gca().add_patch(poly) 

plt.show()