Tracer des cartes raster en python?

8

J'essaie de tracer une carte raster en utilisant Pyhton. L'image n'est pas enregistrée, bien qu'elle apparaisse. De plus, les pixels n'apparaissent pas à l'endroit exact. Je reçois l'image comme indiqué ci-dessous (ce qui est faux, cependant, l'étiquetage lat-lon est correct.)

entrez la description de l'image ici

Vous trouverez ci-dessous l'orientation correcte, que j'ai exportée depuis ArcGIS. entrez la description de l'image ici

Il y a une erreur en plaçant le pixel au bon endroit, mais je ne l'obtiens pas. Comment le corriger?

Voici mon script.

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from osgeo import gdal
from numpy import linspace
from numpy import meshgrid
import numpy as 

#################################################################################

ds = gdal.Open('Path\\To\\Raster.tif')
data = ds.ReadAsArray()

gt = ds.GetGeoTransform()   
proj = ds.GetProjection()

#################################################################################

xres = gt[1]
yres = gt[5]

xmin = gt[0] + xres * 0.5
xmax = gt[0] + (xres * ds.RasterXSize) - xres * 0.5
ymin = gt[3] + (yres * ds.RasterYSize) + yres * 0.5
ymax = gt[3] - yres * 0.5

x_center=(xmin+xmax)/2
y_center=(ymin+ymax)/2    
#################################################################################

fig = plt.figure(figsize=(18, 10))
ax = fig.add_subplot(111, axisbg='w', frame_on=True)

m = Basemap(llcrnrlon=xmin,llcrnrlat=ymin,urcrnrlon=xmax,urcrnrlat=ymax,
             projection='tmerc', lat_0 = y_center, lon_0 = x_center)

parallels = np.arange(15.,30.,0.25)
m.drawparallels(parallels,labels=[1,0,0,0],fontsize=12, linewidth=0.4) 

meridians = np.arange(70.,90.,0.25)
m.drawmeridians(meridians,labels=[0,0,0,1],fontsize=12, linewidth=0.4)

x = linspace(0, m.urcrnrx, data.shape[1])
y = linspace(0, m.urcrnry, data.shape[0])

xx, yy = meshgrid(x, y)

m.pcolormesh(xx, yy, data, cmap=plt.cm.jet)

plt.show()
plt.savefig('Path\\To\\Save_Image.png', bbox_inches='tight', pad_inches=.2, dpi=600)    
Mario
la source
Avez-vous essayé imshowau lieu de pcolormesh? Il prend un coin différent comme origine de l'image par défaut.
compatriote
Quand je remplace pcolormeshavec imshowelle dit NameError: nom « imshow » est pas défini Comment utiliser `imshow ici? @countryman
Mario
Voici de très bons exemples: matplotlib.org/basemap/users/examples.html
compatriote
1
il est retourné vers le bas si vous avez inversé l'origine du raster qui peut être en bas à gauche ou en haut à gauche dans certaines applications
@DanPatterson Je n'en ai aucune idée, veuillez jeter un œil à mon script pour savoir où je le gâche.
Mario

Réponses:

6

J'ai résolu ce problème.

Je lisais le fichier raster en ligne de haut en bas et je le traçais en ligne de bas en haut.

Depuis, je ne peux rien faire avec le traçage, j'ai inversé le tableau, et cela a fonctionné.

Voici la modification que j'ai apportée,

ds = gdal.Open('Path\\To\\Raster.tif')
data = ds.ReadAsArray()
data = np.flipud(data)
Mario
la source