Merencanakan peta raster dengan python?

8

Saya mencoba merencanakan peta raster menggunakan Pyhton. Gambar tidak disimpan, meskipun muncul. Selain itu, piksel tidak muncul di tempat yang tepat. Saya mendapatkan gambar seperti yang ditunjukkan di bawah ini (yang SALAH, namun, pelabelan lat-lon benar.)

masukkan deskripsi gambar di sini

Di bawah ini adalah orientasi yang benar, yang telah saya ekspor dari ArcGIS. masukkan deskripsi gambar di sini

Ada beberapa kesalahan dalam menempatkan piksel di lokasi yang benar, tapi saya tidak mengerti. Bagaimana cara memperbaikinya?

Ini skrip saya.

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
sumber
Apakah Anda mencoba imshowbukan pcolormesh? Dibutuhkan sudut berbeda sebagai asal gambar secara default.
senegaranya
Ketika saya ganti pcolormeshdengan imshowitu mengatakan NameError: nama 'imshow' tidak didefinisikan Cara menggunakan `imshow 'di sini? @countryman
Mario
Berikut adalah beberapa contoh yang benar-benar bagus: matplotlib.org/basemap/users/examples.html
countryman
1
itu dibalik ke atas apakah Anda membalik asal raster yang dapat berupa kiri bawah atau kiri atas dalam beberapa aplikasi
@DanPatterson Saya tidak tahu, silakan lihat skrip saya untuk menemukan di mana saya mengacaukannya.
Mario

Jawaban:

6

Saya memecahkan masalah ini.

Saya membaca file raster dari sisi atas ke bawah, dan memplotnya dengan bijaksana dari bawah ke atas.

Karena, saya tidak bisa melakukan apa pun dengan merencanakan, saya membalik array, dan itu berhasil.

Di bawah ini adalah modifikasi yang saya buat,

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