2013-09-10 16 views
5

Mam pewne dane satelitarne, które chciałbym wyświetlić za pomocą kartoteki. Z powodzeniem podążam za przykładem obrazka szczegółowego here. Powstały w tym kodzie:Problemy z projekcją podczas wyświetlania obrazu na mapie z kartonikiem

import numpy as np 
import matplotlib.pyplot as plt 
import cartopy.crs as ccrs 

fig = plt.figure(figsize=(12, 12)) 
img_extent = (-77, -59, 9, 26) 

ax = plt.axes(projection=ccrs.PlateCarree()) 
# image data coming from server, code not shown 
ax.imshow(img, origin='upper', extent=img_extent) 
ax.set_xmargin(0.05) 
ax.set_ymargin(0.10) 

# mark a known place to help us geo-locate ourselves 
ax.plot(-117.1625, 32.715, 'bo', markersize=7) 
ax.text(-117, 33, 'San Diego') 

ax.coastlines() 
ax.gridlines() 

plt.show() 

Ten kod generuje Poniższy obraz wrong projection

Moim problemem jest to, że dane obrazu satelitarnego nie jest w projekcji PlateCarree, ale projekcja Mercator.

Ale kiedy się obiekt oś z

ax = plt.axes(projection=ccrs.Mercator()) 

tracę wybrzeża.

no coastlines

Widziałem problem zgłaszane here. Ale

ax.set_global() 

wyniki w tym obrazie:

where is my data

Dane nie jest obecny, a San Diego znajduje się w niewłaściwym miejscu. Zmieniły się także zakresy liczby całkowitej. Co ja robię źle?

Aktualizacja postu Dyskusja

Głównym problemem jest to, że nie miał właściwie określone stopnie w projekcji obrazu docelowego z metodą transform_points. Musiałam również opisać układ odniesienia współrzędnych w metodzie imshow, jak sugeruje Phil. Oto prawidłowy kod:

import numpy as np 
import matplotlib.pyplot as plt 
import cartopy.crs as ccrs 

proj = ccrs.Mercator() 
fig = plt.figure(figsize=(12, 12)) 
extents = proj.transform_points(ccrs.Geodetic(), 
           np.array([-77, -59]), 
           np.array([9, 26])) 

img_extents = (extents[0][0], extents[1][0], extents[0][6], extents[1][7]) 

ax = plt.axes(projection=proj) 
# image data coming from server, code not shown 
ax.imshow(img, origin='upper', extent=img_extents,transform=proj) 

ax.set_xmargin(0.05) 
ax.set_ymargin(0.10) 

# mark a known place to help us geo-locate ourselves 
ax.plot(-117.1625, 32.715, 'bo', markersize=7, transform=ccrs.Geodetic()) 
ax.text(-117, 33, 'San Diego', transform=ccrs.Geodetic()) 

ax.coastlines() 
ax.gridlines() 

plt.show() 

Powstałe w ten poprawnie geoprojected zdjęcia satelitarne:

correct image

+1

My Cartopy 0,7 wybuchła po uaktualnieniu do MPL 1.3, więc nie mogę przetestuj to dla ciebie. Ale czy nie powinieneś określać współrzędnych danych, które tworzysz? Jeśli nie, uważam, że współrzędne są równe rzutom osi. Więc spróbuj dodać 'transform = ccrs.PlateCarree()' do poleceń kreślenia. –

Odpowiedz

4

Idealnie, starają się zawsze być specyficzne o systemie odniesienia Twoje dane są w podczas drukowania z cartopy (poprzez słowo kluczowe transform). Oznacza to, że możesz po prostu zamienić projekcje w swoim skrypcie, a dane zostaną automatycznie umieszczone we właściwym miejscu.

Tak więc w twoim przypadku plt.imshow powinien zawierać argument ze słowem kluczowym transform=ccrs.Mercator() (może być potrzebna bardziej specyficzna instancja Mercator). Jeśli twoje rozmiary są w geodezyjnym (łata i lon), musisz przekształcić obwiednię w współrzędne mercatora, ale poza tym wszystko inne powinno działać zgodnie z oczekiwaniami.

UWAGA: Zamierzam iść i zaktualizować example zawierać transformacji argumentu ;-) (PR: https://github.com/SciTools/cartopy/pull/343)

HTH

+0

Dzięki, dodałem aktualizację postów z poprawnym kodem. –

+0

Świetnie. Cieszę się, że to pomogło. Ładna fabuła :-) – pelson

Powiązane problemy