2012-09-03 6 views
10

Poszukuję sposobu na wykreślenie wypełnionych prostokątów na mapie bazowej. Mogłabym łatwo narysować krawędzie prostokąta za pomocą metody drawgreatcircle, ale nie mogę znaleźć sposobu na wypełnienie tych prostokątów (podając kolor i alfa).Jak narysować prostokąty na mapie bazowej

Odpowiedz

24

Możesz dodać matplotlib.patches.Polygon() bezpośrednio do swoich osi. Pytanie brzmi, czy chcesz, aby twoje prostokąty definiowały współrzędne wykresu (proste linie na wykresie) lub współrzędne mapy (wielkie koła na wykresie). Tak czy inaczej, określasz wierzchołki we współrzędnych mapy, a następnie przekształcasz je, aby wykreślać współrzędne, wywołując instancję Basemap (m() w poniższym przykładzie), samodzielnie zbudujesz Wielokąt i dodajesz go ręcznie do wyświetlanych osi.

Dla prostokąty określonych w działce współrzędne, oto przykład:

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

Dla prostokątów w określonych współrzędnych map przy użyciu tej samej metody, ale interpolacji linię w przestrzeni mapy przed przekształceniem działki współrzędnych. Dla każdego odcinka linii, trzeba zrobić:

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

Następnie przekształcić te współrzędne mapy działki współrzędnych (jak wyżej, z m()) i ponownie utworzyć wielokąt o współrzędnych wykresu.

1

Podobny odpowiedź powyżej, ale bardziej podstawowe Kod:

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