Vairāk

Kā iegūt vērtību no rastra, pamatojoties uz latiem un loniem?

Kā iegūt vērtību no rastra, pamatojoties uz latiem un loniem?


Man ir vairāki netcdf faili, kurus es varu izlasīt, izmantojot pitCon bibliotēku netCDF4. Dati tiek sagrupēti 4320 rindās un 2160 kolonnās.

Man ir arī saraksts ar lat / lon (decimālgrādos), un es cenšos atrast tīkla koordinātu vērtību, kurā atrodas koordinātas.

Pašlaik es ar vienkāršu lineāru transformāciju pārveidoju koordinātas par režģa robežu un vaicāju netcdf failam, izmantojot šos jaunos punktus. Vai šī pieeja ir derīga?

# prelim from netCDF4 import Datu kopas importēšanas skaits kā np # koordinātu dati lons = [40.822651, 40.69685, 40.750038, 40.798931, 40.74612] lati = [19.83832, 20.007561, 19.97426, 19.86334, 19.843889] # atrodiet režģa līniju robežas, kas atbilst lat / = np.ceil (12 * (lons + 180)) lats_grid = np.ceil (12 * (lats + 90)) # atrast vērtību režģī par norādīto lat / lon fnc = Datu kopa (filename.nc, 'r') lat = fnc.variables ['platums'] [:] lon = fnc.variables ['garums'] [:] mainīgais = fnc.variables ['mainīgais'] [:] drukas mainīgais [lons_grid, lats_grid]

Ja nē, vai ir veids, kā krustot punktu datus ar rastru Python, neizmantojot arcpy? (Mani netcdf faili ir ļoti lieli, un tos nevar nolasīt ar arcpy.)


Ja jūs zināt tīkla pikseļu / šūnu izmēru un minimālo lon / lat, tas ir vienkāršs aprēķins.

px = (lon - minlon) / xcellsize py = (lat - minlat) / ycellsize

Varat arī izmantot min / max lon / lat un kolonnu / rindu skaitu:

xcellsize = (maxlon - minlon) / ncols ycellsize = (maxlat - minlat) / nrows # tad izmantojiet iepriekšējo aprēķinu, lai iegūtu pikseļu koordinātas

Lai iegūtu atbilstošās šūnu koordinātas no platuma un garuma, jums jāzina netCDF faila pārklājums (piemēram, augšējās kreisās šūnas koordinātas un šūnu lielums x un y virzienos). @Luke zemāk esošais risinājums darbojas srtaight x / y rastram bez šūnu pagriešanas. Ja jums tā nav, varat apskatīt afinēt bibliotēka, lai pārveidotu platumu un garumu par šūnu koordinātām. Ņemot vērā GDAL GeoTransform formā:

  1. Augšējā kreisā šūnaxkoordinēt
  2. xšūnu lielums prognozētajās vienībās
  3. xvirziena rotācija (parasti 0)
  4. Augšējā kreisā šūnaykoordinēt
  5. yvirziena rotācija (parasti 0)
  6. Negatīvsyšūnu lielums prognozētajās vienībās

Tā, piemēram,-237481.5, 425.0, 0.0, 237536.4, 0.0, -425.0tulkotu kā rastra augšējo kreiso šūnu ar koordinātām-237481.5, 237536.4un a425.0vienības kvadrāts bez rotācijas.

Izmantojotafinētbibliotēkā, jūs varat to pārveidot par transformācijas objektu šādi:

no afīnu importa Affine aff = Affine.from_gdal (-237481,5, 425,0, 0,0, 237536,4, 0,0, -425,0)

Kas var pārveidot šūnu koordinātas par projektētām koordinātām:

xs = np.array ([0, 1, 2]) ys = np.array ([3, 4, 5]) x_coords, y_coords = aff * (xs, ys)

Vai (jūsu gadījumā) no koordinātām atpakaļ uz šūnu koordinātām:

xs, ys = ~ aff * (np.loks (lons), np.loks (latos)

Šīs vērtības ir pludiņi, tāpēc jums tās būs jāpārveido par veseliem skaitļiem, lai iegūtu šūnu koordinātas, kuras varat izmantot.

xs = np.round (xs) .astype (np.int) ys = np.round (ys) .astype (np.int)

Pēc tam jūs varat tos izmantot kā indeksus savam netCDF4 masīvam (izmantojiet jaunāko netCDF4 versiju - 1.2.1, jo tas nozīmē, ka jums nav nepieciešams kārtot vai noņemt dublikātus).

mainīgais = fnc.variables ['variable'] [xs, ys] # esiet piesardzīgs attiecībā uz rādītāja secību

Tas atgriezīs kvadrātveida masīvu nedaudz atšķirīgas netCDF indeksēšanas dēļ, taču faktiskās vērtības, kuras esat pēc diagnozes, varat iegūt:

vērtības = mainīgais. diagonāle ()

Skatīties video: Latvijas lati 1993 - 2013 pirms Latvijas eiro Latvian money Lats