วิธีการใช้ gdal2tiles บนภาพ TIFF แบบกำหนดเองที่ได้รับจากผู้ให้บริการเพื่อสร้างไทล์


10

ฉันพยายามอย่างหนักในการสร้างไทล์สำหรับภาพความละเอียดสูงที่เรามี ภาพปัจจุบันที่เรามีคือภาพที่มีขนาดใหญ่มาก (+ 20GB) ซึ่งบันทึกเป็นไฟล์ GeoTiffภาพ GTiff ขนาดใหญ่

ฉันต้องการสร้างไทล์โดยใช้ยูทิลิตีบรรทัดคำสั่ง gdal2tiles จากนั้นเปิดและดูใน Cesium โดยใช้ผู้ให้บริการภาพ TMS เพื่อจัดเรียงไทล์ ใช้ gdalinfo นี่คือรายละเอียดบางส่วนของภาพ:

Driver: GTiff/GeoTIFF
Files: image.tif
Size is 52250, 56119
Coordinate System is:
PROJCS["WGS 84 / UTM zone 35S",
    GEOGCS["WGS 84",
        DATUM["WGS_1984",
            SPHEROID["WGS 84",6378137,298.257223563,
                AUTHORITY["EPSG","7030"]],
            AUTHORITY["EPSG","6326"]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",27],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",10000000],
    UNIT["meters",1],
    AUTHORITY["EPSG","32735"]]
Origin = (606276.000000000000000,7197873.000000000000000)
Pixel Size = (0.500000000000000,-0.500000000000000)
Metadata:
  AREA_OR_POINT=Area
  TIFFTAG_MAXSAMPLEVALUE=13165
  TIFFTAG_MINSAMPLEVALUE=1
  TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
  TIFFTAG_SOFTWARE=ERDAS IMAGINE
  TIFFTAG_XRESOLUTION=1
  TIFFTAG_YRESOLUTION=1
Image Structure Metadata:
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (  606276.000, 7197873.000) ( 28d 3'21.59"E, 25d19'55.12"S)
Lower Left  (  606276.000, 7169813.500) ( 28d 3'29.55"E, 25d35' 7.17"S)
Upper Right (  632401.000, 7197873.000) ( 28d18'55.92"E, 25d19'47.60"S)
Lower Right (  632401.000, 7169813.500) ( 28d19' 5.85"E, 25d34'59.57"S)
Center      (  619338.500, 7183843.250) ( 28d11'13.23"E, 25d27'27.58"S)
Band 1 Block=512x512 Type=UInt16, ColorInterp=Gray
Band 2 Block=512x512 Type=UInt16, ColorInterp=Undefined
Band 3 Block=512x512 Type=UInt16, ColorInterp=Undefined
Band 4 Block=512x512 Type=UInt16, ColorInterp=Undefined

ความพยายามครั้งแรกของฉันคือการใช้ gdal_translate เพื่อกำหนดตำแหน่งภาพแล้วใช้ gdalwarp เพื่อเปลี่ยนการฉายเป็น EPSG: 3857 ตามที่ Cesium ต้องการ (ดูข้อมูลอ้างอิง API)

gdal_translate -of VRT -a_srs EPSG:4326 -gcp 606275 7197875 28.055987 -25.331974 -gcp 606275 7169814 28.058200 -25.585326 -gcp 632400.5 7197875 28.31553 -25.329876 -gcp 632400.5 7169814 28.318286 -25.583209 image.tif newImage1.vrt
gdalwarp -of VRT -t_srs EPSG:3857 newImage1.vrt newImage2.vrt

อย่างไรก็ตามฉันได้รับข้อผิดพลาดดังต่อไปนี้:

ข้อผิดพลาด 1: ละติจูดหรือลองจิจูดเกินขีด จำกัด

วิธีอื่นที่ฉันพยายามคือใช้ gdal2tiles โดยตรงและสร้างไทล์:

gdal2tiles.py image.tif

สิ่งนี้สร้างโฟลเดอร์ที่มีโฟลเดอร์ย่อยหนึ่งโฟลเดอร์ (ชื่อ 18) ซึ่งเป็นระดับการย่อ / ขยายที่สร้างไทล์เท่านั้น อย่างไรก็ตามภาพที่ฉันได้รับจากที่นี่ล้วนเป็น "ผิด" และ "พร่ามัว" อย่างสมบูรณ์

ตัวอย่างของหนึ่งในกระเบื้อง:

ป้อนคำอธิบายรูปภาพที่นี่

คำแนะนำสำหรับการสร้างไทล์สำหรับภาพนี้ภาพขนาดใหญ่ของพื้นที่เฉพาะโดยใช้ gdal2tiles เพื่อให้ฉันสามารถโหลดและดูใน Cesium?

ปรับปรุง

ดังนั้นหลังจากลองคำแนะนำของ @ iant ฉันใช้คำสั่งต่อไปนี้:

gdalwarp -co TILED=YES -co COMPRESS=DEFLATE -co BIGTIFF=YES -t_srs EPSG:3857 image.tif newImage.tif

คำสั่งนี้ใช้งานได้ดีอย่างสมบูรณ์จนถึงจุดสิ้นสุดที่ฉันได้รับข้อผิดพลาดต่อไปนี้:

ข้อผิดพลาด 1: TIFFFillTile: อ่านข้อผิดพลาดที่แถว 43520, col 47104; มี 35788250 ไบต์คาดว่า 37421449

ไม่แน่ใจว่าข้อผิดพลาดนี้หมายถึงอะไรฉันทิ้งไว้ครู่หนึ่งและยังมีภาพสุดท้าย "newImage.tif" ที่ผลิตโดยขั้นตอน gdalwarp ใช้สิ่งนี้ฉันเรียกว่า gdal2tiles.py

gdal2tiles.py newImage.tif

สิ่งนี้สร้างโฟลเดอร์ที่มีโฟลเดอร์ย่อย 10-18 (ไม่ใช่แค่ระดับการซูม 18 เท่าที่ฉันเคยได้รับมาก่อน) นอกจากนี้ยังสามารถอ่านได้อย่างสมบูรณ์แบบใน Cesium โดยไม่มีข้อผิดพลาดของคอนโซล แต่ภาพยังคงดูเหมือน "ผิด":

โหลดภาพไปยัง Cesium

ฉันกำลังพิจารณาปัญหาของฉันอาจเป็นเพราะ @ user30184 ได้แนะนำ "... แหล่งข้อมูลไม่เหมาะสำหรับ gdal2tiles" อย่างไรก็ตามจนกระทั่งผู้ให้บริการของเราสามารถให้บางสิ่งบางอย่างแก่เราเพื่อใช้กับ gdal นี่คือทั้งหมดที่ฉันมี

ฉันกำลังพิจารณาว่าจะลบวงดนตรีวงใดวงหนึ่งออกเพื่อไม่ให้ gdal รบกวนวงสุดท้ายเป็นช่องอัลฟา ข้อเสนอแนะใด ๆ


ทำไมคุณถึงต้องการระบุตำแหน่งภาพ? มีข้อมูล CRS ทั้งหมดอยู่แล้ว
AndreJ

คำตอบ:


7

ฉันคิดว่าสิ่งที่คุณต้องทำคือปฏิเสธโดยใช้:

gdalwarp -co TILED=YES -co COMPRESS=DEFLATE -t_srs EPSG:3857 newImage.tif image.tif

แล้วเรียงมัน:

gdal2tiles.py newImage.tif

หากไฟล์ของคุณมีขนาดใหญ่มากอาจใช้เวลาสักครู่


คุณสามารถควบคุมระดับการซูมด้วยพารามิเตอร์ -z คุณลองมาแล้วหรือยัง และสังเกตว่ารูปภาพของคุณมี 4 แถบซึ่งอาจนำไปสู่ผลลัพธ์ที่ไม่คาดคิดโดยเฉพาะอย่างยิ่งเนื่องจากคุณจัดการกับข้อมูล 16 บิต การประมวลผลล่วงหน้าบางอย่างอาจจำเป็นต้องมีก่อน
30184

ขอบคุณสำหรับการตอบกลับของคุณ @iant ฉันจะลองทำสิ่งนี้และดูว่าจะเกิดอะไรขึ้น บางทีคุณอาจอธิบายเพิ่มเติมอีกเล็กน้อยในคำตอบของคุณว่าตัวเลือกที่คุณเลือกหมายถึงอะไร ตามเอกสารประกอบตัวเลือก -co "ผ่านตัวเลือกการสร้างไปยังไดรเวอร์รูปแบบเอาต์พุต" ดังนั้นคุณจะเพิ่มคุณสมบัติให้กับไฟล์ tiff หรือไม่
ความพยายาม

@ user30184 ฉันไม่ได้ลองเลย ฉันจะรู้ได้อย่างไรว่าระดับการซูมควรเป็นเท่าไร หรือฉันสามารถระบุพวกเขาตามที่ฉันต้องการ? ฉันคิดว่าการออกจากตัวเลือกนี้ฉันจะให้สคริปต์กำหนดระดับการซูมตามพื้นที่ที่เลือก
ความพยายาม

@ user30184 คุณยังกล่าวถึงว่าฉันอาจได้รับผลลัพธ์ที่ไม่คาดคิดกับภาพ 4 แถบสีและข้อมูล 16 บิต ทำไมล่ะ มันไม่ได้อยู่ในรูปแบบที่ถูกต้องสำหรับการประมวลผลกระเบื้อง gdal? ถ้าเป็นเช่นนั้นภาพที่ได้รับโดยตรงจากผู้ให้บริการขั้นตอนในการรับไฟล์ในรูปแบบที่ถูกต้องคืออะไร? เป็นไฟล์ TIFF ของ GDAL หรือไม่ (ถ้าฉันสามารถพูดอะไรแบบนั้นได้)
ความพยายาม

ฉันพบปัญหาต่อไปนี้ในการใช้ gdalwarp ตามที่คุณแนะนำ @iant: >>>>>>>>>>>> ข้อผิดพลาด 1: TIFFFillTile: อ่านข้อผิดพลาดที่แถว 43520, col 47104; มี 35788250 ไบต์คาดว่าจะมีข้อผิดพลาด 37421449 1: TIFFReadEncodedTile () ล้มเหลว ข้อผิดพลาด 1: pleiades_merge05m_2015-06-19.tif, แถบ 1: IReadBlock ล้มเหลวที่ X offset 86, Y offset 109 ข้อผิดพลาด 1: GetBlockRef ล้มเหลวที่ X block offset 86, Y block offset 109 >>>>>>>>>>> > ข้อเสนอแนะในการแก้ไขปัญหานี้?
ความพยายาม

2

ฉันคิดว่าภาพของคุณเป็นหนึ่งในผลิตภัณฑ์ 4 แบนด์โดย Airbus DS:

http://www.intelligence-airbusds.com/en/4951-which-spectral-mode-do-i-choose

Gdal2tiles ถูกสร้างขึ้นมาเพื่อแยกภาพทั่วไปและภาพออกเป็นกระเบื้อง png ภาพดังกล่าวใช้ 8 บิตต่อแบนด์และมีหนึ่งวง (greyscale), 3 แบนด์ (แดง - เขียว - น้ำเงิน) 4 วง (เร็ก - เขียว - น้ำเงิน + อัลฟา)

ฉันจะบอกว่าคำถามของคุณมีขนาดใหญ่ที่ไม่เกี่ยวข้องเพราะแหล่งข้อมูลของคุณไม่เหมาะสำหรับ gdal2tiles คุณอาจได้รับปัญหาทันทีที่คุณมีอยู่ในขณะนี้ แต่ผลลัพธ์สุดท้ายก็ยังไม่ดีหากคุณไม่ประมวลผลข้อมูลอีกครั้ง

สาเหตุของไทล์ที่ดูไม่ดีที่คุณแนบมากับคำถามของคุณอาจเป็นเพราะวงข้อมูลที่สี่ถูกตีความว่าเป็นช่องอัลฟา


ขอบคุณ @ user30184 ฉันได้อ่านทรัพยากรบางอย่างและมีความคิดคล้าย ๆ กัน ฉันคิดว่ามันเป็นการดีที่สุดที่จะขอให้ผู้ให้บริการของเรามอบไฟล์ TIFF "ที่เข้ากันได้กับ GDAL" ให้เราได้ แต่จนกว่าพวกเขาจะกลับมาหาเรานี่คือทั้งหมดที่เรามี ฉันกำลังพิจารณาว่าจะลบวงดนตรีวงใดวงหนึ่งออกเพื่อไม่ให้ gdal รบกวนวงสุดท้ายเป็นช่องอัลฟา ข้อเสนอแนะใด ๆ
ความพยายาม

ใช้ gdal_translate สำหรับการตัดเซ็ตย่อยเล็ก ๆ จากภาพgdal_translate -srcwin 20000 20000 1000 1000 original.tif sample.tifควรทำ (ออฟเซ็ตขนาดใหญ่เพื่อหลีกเลี่ยงพื้นที่โนดาต้า) เปิดภาพขนาดเล็กนี้ด้วย QGIS และคุณควรจะสามารถเล่นกับการตั้งค่าการดูได้อย่างรวดเร็ว ฉันเดาเกี่ยวกับช่องอัลฟาอาจผิดปกติไม่งั้นผลลัพธ์ควรดูมีสีสันไม่ใช่สีเทา
user30184

ขอบคุณ @ user30184 ฉันทำตามที่คุณแนะนำและเปิดสำเร็จใน QGIS ดูลิงค์นี้: drive.google.com/open?id=0B97NtaPJrVz-anRYQmxjZFludk0ฉันจะไปที่ "ดีบั๊ก" ปัญหาของฉันได้อย่างไร ใช้ QGIS ในการทำ gdalwarp และ gdal2tiles หรือไม่?
ความพยายาม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.