มากกว่า

ไดรเวอร์ Gdal สร้าง TypeError

ไดรเวอร์ Gdal สร้าง TypeError


ฉันได้เขียนสคริปต์หลามเพื่อแปลงกริด ascii เป็นไฟล์ geotiff และเมื่อเรียกใช้เมธอด Create ใน gdal ฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:

[email protected]:~/Smells$ python SmellsGeoTag.py ./SmellsTestData/test3/input/tile_1 ./output Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "SmellsGeoTag.py" บรรทัดที่ 47 ใน  dst_ds = driver.Create(out , ncols, nrows, 1, gdal.GDT_Float32 ) ไฟล์ "/usr/local/lib/python2.7/dist-packages/GDAL-1.11.0-py2.7-linux-x86_64.egg /osgeo/gdal.py" บรรทัดที่ 394 ใน Create return _gdal.Driver_Create(self, *args, **kwargs) TypeError: ในวิธี 'Driver_Create', อาร์กิวเมนต์ 3 ประเภท 'int'

อย่างไรก็ตาม ไม่เหมือนกับปัญหาที่นี่ ค่า ncols และ nrows ของฉันไม่ใช่ศูนย์ ints ดังนั้นฉันจึงค่อนข้างนิ่งงันว่าปัญหาคืออะไร

รหัสแหล่งที่มา:

#!/usr/bin/python import sys, getopt, os, numpy จาก osgeo import osr, gdal if len(sys.argv) != 3: print ("โปรดใช้การโต้แย้งต่อไปนี้: เส้นทางอินพุต, เส้นทางเอาต์พุต"); ทางออก(); inRoot = sys.argv[1] outRoot = sys.argv[2] #finding ไฟล์ที่ถูกต้อง potentialDates = os.listdir(inRoot) วันที่ = [] สำหรับฉันใน potentialDates: ถ้า os.path.isdir(os.path.join() inRoot, i)): date.append(i) สำหรับฉันในวันที่: potentialFiles = [] files = [] potentialFiles = os.listdir(os.path.join(inRoot, i)) สำหรับ x ใน potentialFiles: ถ้า x endwith(".asc"): files.append(x) #processing แต่ละไฟล์ที่ถูกต้องสำหรับ y ในไฟล์: ด้วย open(os.path.join(inRoot, i, y), "r") เป็น f: linelist = [บรรทัดสำหรับบรรทัดใน f] ขยะ xllcorner = linelist.pop(0).split() float(xllcorner) ขยะ yllcorner = linelist.pop(0).split() float(yllcorner) ขยะ ncols = linelist.pop (0.split() int(ncols) ขยะ, nrows = linelist.pop(0).split() int(nrows) ขยะ, ขนาดเซลล์ = linelist.pop(0).split() float(ขนาดเซลล์) ขยะ, nodataval = linelist.pop(0).split() float(nodataval) data = [[float(digit) สำหรับตัวเลขใน line.split()]สำหรับ line in linelist] driver = gdal.GetDriverByName("GTiff") ถ้าไม่ใช่ระบบปฏิบัติการ .path.exists(os.path.join(outRoot,i)): os.makedirs(os.path.j) oin(outRoot,i)) out = os.path.join(outRoot,i,y+".tif") dst_ds = driver.Create(out , ncols, nrows, 1, gdal.GDT_Float32 ) dst_ds.SetGeoTransform( [xllcorner, cellize,0,yllcorner,0,cellsize] ) # set the reference info srs = osr.SpatialReference() srs.SetWellKnownGeogCS("WGS84") dst_ds.SetProjection( srs.ExportToWkt() ) # เขียนแถบ dst_ds.GetRasterBand() ).WriteArray(ข้อมูล) exit()

ค่าncols,nrowsคุณกำลังผ่านไปยังไดรเวอร์สร้างยังคงเป็นสตริงและไม่ใช่ค่าจำนวนเต็ม หลังจากอ่านในncolsตัวแปรใน

ขยะ ncols = linelist.pop(0).split()

ncolsมีสตริงที่มีค่าของคุณ เส้นหลังint(ncols)แปลงเป็นintแต่คุณไม่เก็บผลลัพธ์ (int()ฟังก์ชั่นไม่เปลี่ยนค่าในตำแหน่ง) ดังนั้นคุณต้องเขียนบรรทัดนั้นเป็น:

ncols = int(ncols)

ในกรณีที่มีข้อสงสัย คุณสามารถส่งออกชนิดของตัวแปรทุกตัวก่อนตัวไดรเวอร์สร้าง (… )ยกตัวอย่างด้วย:

พิมพ์ 'ncols:', ประเภท (ncols), ' - nrows:', ประเภท (nrows)

หวังว่านี่จะช่วยได้

ป.ล. หมายเหตุด้านข้าง: ในกรณีนี้ ฉันไม่รู้ว่าโปรแกรม gdal_translate จะช่วยคุณในการแปลง ASCII raster เป็น GeoTiff ได้หรือไม่ ได้รับการออกแบบมาเพื่อแปลงไฟล์ Raster หนึ่งไฟล์เป็นอีกไฟล์หนึ่ง และสามารถใช้ในการแปลรูปแบบง่ายๆ ได้ และอื่นๆ อีกมากมาย รูปแบบแรสเตอร์ที่มีจำหน่ายอยู่ที่นี่


เนื่องจาก GDAL สามารถอ่านกริด ASCII ได้ คุณไม่จำเป็นต้องแยกวิเคราะห์ เพียงแค่ใช้ GDAL เพื่อเปิด จากนั้นใช้วิธี CreateCopy ของไดรเวอร์ GeoTIFF

#!/usr/bin/python import sys, getopt, os, numpy จาก osgeo import osr, gdal if len(sys.argv) != 3: print ("โปรดใช้อาร์กิวเมนต์ต่อไปนี้: input path, output path"); ทางออก(); inRoot = sys.argv[1] outRoot = sys.argv[2] #ประหยัดเวลาด้วยการสร้างวัตถุเหล่านี้เพียงครั้งเดียว ไดรเวอร์ = gdal.GetDriverByName("GTiff") # ตั้งค่าข้อมูลอ้างอิง srs = osr.SpatialReference() srs.SetWellKnownGeogCS("WGS84") #finding ไฟล์ที่ถูกต้อง potentialDates = os.listdir (inRoot) วันที่ = [] สำหรับฉันใน : ถ้า os.path.isdir(os.path.join(inRoot, i)): date.append(i) สำหรับฉันในวันที่: potentialFiles = [] files = [] potentialFiles = os.listdir(os.path.join (inRoot, i)) สำหรับ x ใน potentialFiles: if x.endswith(".asc"): files.append(x) #processing แต่ละไฟล์ที่ถูกต้องสำหรับ y ในไฟล์: ds = gdal.Open(os.path.join (inRoot, i, y)) ถ้าไม่ใช่ os.path.exists(os.path.join(outRoot,i)): os.makedirs(os.path.join(outRoot,i)) out = os.path.join (outRoot,i,y+".tif") dst_ds = driver.CreateCopy(out, ds) dst_ds.SetProjection( srs.ExportToWkt() ) del dst_ds #ปิดชุดข้อมูลเพื่อสิ้นสุดการเขียน

ดูวิดีโอ: Covert raster into tiles -