GDAL kullanarak vektör katmanı ile raster kırpma


26

Osgeo yükleyicisini kullanarak GDAL kurdum. Raster katmanı vektörel bir katmanla programlı olarak nasıl kesebilirim? Bana bu konuda yardımcı olabilecek herhangi bir GDAL API var mı? Python kullanıyorum.

Yanıtlar:


13

Ben emin gdal API hakkında, orada olduğum void* GDALWarpOptions::hCutlineiçinde Warp Options dan başvurulan Warp API öğretici , ancak hiçbir açık örnekleri. Programlı bir cevaba ihtiyacınız olduğuna emin misiniz? Komut satırı yardımcı programları bunu kutudan yapabilir:

  1. Sadece ilgilenilen alanı keserek çokgen içeren bir şekil dosyası oluşturun
  2. ogrinfokırpma şeklinin boyutunu belirlemek için kullanın
  3. gdal_translateşekil uzantılarını klipslemek için kullanın
  4. parametresi gdalwarpile kullanın-cutline

Adımları 2 & 3 sadece birlikte tarafından alabilir, optimizasyon içindir gdalwarp -cutline ....

Bkz GDAL çokgenler kullanarak Kırpma rasterları hepsi bir senaryo sarılmış linux tabanlı bir çözüm için Linfinity dan. Diğer bir kesimsel örnek ise, Michael Corey'in Mapnik için tepe tonları oluşturduğu öğreticisinde görülebilir .


Matt, trac.osgeo.org/gdal/ticket/1599 hatırlıyorum, cutline bunu yerine getiriyor gibi görünüyor
Mike T


10

Bu konu her zaman geri dönüyor gibi görünüyor. Ben GDAL> 1.8'in o kadar gelişmiş olduğunu bilmiyordum, bu işi yapmak için size zaten adil bir komut satırı kullanımı sağlıyor.

Mike Toews'in yorumu oldukça faydalıdır, ancak örneğin:

gdalwarp -of GTiff -cutline DATA/area_of_interest.shp -cl area_of_interest  -crop_to_cutline DATA/PCE_in_gw.asc  data_masked7.tiff 

Bu komutu, mükemmel alt işlem modülüyle bir python betiğine sarabilirsiniz .

Benim için gerçekten sorunlu olan şeylerden biri, bu soruna minimal bir çözüm sunmam gerektiği, mümkün olduğu kadar basit ve birçok dış bağımlılığa ihtiyaç duymadığım. Python Imaging Library'nin Joel Lawhead'in öğreticisinde olduğu gibi kullanımı gayet iyi, ama şu çözümü buldum: Numpy maskeli diziler kullanarak.
Daha iyi olup olmadığını bilmiyorum, ama bildiğim şeydi (3 yıl önce ...).
Başlangıçta orijinal raster içinde geçerli bir veri alanı yarattım (örneğin, çıktı rasterinin kapsamı aynıydı), ancak rasterin daha küçük (örneğin -crop_to_cutline) yapılması fikrini sevdim, bu yüzden world2PixelJoel Lawhead'den kabul ettim . İşte benim kendi çözümüm:

def RasterClipper():
    craster = MaskRaster()
    contraster2 = 'PCE_in_gw.aux'
    craster.reader("DATA/"+contraster2.replace('aux','asc'))
    xres, yres = craster.extent[1], craster.extent[1]
    craster.fillrasterpoints(xres, yres)
    craster.getareaofinterest("DATA/area_of_interest.shp")
    minX, maxX=craster.new_extent [0]-5,craster.new_extent[1]+5
    minY, maxY= craster.new_extent [2]-5,craster.new_extent[3]+5
    ulX, ulY=world2Pixel(craster.extent, minX, maxY)
    lrX, lrY=world2Pixel(craster.extent, maxX, minY)
    craster.getmask(craster.corners)
    craster.mask=np.logical_not(craster.mask)
    craster.mask.resize(craster.Yrange.size,craster.Xrange.size)
    # choose all data points inside the square boundaries of the AOI,
    # replace all other points with NULL
    craster.cdata= np.choose(np.flipud(craster.mask), (craster.data, -9999))
    # resise the data set to be the size of the squared polygon
    craster.ccdata=craster.cdata[ulY:lrY, ulX:lrX]
    craster.writer("ccdata2m.asc",craster.ccdata, (minX+xres*.5, maxY+yres*.5), 10,10,Flip=False)
    # in second step we rechoose all the data points which are inside the
    # bounding vertices of AOI
    # need to re-define our raster points
    craster.xllcorner, craster.yllcorner = minX, minY
    craster.xurcorner, craster.yurcorner = maxX, maxY
    craster.fillrasterpoints(10,10)
    craster.getmask(craster.boundingvertices) # just a wrapper around matplotlib.nxutils.points_in_poly
    craster.data=craster.ccdata
    craster.clip2(new_extent_polygon=craster.boundingvertices)
    craster.data = np.ma.MaskedArray(craster.data, mask=craster.mask)
    craster.data = np.ma.filled(craster.data, fill_value=-9999)
    # write the raster to disk
    craster.writer("ccdata2m_clipped.asc",craster.data, (minX+xres*.5, maxY+yres*.5), 10,10,Flip=False)

class MaskRasterve yöntemlerinin tam bir açıklaması için projemin github'una bakın .

Bu kodu kullanarak GDAL kullanmaya devam etmeniz gerekir. Ancak, plan gelecekte kullanabileceğim saf Python'da kullanmaktır, çünkü yazılımımın hedef kitlesi çok fazla bağımlılıkta zorluk çekiyor (yazılımı geliştirmek için Debian'ı kullanıyorum ve istemciler Windows 7'yi kullanıyor ...).


Verdiğiniz komut satırı örneğini beğendim, ancak -crop_to_cutline argümanının ne yaptığını açıklayabilir misiniz? Amacına ne verildiğinden emin değilim, shapefile -cutline ile belirtilmiş.
hendra

1
-cutline seçeneği, görüntüleyiciyi çokgen katmanının iç sınırlayıcı kutusuna klipsler. Örn., Uzantılarda daha küçükse, çıktı rasterleri de daha küçük olacaktır. Bu olmadan çıktı raster orijinali ile aynı boyutta olacak, ancak ilgilendiğiniz alanın dışındaki tüm noktalarda NULL olacaktır.
Oz123
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.