GDAL รูปหลายเหลี่ยมในงูหลามการสร้างรูปหลายเหลี่ยมว่างเปล่า?


12

ฉันมีปัญหาในการใช้ฟังก์ชัน Polygonize ใน python ตัวอย่างตำราสำหรับการนี้สามารถพบได้ที่นี่

ส่วนที่เกี่ยวข้องของรหัสของฉันคือ:

sourceRaster = gdal.Open('myraster.tif')
band = sourceRaster.GetRasterBand(1)
bandArray = band.ReadAsArray()
outShapefile = "polygonized"
driver = ogr.GetDriverByName("ESRI Shapefile")
if os.path.exists(outShapefile+".shp"):
    driver.DeleteDataSource(outShapefile+".shp")
outDatasource = driver.CreateDataSource(outShapefile+ ".shp")
outLayer = outDatasource.CreateLayer("polygonized", srs=None)
gdal.Polygonize( band, None, outLayer, -1, [], callback=None )
outDatasource.Destroy()
sourceRaster = None

ฉันรู้ว่าวงดนตรีมีข้อมูลที่เกี่ยวข้องนี่เป็นตัวอย่างของbandArray:

array([[ 4.,  4.,  3.,  3.,  3.,  2.,  2.,  2.,  2.,  3.,  3.,  3.,  3.,
         3.,  3.,  3.,  3.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,
         4.,  4.,  4.,  4.],

เมื่อฉันเปิดตารางคุณสมบัติใน QGIS มันว่างเปล่า: QGIS screencapture

แก้ไข:

การแปลงทำงานได้ดีใน QGIS โดยใช้ Raster -> Conversion -> เครื่องมือรูปหลายเหลี่ยม

ภาพหน้าจอของแรสเตอร์ที่จะจัดรูปแบบ:

แรสเตอร์เพื่อรูปหลายเหลี่ยม

และภาพหน้าจอของการแปลงผลลัพธ์จากเครื่องมือ QGIS:

แรสเตอร์หลายเหลี่ยมจากเครื่องมือ QGIS

ฉันใช้เครื่องคิดเลขทางธุรกิจบน Windows 7, GDAL เวอร์ชั่น 1.10.0-3

ปัญหาคือฉันไม่สามารถใช้หลายรูปแบบแรสเตอร์ในไพ ธ อนโดยใช้ GDAL และตัวอย่างตำราอาหารฉันสามารถสร้างรูปหลายเหลี่ยมแรสเตอร์เดียวกันนี้โดยไม่มีปัญหาใน QGIS GUI


แรสเตอร์ของคุณมีหน้าตาเป็นอย่างไร? มันมีรูปหลายเหลี่ยมจริงเหรอ? ใช้งานได้ไหมถ้าคุณใช้ gdal_polygonize.py แทน
BradHards

แก้ไขเพื่อเพิ่มภาพหน้าจอของกระบวนการทำงานใน QGIS
camdenl

ปัญหาจริงที่นี่คืออะไร
Fezter

เพิ่มปัญหาเฉพาะ
camdenl

3
ฉันมีปัญหาที่คล้ายกัน (กำลังสร้างรูปร่างไฟล์เปล่า) และการสร้างฟิลด์ไม่ได้ช่วยอะไร สิ่งที่ฉันทำผิดคือฉันไม่ได้ปิด shapefile ในรหัสก่อนเรียกรูปหลายเหลี่ยม คุณปิดมันในตัวอย่างของคุณฉันเพิ่งโพสต์สิ่งนี้เพื่อการอ้างอิงของผู้อื่น
สเตฟานี

คำตอบ:


19

ปัญหาคือฉันไม่ได้สร้างสนามเพื่อเก็บแถบแรสเตอร์ หลังจากขุดผ่านไฟล์ gdal_polygonize.py ฉันรู้ว่านี่ไม่ได้ทำโดยอัตโนมัติเมื่อเรียก gdal.Polygonize ซึ่งใช้ฟังก์ชั่นที่พบที่นี่แทน

นี่คือขั้นตอนพิเศษที่จำเป็นในการสร้างเขตข้อมูลและเขียนแถบลงในฟิลด์:

newField = ogr.FieldDefn('MYFLD', ogr.OFTInteger)
outLayer.CreateField(newField)

จากนั้นเราสามารถเขียนแบนด์ลงในฟิลด์นี้โดยมีดัชนีเป็น 0:

gdal.Polygonize(band, None, outLayer, 0, [], callback=None )

ฉันยังพยายามใช้ฟังก์ชัน gdal.Polygonize () เพื่อรับ raster ของฉันเป็นรูปหลายเหลี่ยมในไพ ธ อน แต่ในตอนท้ายมันแสดงข้อผิดพลาด runtime !! ทำไม?
Shiuli Pervin

มันทำงานได้ดีกับไฟล์แรสเตอร์เชิงภูมิศาสตร์ ผลลัพธ์เป็นรูปหลายเหลี่ยมมากเกินไป แต่ฉันต้องการรูปหลายเหลี่ยมขนาดใหญ่เพียงอันเดียวที่แสดงเค้าโครงของแรสเตอร์ ใครบ้างมีความคิดว่ามันทำงานอย่างไรในเวลาเดียวกัน?
Shiuli Pervin

ยังคงได้รับรูปร่างไฟล์ที่ว่างเปล่า แต่ฉันมีแถวในไฟล์ dbf โปรดอธิบายฉัน!
Satya Chandra

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