2012-09-03 5 views
10

Je cherche un moyen de tracer des rectangles remplis sur un fond de carte. Je pourrais facilement dessiner les bords du rectangle en utilisant la méthode drawgreatcircle, mais je ne trouve pas un moyen de remplir réellement ces rectangles (en spécifiant la couleur et l'alpha).Comment dessiner des rectangles sur un fond de carte

Répondre

24

Vous pouvez ajouter un matplotlib.patches.Polygon() directement à vos axes. La question est de savoir si vous voulez que vos rectangles définissent les coordonnées de l'intrigue (lignes droites sur l'intrigue) ou les coordonnées de la carte (grands cercles sur l'intrigue). Dans les deux cas, vous spécifiez des sommets dans les coordonnées de la carte, puis les transformez en coordonnées de tracé en appelant l'instance de fond de carte (m() dans l'exemple ci-dessous), créez un polygone et ajoutez-le manuellement aux axes à rendre.

Pour les rectangles définis dans la parcelle coordonnées, voici un exemple:

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() 

Pour les rectangles définis en coordonnées cartographiques, utiliser la même approche, mais interpoler votre ligne dans l'espace de carte avant de se transformer pour tracer les coordonnées. Pour chaque segment de ligne, vous aurez à faire:

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

transform Ensuite, ces coordonnées de la carte pour tracer les coordonnées (comme ci-dessus, avec m()) et à nouveau créer un Polygon avec les coordonnées de terrain.

1

réponse similaire ci-dessus, mais le code plus basique:

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() 
Questions connexes