Rasterkarten in Python zeichnen?

8

Ich versuche, eine Rasterkarte mit Pyhton zu zeichnen. Das Bild wird nicht gespeichert, obwohl es angezeigt wird. Darüber hinaus erscheinen Pixel nicht genau an der Stelle. Ich erhalte ein Bild wie unten gezeigt (was FALSCH ist, aber die Lat-Lon-Kennzeichnung ist korrekt.)

Geben Sie hier die Bildbeschreibung ein

Unten finden Sie die korrekte Ausrichtung, die ich aus ArcGIS exportiert habe. Geben Sie hier die Bildbeschreibung ein

Es ist ein Fehler, das Pixel an der richtigen Stelle zu platzieren, aber ich verstehe es nicht. Wie kann ich das korrigieren?

Hier ist mein Skript.

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
quelle
Hast du es versucht imshowanstatt pcolormesh? Standardmäßig wird eine andere Ecke als Bildursprung verwendet.
Landsmann
Wenn ich ersetzen pcolormeshmit imshowihm sagt Nameerror: name ‚imshow‘ ist nicht definiert So verwenden `imshow‘ hier? @ Countryman
Mario
Hier sind einige wirklich gute Beispiele: matplotlib.org/basemap/users/examples.html
Landsmann
1
Es ist nach oben und unten
@DanPatterson Ich habe keine Ahnung, bitte schauen Sie in mein Skript, um herauszufinden, wo ich es vermassle.
Mario

Antworten:

6

Ich habe dieses Problem gelöst.

Ich las die Rasterdatei zeilenweise von oben nach unten und zeichnete sie zeilenweise von unten nach oben.

Da ich mit dem Plotten nichts anfangen kann, habe ich das Array umgedreht und es hat funktioniert.

Unten ist die Modifikation, die ich gemacht habe,

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