การอ่านการแก้ไขและการเขียนพิกัดด้วย GDAL ในหลาม


11

ฉันพยายามเรียนรู้วิธีการประมวลผลภาพจากการรับรู้ระยะไกลโดยใช้การเชื่อมโยง Python GDAL และการถ่ายภาพจำนวนมาก เป็นครั้งแรกที่ฉันอ่านไฟล์ geotiff Landsat8 ทำการจัดการอย่างง่ายและเขียนผลลัพธ์ลงในไฟล์ใหม่ รหัสด้านล่างดูเหมือนว่าจะทำงานได้ดียกเว้นว่าแรสเตอร์ดั้งเดิมถูกทิ้งในไฟล์เอาต์พุตแทนที่จะเป็นแรสเตอร์ที่ได้รับการจัดการ

ความคิดเห็นหรือข้อเสนอแนะใด ๆ ยินดีต้อนรับ แต่โดยเฉพาะอย่างยิ่งบันทึกเกี่ยวกับสาเหตุที่แรสเตอร์ที่จัดการไม่แสดงในผลลัพธ์

import os
import gdal

gdal.AllRegister()

file = "c:\~\LC81980242015071LGN00.tiff"
(fileRoot, fileExt) = os.path.splitext(file)
outFileName = fileRoot + "_mod" + fileExt

ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()

[cols, rows] = arr.shape
arr_min = arr.Min()
arr_max = arr.Max()
arr_mean = int(arr.mean())

arr_out = numpy.where((arr < arr_mean), 10000, arr)

driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outband = outdata.GetRasterBand(1)
outband.WriteArray(arr_out)
outdata = None

print arr_min
> 0
print arr_max
> 65535
print arr_mean
> 4856

ฉันใช้ Python 2.7.1 บนเครื่อง Windows 7 32 บิต


ฉันได้มันมาใช้กับ DEM (Ubuntu, python 2.7.1) และมันสร้างผลลัพธ์ที่คาดหวังโดยทุกอย่างต่ำกว่าค่าเฉลี่ยที่ตั้งไว้ที่ 10,000 และเขียนลงใน tiff ใหม่ คุณไม่ได้คัดลอกพิกัดทางภูมิศาสตร์ไปยังรูปภาพใหม่ดังนั้นจึงไม่มีโครงการดังนั้นคุณอาจจำเป็นต้องคำนึงถึงปัจจัยเมื่อพยายามดู (มีหนึ่งซับในการทำสิ่งนี้ แต่ฉันจะต้องขุดออก) หากคุณสามารถแก้ไขคำถามของคุณด้วยผลลัพธ์จากgdainfo -stats original.tiffและgdal-config --versionที่สามารถช่วยได้
Steven Kay

สวัสดีขอบคุณที่มองดูสิ่งนี้! ฉันรู้ว่าฉันละเลยการแปลงสัญญาณทางภูมิศาสตร์คิดที่จะเคี้ยวในภายหลัง ฉันเห็นภาพทั้งหมดที่ส่งออก (โดยใช้ Irfanview) ดังนั้นฉันคิดว่ามันเป็นไปไม่ได้ ฉันจะสร้างข้อมูลที่คุณร้องขอเมื่อฉันกลับมานั่งในคืนนี้
Hans Roelofsen

สวัสดีฉันพยายามให้ข้อมูลที่คุณถาม ฉันใช้ Python GDAL และไม่แน่ใจว่าคำสั่งที่คุณระบุตรงกับคำสั่ง Python อย่างไร ในกรณีใด ๆ ฉันใช้ GDAL-1.11.2-cp27-ไม่มี-win32 เป็นมาจากที่นี่ ฉันจะอัปเดตโพสต์ของฉันด้วยสถิติบางอย่างใน. tiff ดั้งเดิม
Hans Roelofsen

arr_min จะเป็นอย่างไร
fluidmotion

arr_min = 0 ฉันได้อัปเดตโพสต์เพื่อแสดงสิ่งนี้ ขอบคุณ!
Hans Roelofsen

คำตอบ:


13

สคริปต์ของคุณไม่มีเมธอด ds.FlushCache ที่บันทึกลงดิสก์สิ่งที่คุณมีในหน่วยความจำเมื่อสิ้นสุดการแก้ไข ดูตัวอย่างรุ่นของคุณที่ถูกต้องด้านล่าง โปรดสังเกตว่าฉันยังเพิ่มสองบรรทัดเพื่อตั้งค่าการฉายภาพและการเปลี่ยนตำแหน่งทางภูมิศาสตร์เป็นอินพุต

import os
import gdal

file = "path+filename"
ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
[cols, rows] = arr.shape
arr_min = arr.min()
arr_max = arr.max()
arr_mean = int(arr.mean())
arr_out = numpy.where((arr < arr_mean), 10000, arr)
driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outdata.SetGeoTransform(ds.GetGeoTransform())##sets same geotransform as input
outdata.SetProjection(ds.GetProjection())##sets same projection as input
outdata.GetRasterBand(1).WriteArray(arr_out)
outdata.GetRasterBand(1).SetNoDataValue(10000)##if you want these values transparent
outdata.FlushCache() ##saves to disk!!
outdata = None
band=None
ds=None

Outfile ไม่ได้ถูกฉาย ฉันกำลังอ่านไฟล์ HDF5 และเลือกการฉายจากวงดนตรีที่ฉันต้องการส่งออกGetProjection()ให้ EPSG ที่ถูกต้อง แต่ดูเหมือนว่าจะไม่ได้ใช้ วาร์ปของ GDAL หายไปใช่ไหม ขอบคุณ!
Michael

ฉันควรแทนที่ด้วยoutdata.GetRasterBand(1).WriteArray(arr_out)เพื่อเขียนภาพแบบหลายส่วนที่มีมากกว่าหนึ่งวง
Sai Kiran

"1" ในไดร์เวอร์สร้าง () ระบุจำนวนของแบนด์ จากนั้นคุณสามารถเขียนแต่ละวงด้วย outdata.GetRasterBand (band_number) มันเริ่มต้นที่ 1 ไม่ใช่ศูนย์
Andrea Massetti
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.