Viac

Prečo základná mapa pyproj a matplotlib prinášajú rôzne výsledky, keď prevádzajú moje údaje v šírke do CRS?


Zdá sa, že základná mapa pyproj a matplotlib vytvára rôzne hodnoty x-y, keď prevádzajú moje údaje o šírke do rovnakého CRS (napríklad Albersova rovnaká oblasť). Tieto hodnoty x-y majú tendenciu byť mimo stoviek metrov. Asi robím niečo zle, ale neviem prísť na to, čo.

Tu je môj kód (túto otázku som tiež odoslal na StackOverflow). Vezmem lat/lon a prevediem ho na definovaný CRS (Albers) pomocou základnej mapy a potom pyproj:

from mpl_toolkits.basemap import Basemap from pyproj import Proj, transform lat = 48.57446 lon = 9.066455 # zadajte šírku a výšku domény mapy v projekčných súradniciach (metroch) map_width_m = 4000 * 1000. # 4000 km map_height_m = 2500 * 1000. # 2 500 km # definovať môj predpokladaný CRS ako albery s rovnakou plochou albers_crs = {'proj': 'aea', 'lat_1': 35., 'Lat_2': 55., 'Lon_0': 10., 'Lat_0': 45., 'x_0': map_width_m/2., 'y_0': map_height_m/2.} # prvý bod premietnite pomocou mpl základná mapa m = základná mapa (šírka = mapa_šířka_m, výška = výška_mapy_m, projekcia = albers_crs ['proj'], lat_1 = albers_crs ['lat_1'], lat_2 = albers_crs ['lat_2'], lon_0 = albers_crs ['lon_0'], lat_0 = albers_crs ['lat_0']) basemap_x, basemap_y = m (lon, lat) print 'basemap:', basemap_x , basemap_y # teraz premietnite bod pomocou pyproj pyproj_convert = Proj (albers_crs) pyproj_x, pyproj_y = pyproj_convert (lon, lat) print 'pyproj:', pyproj_x, pyproj_y # aký je rozdiel medzi týmito dvoma v metroch? vytlačiť 'rozdiel:', basemap_x - pyproj_x, basemap_y - pyproj_y

Výkon:

podkladová mapa: 1932284.3542 1653858.27802 pyproj: 1932077.41654 1653737.11296 rozdiel: 206,937659041 121,165060601

Ako vidíte, moje x sú od seba 207 metrov a moje y sú od seba 121 metrov. To isté platí pre ďalšie projekcie, ako napríklad Lambert Conformal Conic. V tejto množine údajov mám niekoľko stoviek bodov priestorových údajov a tieto ďalšie vstupy lat/lon môžu produkovať hodnoty x-y zo základného mapy a pyproja, ktoré sú od seba vzdialené 1000 metrov. Ak v definícii CRS nastavím zemepisnú šírku a dĺžku falošného pôvodu na rovnakú hodnotu ako moje lat a lon premenné (vyššie), základná mapa a pyproj vytvoria rovnaké hodnoty x a y. Potrebujem však nastaviť zemepisnú šírku a dĺžku falošného pôvodu do stredu mapy (aby som ju vycentroval do stredu celého súboru svojich priestorových údajov).

Prečo podkladová mapa a pyproj prinášajú rôzne výsledky? Prečo basemap a pyproj nevytvárajú presne rovnaké hodnoty x a y vzhľadom na presne rovnakú lat/lon a presne rovnakú definíciu CRS?


Správnym riešením je použiťm.proj4stringa nie priamo albers_crs, pretože to nie je „platný“ reťazec Proj4 (aj keď zdanlivo funguje: hlavná os alebo polomer = 0 nie je uvedené)

tlač m.proj4string ' +lon_0 = 10,0 +y_0 = 1250000.0 +R = 6370997.0 +proj = aea +x_0 = 2000000.0 +jednotky = m +lat_2 = 55,0 +lat_1 = 35,0 +lat_0 = 45,0' # tak pyproj_convert = Proj (m. proj4string) pyproj_x, pyproj_y = pyproj_convert (lon, lat) vytlačiť 'pyproj:', pyproj_x, pyproj_y pyproj: 1932284.3542 1653858.27802

Výsledok môžete ovládať pomocou modulu Python GDAL

z osgeo import osr from_srs = osr.SpatialReference () from_srs.ImportFromEPSG (4326) to_srs = osr.SpatialReference () to_srs.ImportFromProj4 (m.proj4string) transf = osr.CoordinateTransformation (from_srs, ) [: 2] (1932284.3541970258, 1653858.278018097)


Pozri si video: Keď uvidíte tieto mapy Slovenska, už nikdy sa na naň nebudete pozerať rovnako (Septembra 2021).