Seltsame Koordinaten nach der Konvertierung des Numpy-Arrays in ein Raster

Jan 03 2021

Ich habe das NumPy-Array und seine Begrenzungsrahmenkoordinaten. Ich habe versucht, es basierend auf dieser Antwort mit Rasterio in ein Raster zu konvertieren , und es hat es als Raster gespeichert, aber wenn ich rasterio.show verwende, sind die Koordinaten sehr falsch.

Dies ist das Skript, das ich verwendet habe:

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)

Wie Sie sehen können, sind die Zahlen absolut nicht die richtigen Koordinaten.

Mein Endziel: das NumPy-Array korrekt in WGS84 projizieren zu können.

* Dieser Beitrag bezieht sich auch auf diesen Beitrag

Antworten

2 gene Jan 03 2021 at 21:44

Sie berichten nicht, dass dies eine Suite von Reproject a NumPy Array mit affiner Transformation ist, wo Sie verwendenrasterio.transform.from_bounds

Aus dem Modul rasterio.transform

rasterio.transform.from_bounds (West, Süd, Ost, Nord, Breite, Höhe)
Gibt eine affine Transformation mit gegebenen Grenzen, Breite und Höhe zurück.
Geben Sie eine affine Transformation für ein georeferenziertes Raster aufgrund seiner Grenzen nach Westen, Süden, Osten, Norden und seiner Breite und Höhe in Pixel zurück.

Und

rasterio.transform.from_origin (West, Nord, xsize, ysize) Gibt
eine affine Transformation bei gegebener Größe oben links und Pixelgröße zurück.
Geben Sie eine affine Transformation für ein georeferenziertes Raster mit den Koordinaten der oberen linken Ecke West, Nord und den Pixelgrößen xsize, ysize zurück.

Es ist nicht dasselbe und die Ergebnisse sind unterschiedlich

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)

Neu

Die vier Ecken des Rasters von der Grenze (Breite = 1103, Höhe = 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()

Die Transformation

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