การตัดแรสเตอร์ด้วยเวกเตอร์เลเยอร์โดยใช้ GDAL


26

ฉันได้ติดตั้ง GDAL โดยใช้ตัวติดตั้ง Osgeo ฉันจะคลิปเลเยอร์แรสเตอร์ด้วยเวกเตอร์เลเยอร์โดยทางโปรแกรมได้อย่างไร มี GDAL API ใดบ้างที่สามารถช่วยฉันได้ ฉันใช้ Python

คำตอบ:


13

ฉันไม่แน่ใจเกี่ยวกับ gdal api มีvoid* GDALWarpOptions::hCutlineในตัวเลือก Warp ที่อ้างอิงจากการสอน Warp APIแต่ไม่มีตัวอย่างที่ชัดเจน คุณแน่ใจหรือว่าต้องการคำตอบจากโปรแกรม โปรแกรมอรรถประโยชน์บรรทัดคำสั่งสามารถทำได้นอกกรอบ:

  1. สร้าง shapefile ที่มีเพียงส่วนของการตัดรูปหลายเหลี่ยมที่น่าสนใจ
  2. ใช้ogrinfoเพื่อกำหนดขอบเขตของรูปทรงการตัด
  3. ใช้gdal_translateสำหรับหนีบกับส่วนขยายของรูปร่าง
  4. ใช้gdalwarpกับ-cutlineพารามิเตอร์

ขั้นตอนที่ 2 และ 3 gdalwarp -cutline ...มีการเพิ่มประสิทธิภาพของคุณอาจจะได้รับโดยมีเพียงแค่

ดูการตัดแรสเตอร์ด้วย GDAL โดยใช้รูปหลายเหลี่ยมจาก Linfinity สำหรับโซลูชันที่ใช้ลินุกซ์ทั้งหมดรวมอยู่ในสคริปต์เดียว ตัวอย่าง cutline อื่นสามารถมองเห็นได้ในไมเคิลคอเรย์กวดวิชาhillshades สร้างสำหรับ Mapnik


แมตต์คุณอาจจำtrac.osgeo.org/gdal/ticket/1599ดูเหมือนว่าไลน์จะเติมเต็มสิ่งนี้
Mike T

10

Joel Lawhead จาก GeospatialPython มีตัวอย่างงูหลามที่สมบูรณ์ในClip raster โดยใช้ shapefileซึ่งเป็นแบบฝึกหัดที่เขียนขึ้นเป็นอย่างดี คุณจะต้องติดตั้งPython Image Library (PIL) ซึ่งไม่รวมอยู่ใน Osgeo4W (ซึ่งคุณอาจต้องเพิ่ม o4w python ใน windows registryเพื่อให้โปรแกรมติดตั้งทำงานได้)


10

ดูเหมือนว่าเรื่องนี้จะกลับมาเสมอ ฉันเองก็ไม่รู้ว่า GDAL> 1.8 นั้นก้าวหน้าไปแล้วมันให้การจัดการบรรทัดคำสั่งที่เป็นธรรมแก่คุณเพื่อทำงานดังกล่าว

ความคิดเห็นจาก Mike Toews ค่อนข้างมีประโยชน์ แต่คุณสามารถทำได้ง่ายๆเช่น:

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

คุณสามารถรวมคำสั่งนี้ไว้ในสคริปต์ไพ ธ อนด้วยกระบวนการย่อยที่ยอดเยี่ยมโมดูล

สิ่งหนึ่งที่เป็นปัญหาสำหรับฉันจริงๆก็คือฉันต้องจัดหาวิธีแก้ปัญหาให้น้อยที่สุดซึ่งหมายถึงเรียบง่ายที่สุดเท่าที่จะเป็นไปได้และไม่ต้องการการพึ่งพาจากภายนอกจำนวนมาก การใช้ Python Imaging Library เหมือนกับในบทช่วยสอนของ Joel Lawhead นั้นเป็นระเบียบ แต่ฉันก็พบวิธีแก้ปัญหาต่อไปนี้: การใช้ Numpy masked arrays
ฉันไม่รู้ว่ามันดีกว่านี้หรือเปล่า แต่นั่นคือสิ่งที่ฉันรู้ย้อนหลังไปกว่า (3 ปีที่แล้ว ... )
เดิมทีฉันสร้างพื้นที่ข้อมูลที่ถูกต้องภายในแรสเตอร์ดั้งเดิม (เช่นขอบเขตของเอาต์พุตแรสเตอร์ที่เท่ากัน) แต่ฉันชอบความคิดในการทำให้แรสเตอร์มีขนาดเล็กลง (เช่น -crop_to_cutline) ดังนั้นฉันจึงนำมา world2Pixelจาก Joel Lawhead นี่คือทางออกของฉันเอง:

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และเป็นวิธีดูgithub ของโครงการของฉัน GitHub

การใช้รหัสนี้คุณจะต้องใช้ GDAL อย่างไรก็ตามแผนจะใช้ใน Python บริสุทธิ์ในอนาคตที่ฉันสามารถทำได้เพราะกลุ่มเป้าหมายของซอฟต์แวร์ของฉันมีปัญหากับการพึ่งพามากเกินไป (ฉันใช้ Debian เพื่อพัฒนาซอฟต์แวร์และลูกค้าใช้ Windows 7 ... )


ฉันชอบตัวอย่างบรรทัดคำสั่งที่คุณให้ แต่คุณสามารถอธิบายได้ว่าอาร์กิวเมนต์ -crop_to_cutline ทำอะไรได้บ้าง ฉันไม่แน่ใจว่าจุดประสงค์ของมันคืออะไรการกำหนดรูปแบบการตัดจะถูกระบุโดย -cutline
hendra

1
- ตัวเลือกตัดคลิปแรสเตอร์ไปยังกล่องขอบด้านในของชั้นรูปหลายเหลี่ยม เช่นถ้ามันมีขนาดเล็กในขอบเขตเอาท์พุทแรสเตอร์ก็จะมีขนาดเล็กลง หากไม่มีสิ่งนี้เอาท์พุทแรสเตอร์จะมีขนาดเท่ากับต้นฉบับ แต่ด้วยค่า NULL ในทุกจุดนอกพื้นที่ที่คุณสนใจ
Oz123
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.