Koordinat aneh setelah mengubah array numpy menjadi raster

Jan 03 2021

Saya memiliki array NumPy dan koordinat kotak pembatasnya. Saya telah mencoba mengubahnya menjadi raster menggunakan rasterio, berdasarkan jawaban ini , dan itu menyimpannya sebagai raster, tetapi ketika saya menggunakan rasterio. menunjukkan koordinatnya sangat salah.

Ini adalah skrip yang telah saya gunakan:

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)

Seperti yang Anda lihat, angka-angka tersebut sama sekali bukan koordinat yang benar.

Tujuan akhir saya: untuk dapat memproyeksikan ulang array NumPy ke WGS84 dengan benar.

* Postingan ini juga terkait dengan postingan ini

Jawaban

2 gene Jan 03 2021 at 21:44

Anda tidak melaporkan bahwa ini adalah rangkaian dari memproyeksikan ulang array NumPy dengan transformasi affine di mana Anda menggunakanrasterio.transform.from_bounds

Dari modul rasterio.transform

rasterio.transform.from_bounds (barat, selatan, timur, utara, lebar, tinggi)
Mengembalikan transformasi Affine dengan batasan, lebar dan tinggi.
Kembalikan transformasi Affine untuk raster bergeoreferensi yang diberi batas barat, selatan, timur, utara, serta lebar dan tingginya dalam jumlah piksel.

Dan

rasterio.transform.from_origin (west, north, xsize, ysize)
Mengembalikan transformasi Affine berdasarkan kiri atas dan ukuran piksel.
Kembalikan transformasi Affine untuk raster bergeoreferensi dengan koordinat sudut kiri atas barat, utara dan ukuran piksel xsize, ysize.

Ini bukanlah hal yang sama dan hasilnya berbeda

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)

Baru

Keempat sudut raster dari batas (lebar = 1103, tinggi = 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()

Transformasi

 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()