Wrong coordinates returned by `AreaDefintion.get_lonlats` for some projections in out-of-Earth locations
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
Direzione di ricerca
Inizia eseguendo l’esempio di proiezione cartopy fornito e analizza AreaDefinition.get_lonlats(), get_proj_coords() e la chiamata inversa a pyproj Transformer mostrata nell’issue. Confronta i risultati al di fuori della Terra con i valori inf attesi per le proiezioni elencate, quindi aggiungi una copertura di regressione che dimostri la corretta gestione delle coordinate non valide e verifica che il ricampionamento non utilizzi più i valori errati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
In the context of https://github.com/pytroll/pyresample/pull/546, I was testing that the new boundary extraction methodology works for all projections available in cartopy, and I stumbled in wrong values returned by AreaDefinition.get_lonlats().
After a quick investigation, the error seems to arise from wrong results by pyproj transformations !
Here below I provide a code that enable to visualize the wrong coordinates as well as snapshot of what is going on for some of the problematic projections.
Problem description
The wrong results occurs only for some CRS in out-of-Earth locations.
Usually pyproj returns np.inf values in out-of-Earth locations, while with the projections listed below, AreaDefinition.get_lonlats() returns wrong/bad longitude/latitude values. In a couple of cases, even returns latitudes outside the (-90, 90) bounds.
NOTE1: These errors causes wrong resampling with pyresample !
NOTE2: Note that for all cartopy projections not listed below, pyproj returns the correct results !
Expected Output
Usually pyproj returns np.inf values in out-of-Earth locations.
Code Sample, a minimal, complete, and verifiable piece of code
import numpy as np
import pyproj
import cartopy
from pyresample.future.geometry import AreaDefinition
import matplotlib.pyplot as plt
list_bugs = [
cartopy.crs.EquidistantConic(central_longitude=0.0, central_latitude=0.0, false_easting=0.0, false_northing=0.0, standard_parallels=(20.0, 50.0), globe=None),
cartopy.crs.AzimuthalEquidistant(central_longitude=0.0, central_latitude=0.0, false_easting=0.0, false_northing=0.0, globe=None),
cartopy.crs.AlbersEqualArea(central_longitude=0.0, central_latitude=0.0, false_easting=0.0, false_northing=0.0, standard_parallels=(20.0, 50.0), globe=None),
cartopy.crs.LambertConformal(central_longitude=-96.0, central_latitude=39.0, false_easting=0.0, false_northing=0.0, standard_parallels=(33, 45), globe=None, cutoff=-30),
cartopy.crs.EqualEarth(central_longitude=0, false_easting=None, false_northing=None, globe=None),
cartopy.crs.Hammer(central_longitude=0, false_easting=None, false_northing=None, globe=None),
cartopy.crs.Sinusoidal(central_longitude=0.0, false_easting=0.0, false_northing=0.0, globe=None),
cartopy.crs.EckertI(central_longitude=0, false_easting=None, false_northing=None, globe=None),
cartopy.crs.EckertII(central_longitude=0, false_easting=None, false_northing=None, globe=None),
cartopy.crs.EckertIII(central_longitude=0, false_easting=None, false_northing=None, globe=None),
cartopy.crs.EckertIV(central_longitude=0, false_easting=None, false_northing=None, globe=None),
cartopy.crs.EckertV(central_longitude=0, false_easting=None, false_northing=None, globe=None),
cartopy.crs.EckertVI(central_longitude=0, false_easting=None, false_northing=None, globe=None),
]
cartopy_crs = list_bugs[1]
for cartopy_crs in list_bugs:
name = type(cartopy_crs).__name__
x_min, x_max = cartopy_crs.x_limits
y_min, y_max = cartopy_crs.y_limits
area_extent = [x_min, y_min, x_max, y_max]
proj_dict = cartopy_crs.to_dict()
shape = (200, 300)
area_def = AreaDefinition(
crs=proj_dict,
shape=shape,
area_extent=area_extent
)
lons, lats = area_def.get_lonlats()
plt.imshow(lons)
plt.title(name+"Longitude"); plt.colorbar()
plt.show()
plt.imshow(lats)
plt.title(name+" Latitude"); plt.colorbar()
plt.show()
To further investigate the erroneous results, just take values in the lower left corner (which are out of Earth in the specified projections) and look at the returned values:
from pyresample.geometry import get_geodetic_crs_with_no_datum_shift, TransformDirection, CRS
self = area_def
proj_wkt = self.crs_wkt
x, y = area_def.get_proj_coords(data_slice=(-1, 0))
crs = CRS.from_wkt(proj_wkt)
gcrs = get_geodetic_crs_with_no_datum_shift(crs)
transformer = pyproj.Transformer.from_crs(gcrs, crs, always_xy=True)
lon, lat = transformer.transform(x, y, direction=TransformDirection.INVERSE)
print(lon, lat) # should be inf, inf
Examples
Equidistant Conic
Azimuthal Equidistant
Albers Equal Area
Equal Earth
Lamber Conformal
Sinusoidal
Eckert
- Lingua principale
- Python
- Stelle
- 388
- Fork
- 103
- Merge medio
- 7g 4h
- PR unite (30g)
- 4
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di pytroll/pyresample
-
Geometry `__eq__` and `__hash__` violate Python's hash/equality contractForse di nuovo libera @pnuu l’ha presa 47 giorni fa e non c’è nessuna pull request aperta. Apertabug Priority-Medium
pytroll/pyresample#745 · 1 commento · 3 assegnatari ·
-
Improve resampler x/y coordinate metadataForse di nuovo libera @djhoese l’ha presa 66 giorni fa e non c’è nessuna pull request aperta. Apertabug
pytroll/pyresample#739 · 1 assegnatario ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 42/100
pytroll/pyresample#698 · 1 commento ·
-
`AreaDefinition.get_area_slices` doesn't work for cropped geostationary areas like SEVIRI RSSAperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 38/100
pytroll/pyresample#694 · 5 commenti ·
-
gradient_search comb effectForse di nuovo libera @mraspaud l’ha presa 386 giorni fa e non c’è nessuna pull request aperta. Aperta
pytroll/pyresample#682 · 7 commenti · 1 assegnatario ·
Tutte le issue di pytroll/pyresample
Issue simili
-
[Resource]: LoreApertaresource-submission validation-passed
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
hesreallyhim/awesome-claude-code#3234 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
openminion/openminion#376 ·
I maintainer di solito rispondono entro 1 giorno
-
Type: ☹︎ Bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
posit-dev/great-tables#1028 ·
I maintainer di solito rispondono entro 1 giorno
-
integration: apple_tv
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
home-assistant/core#188282 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
A "since" range is worded as a career: "the past two seasons" says "regular season career (2025 on)"ApertaP4: low
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
jeffknupp/association#538 ·