Coordonnées étranges après la conversion d'un tableau numpy en raster

Jan 03 2021

J'ai le tableau NumPy et ses coordonnées de boîte englobante. J'ai essayé de le convertir en raster en utilisant rasterio, sur la base de cette réponse , et il l'a enregistré en tant que raster, mais lorsque j'utilise rasterio.show, les coordonnées sont très fausses.

Voici le script que j'ai utilisé:

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)

Comme vous pouvez le voir, les nombres ne sont absolument pas les bonnes coordonnées.

Mon objectif final: pouvoir reprojeter correctement le tableau NumPy en WGS84.

* Cet article concerne également cet article

Réponses

2 gene Jan 03 2021 at 21:44

Vous ne signalez pas qu'il s'agit d'une suite de Reprojecter un tableau NumPy avec une transformation affine où vous utilisezrasterio.transform.from_bounds

Depuis le module rasterio.transform

rasterio.transform.from_bounds (ouest, sud, est, nord, largeur, hauteur)
Renvoie une transformation affine en fonction des limites, de la largeur et de la hauteur.
Renvoie une transformation affine pour un raster géoréférencé en fonction de ses limites ouest, sud, est, nord et de sa largeur et hauteur en nombre de pixels.

Et

rasterio.transform.from_origin (west, north, xsize, ysize)
Renvoie une transformation affine en fonction de la taille en haut à gauche et des pixels.
Renvoie une transformation affine pour un raster géoréférencé en fonction des coordonnées de son coin supérieur gauche ouest, nord et des tailles de pixels xsize, ysize.

Ce n'est pas la même chose et les résultats sont différents

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)

Nouveau

Les quatre coins du raster à partir de la limite (largeur = 1103, hauteur = 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()

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