¿Trazar mapas ráster en python?

8

Estoy tratando de trazar un mapa ráster con Pyhton. La imagen no se está guardando, aunque aparece. Además, los píxeles no aparecen en el lugar exacto. Estoy obteniendo la imagen como se muestra a continuación (que es INCORRECTO, sin embargo, el etiquetado lat-lon es correcto).

ingrese la descripción de la imagen aquí

A continuación se muestra la orientación correcta, que he exportado desde ArcGIS. ingrese la descripción de la imagen aquí

Hay algún error al colocar el píxel en la ubicación correcta, pero no puedo obtenerlo. ¿Cómo corregirlo?

Aquí está mi guión.

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
fuente
¿Has probado en imshowlugar de pcolormesh? Toma una esquina diferente como origen de la imagen por defecto.
paisano
Cuando lo reemplazo pcolormeshcon imshowél dice NameError: el nombre 'imshow' no está definido ¿Cómo usar 'imshow' aquí? @countryman
Mario
Aquí hay algunos ejemplos realmente buenos: matplotlib.org/basemap/users/examples.html
countryman
1
se voltea hacia arriba si se volteó el origen del ráster que puede estar en la parte inferior izquierda o superior izquierda en algunas aplicaciones
@DanPatterson No tengo idea, por favor, eche un vistazo a mi script para encontrar dónde lo estoy metiendo.
Mario

Respuestas:

6

Resolví este problema.

Estaba leyendo el archivo ráster en fila de arriba a abajo, y dibujándolo en fila de abajo hacia arriba.

Como no puedo hacer nada tramando, volteé la matriz y funcionó.

A continuación se muestra la modificación que hice,

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