Lisää

Satunnaisen GDAL-rasterin luominen satunnaisilla ennalta määritetyillä arvoilla

Satunnaisen GDAL-rasterin luominen satunnaisilla ennalta määritetyillä arvoilla


Toistaiseksi olen kehittänyt alla olevan koodin, mutta jostain syystä se toimii vain sanoen yhdelle maankäyttöluokalle kahden sijaan. Kertoisitteko minulle, minne olen mennyt pieleen?

tuoda os, numpy, osgeo.gdal, math, random, sys osgeo.gdal-tiedostosta import * import osgeo.gdalconst, osgeo.ogr osgeo.gdal.AllRegister () driver = osgeo.gdal.GetDriverByName ('RST') driver .Register () ds = osgeo.gdal.Open ('landii.rst') cols = ds.RasterXSize rivit = ds.RasterYSize ds.GetProjection () tulosta 'colien lukumäärä on:', cols print 'rivien lukumäärä on:', rivit tulostavat 'Rasterilla on% s kaistaa'% ds.RasterCount geotransform = ds.GetGeoTransform () out = driver.Create ('chandal.rst', cols, rows, 1, osgeo.gdal.GDT_Byte) driver = ds.GetGeoTransform raster = numpy.zeros ((rivit, sarakkeet), dtype = numpy.int32) alueelle i alueella (rivit): alueelle j alueella (sarakkeet): coll = 0 rasteria [i] [j] = poista.GetRasterBand (1 ) .WriteArray (raster) perc = [0,65, 0,45] # perc on prosenttiosuus pikseleistä, jotka jaetaan maankäyttöön 1 ja kahteen nluokkaan = 2 vastaavasti alueella ii (nluokka): l = perc [ii] luku = int (sarakkeet * rivit * l) kun taas (luku> 0): rand1 = satunnainen. alue (rivit) rand2 = satunnainen. alue (sarakkeet) k = rasteri [rand1] [rand2] jos k == 0: raster [rand1] [rand2] = ii numero = numero - 1 out.

Paras vaihtoehto saada painotettu valinta on käyttää numpy.random.choice jonka avulla voit määrittää näytesarjan ja painon jokaiselle näytteelle. Huomaa, että todennäköisyyden on oltava täsmälleen 1.

raster = numpy.random.choice ([0, 1], koko = (rivit, sarakkeet), p = [0,65, 0,35])

Lisäksi lyhyt huomautus: kommenttisi kertoo todennäköisyyden, että maankäyttö tulisi kohdistaa 1 tai 2, mutta tietotyyppisi on binäärirasteri, jonka arvot voivat koskaan olla vain 0 tai 1. Sen sijaan sinun tulisi käyttää kokonaislukutyyppiä, jos haluat säilyttää arvot 1 ja 2;gdal.GDT_Int32

Lisäksi, jos haluat laajentaa koodiasi muutaman koodiongelman yläpuolelle:

  • Nollarasteriarvoja ei tarvitse asettaa ennalta nollaksi - se on jo tehty, kun taulukko alustetaannumpy.zeros.
  • Tasaisella tulorasterilla arvomääräon aina sama - tehokkaasticols * rivit * 0.45. Silmukkapercpäättyy ennen kuin määrität arvonmäärä.
  • Voit indeksoida 2D numpy-taulukonrasteri [rivi, col]
  • Lopuksi sen sijaan, että käyttäisin suoraan GDAL: ta, haluaisin tarkastella rasterio kirjasto, joka on paljon pythonimpi kääre GDAL: n ympärillä.

Katso video: QGIS Georeferencer GDAL Not Showing Solved? - 2020