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
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.
Widziałem problem zgłaszane here. Ale
ax.set_global()
wyniki w tym obrazie:
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:
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. –