ฉันมีโฟลเดอร์ที่มีไฟล์จำนวนมากในรูปแบบ GeoTIFF
ฉันต้องสร้างทั้งไฟล์ PRJ และ TFW สำหรับแต่ละภาพเหล่านี้
มีวิธีการทำเช่นนี้?
ฉันมีโฟลเดอร์ที่มีไฟล์จำนวนมากในรูปแบบ GeoTIFF
ฉันต้องสร้างทั้งไฟล์ PRJ และ TFW สำหรับแต่ละภาพเหล่านี้
มีวิธีการทำเช่นนี้?
คำตอบ:
วิธีที่ง่ายที่สุดในการสร้าง TFWs คือการเขียนสคริปต์ใน Python หรือ Java โดยใช้ GDAL ซึ่งจะเป็นบรรทัดของโค้ดจำนวนหนึ่ง
การสร้างไฟล์. prj แบบเก่า (pre ArcGis 9) ไม่รองรับGDALเพียงอ่าน (ดูที่นี่ ) สนับสนุนการสร้างไฟล์สไตล์ใหม่ (ตาม WKT) แต่ไม่รับประกันว่าจะครอบคลุมทุกกรณี แต่อย่างใดในกรณีที่มีการแทนที่สูงสุดฉันได้เขียนสคริปต์ Python ที่ทำสิ่งที่คุณต้องการ ไม่มีการตรวจสอบข้อผิดพลาดหรืออะไร แต่มันใช้ได้กับไดเร็กตอรี่ของ tiffs ที่ฉันต้องส่ง, YMMV
# Written by MerseyViking (mersey dot viking at gmail dot com), 2011.
# Released into the public domain - May 8, 2011
# I accept no responsibility for any errors or loss of data, revenue, or life this script may cause. Use at your own risk.
import osgeo.gdal as gdal
import osgeo.osr as osr
import os
import glob
import sys
def generate_tfw(path, gen_prj):
for infile in glob.glob(os.path.join(path, '*.tif')):
src = gdal.Open(infile)
xform = src.GetGeoTransform()
if gen_prj == 'prj':
src_srs = osr.SpatialReference()
src_srs.ImportFromWkt(src.GetProjection())
src_srs.MorphToESRI()
src_wkt = src_srs.ExportToWkt()
prj = open(os.path.splitext(infile)[0] + '.prj', 'wt')
prj.write(src_wkt)
prj.close()
src = None
edit1=xform[0]+xform[1]/2
edit2=xform[3]+xform[5]/2
tfw = open(os.path.splitext(infile)[0] + '.tfw', 'wt')
tfw.write("%0.8f\n" % xform[1])
tfw.write("%0.8f\n" % xform[2])
tfw.write("%0.8f\n" % xform[4])
tfw.write("%0.8f\n" % xform[5])
tfw.write("%0.8f\n" % edit1)
tfw.write("%0.8f\n" % edit2)
tfw.close()
if __name__ == '__main__':
generate_tfw(sys.argv[1], sys.argv[2])
เรียกมันจากบรรทัดคำสั่งดังนี้:
python gen_tfw.py <path_to_tiff_directory> [prj]
พารามิเตอร์ที่สองสามารถเป็น prj เพื่อสร้างไฟล์ prj สไตล์ WKT หรืออะไรก็ได้ที่จะสร้าง. TFWs
หากคุณไม่สามารถใช้สคริปต์ Python ไม่ว่าด้วยเหตุผลใดคุณสามารถใช้:
gdal_translate -co "TFW=YES" in.tif out.tif
แต่นั่นจะเป็นการคัดลอกข้อมูลภาพด้วยดังนั้นคุณจะต้องลบต้นฉบับ และแน่นอนว่ามันจะไม่สร้างไฟล์. prj ที่มีทั้งรสชาติ แต่ถ้าสมมุติว่า tiff ทั้งหมดของคุณอยู่ในรูปแบบเดียวกันคุณสามารถสร้างไฟล์. prj ด้วยมือแล้วทำซ้ำมันสำหรับรูปภาพต้นฉบับทั้งหมด
generate_tfw
ไม่สามารถทำงานได้อย่างถูกต้องกับภาพแรสเตอร์แบบหมุน สิ่งนี้สามารถแก้ไขได้ด้วยการคูณเมทริกซ์
listgeoยูทิลิตี้ที่มาพร้อมกับ libgeotiff เป็นอรรถประโยชน์บรรทัดคำสั่งที่ดีที่สามารถดึงไฟล์ TWF จากไฟล์ GeoTIFF
ตัวอย่างเช่นฉันมีไดเรกทอรีของ GeoTIFF และฉันติดตั้ง libgeotiff เป็นส่วนหนึ่งของ OSGeo4w คุณสามารถรันเชลล์ OSGeo4w และทำสิ่งนี้:
$ listgeo -tfw BN24_GeoTif_1-01.tif
World file written to 'BN24_GeoTif_1-01.tfw'.
มันจะดีถ้ายูทิลิตี้เดียวกันสามารถแยกไฟล์ PRJ ด้วย
ไม่จริง - ถ้าคุณรู้จักการฉายภาพของไฟล์คุณสามารถค้นหาเนื้อหาของไฟล์ prj ได้ที่http://spatialreference.orgแล้วใช้เชลล์สคริปต์เพื่อคัดลอกเทมเพลตไปยังไฟล์. prj สำหรับแต่ละอิมเมจ
การอ้างอิงทางภูมิศาสตร์จะต้องดำเนินการตามภาพต่อไฟล์เนื่องจากไฟล์. tfw จะแตกต่างกันไปสำหรับแต่ละภาพ (ยกเว้นว่าจะอยู่ในที่เดียวกันทั้งหมด) http://warper.geothings.net/อาจเป็นหนทางไปหากคุณไม่สามารถเข้าถึง GIS บนเดสก์ท็อปได้
ใช้ Geotools ใน Java คุณสามารถใช้รหัสนี้:
// read geotiff file (using org.geotools.gce.geotiff.GeoTiffReader)
GeoTiffReader reader = new GeoTiffReader(geotiff);
// get transformation
AffineTransform transformation = reader.getMetadata().getModelTransformation();
// create org.geotools.data.WorldFileWriter (world file is created automatically!)
WorldFileWriter worldFileWriter = new WorldFileWriter(myWorldFile, transformation);
หากคุณต้องการได้รับการฉายคุณสามารถใช้รหัสนี้:
// get the projection string from CRS
CoordinateReferenceSystem crs = reader.getCoordinateReferenceSystem();
String projectionString = crs.toWKT();
เพียงเขียนเนื้อหาของprojectionString
ไปยังไฟล์ภาพฉายของคุณ
หากใครต้องการแก้ไข tiff เพิ่มเติมในแอพตกแต่งรูปภาพและเก็บตำแหน่งทางภูมิศาสตร์ไว้การส่งออกเลเยอร์แรสเตอร์ด้วยการสร้าง tfw และการเปิดใช้งานรูปภาพ Rendered เป็นวิธีที่ง่ายที่สุด IMO สำหรับตัวเลือกที่แตกต่างกันเล็กน้อยมีวิธีผ่านเมนู Raster / Conversion / Translate