Dziwne współrzędne po konwersji tablicy numpy na raster

Jan 03 2021

Mam tablicę NumPy i jej współrzędne pola ograniczającego. Próbowałem przekształcić go w raster za pomocą rasterio, w oparciu o tę odpowiedź , i zapisał go jako raster, ale kiedy używam rasterio.pokaż współrzędne są bardzo złe.

Oto skrypt, którego użyłem:

bbox_coords_wgs84=[-101.7359960059834, 20.21904081937658, -100.5717967351885, 20.8312118894487]

#variables for the projection:
minx=bbox_coords_wgs84[0]
maxy=bbox_coords_wgs84[3]
pixel_size= 10

#according to the post on GIS SO:

import rasterio
from rasterio.transform import from_origin

transform=from_origin(minx,maxy,pixel_size,pixel_size)
crs_img='EPSG:4326'


with rasterio.open('test1.tif', 
                    'w',
                    driver='GTiff',
                    height=ndvi.shape[0],
                    width=ndvi.shape[1],
                    count=1,
                    dtype=ndvi.dtype,
                    crs=crs_img,
                    nodata=None, # change if data has nodata value
                    transform=transform) as dst:
        dst.write(ndvi, 1)
 
#display the results:

from matplotlib import pyplot
from rasterio.plot import show

src = rasterio.open('test1.tif')
show(src)

Jak widać, liczby absolutnie nie są poprawnymi współrzędnymi.

Mój cel końcowy: móc poprawnie odwzorować tablicę NumPy na WGS84.

* Ten post dotyczy również tego postu

Odpowiedzi

2 gene Jan 03 2021 at 21:44

Nie zgłaszasz, że jest to zestaw Reproject tablicy NumPy z transformacją afiniczną, w której używaszrasterio.transform.from_bounds

Z modułu rasterio.transform

rasterio.transform.from_bounds (zachód, południe, wschód, północ, szerokość, wysokość)
Zwraca transformację afiniczną, podając granice, szerokość i wysokość.
Zwróć transformację afiniczną dla georeferencyjnego rastra, biorąc pod uwagę jego granice na zachód, południe, wschód, północ oraz jego szerokość i wysokość w liczbie pikseli.

I

rasterio.transform.from_origin (zachód, północ, xsize, ysize)
Zwraca transformację afiniczną z podanym lewym górnym i wielkością pikseli.
Zwróć transformację afiniczną dla georeferencyjnego rastra, biorąc pod uwagę współrzędne jego lewego górnego rogu, zachodni, północ i rozmiar pikseli xsize, ysize.

To nie to samo, a wyniki są różne

rasterio.transform.from_bounds( -101.7359960059834,20.21904081937658,-100.5717967351885,20.8312118894487,1103,2039)
Affine(0.0010554843796871222, 0.0, -101.7359960059834,
   0.0, -0.0003002310299519955, 20.8312118894487)

rasterio.transform.from_origin(-101.7359960059834,20.8312118894487,10,10)
Affine(10.0, 0.0, -101.7359960059834,
   0.0, -10.0, 20.8312118894487)

Nowy

Cztery rogi rastra od granicy (szerokość = 1103, wysokość = 2039)

fig,ax = plt.subplots()
ax.plot(0,0,'ro')
ax.plot(1103,0,'bo')
ax.plot(0,2039,'go')
ax.plot(1103,2039,'co')
plt.show()

Transformacja

 trans = rasterio.transform.from_bounds(-101.7359960059834,20.21904081937658-100.5717967351885,20.8312118894487,1103,2039)

 
trans*(0,0)
(-101.7359960059834, 20.8312118894487)
trans*(1103,0) 
(-100.5717967351885, 20.8312118894487)
trans*(0,2039) 
(-101.7359960059834, 20.21904081937658)
trans*(1103,2039)
(-100.5717967351885, 20.21904081937658)

fig,ax = plt.subplots()
ax.plot(*(trans*(0,0)),'ro')
ax.plot(*(trans*(1103,0)),'bo')
ax.plot(*(trans*(0,2039)),'go')
ax.plot(*(trans*(1103,2039)),'co')
plt.show()