Yanıtlar:
Ben emin gdal API hakkında, orada olduğum void* GDALWarpOptions::hCutline
iç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:
ogrinfo
kırpma şeklinin boyutunu belirlemek için kullanıngdal_translate
şekil uzantılarını klipslemek için kullanıngdalwarp
ile 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 .
GeospatialPython'dan Joel Lawhead, iyi yazılmış bir ders olan shapefile kullanarak Clip raster'da tam python örneğine sahiptir . Sen yüklemeniz gerekir Python Görüntü Kitaplığı (kendisi için gerekebilir Osgeo4W dahil değildir (PIL) pencereler kayıtçılığa o4w piton eklemek işe programı yüklemek almak için).
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 world2Pixel
Joel 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 MaskRaster
ve 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 ...).