หากต้องการความยืดหยุ่นในการอัปโหลดรูปภาพไปยัง Google Earth Engine (EE) มากกว่าที่UI ของตัวแก้ไขโค้ดหรือคำสั่ง upload ของเครื่องมือบรรทัดคำสั่ง "earthengine" มีให้ คุณสามารถทำได้โดยอธิบายการอัปโหลดรูปภาพโดยใช้ไฟล์ JSON ที่เรียกว่า "ไฟล์ Manifest" และใช้คำสั่ง upload image --manifest ของเครื่องมือบรรทัดคำสั่ง
ดูตัวอย่างที่สมบูรณ์ใน Colab Notebook นี้ ซึ่งสาธิตการอัปโหลดชิ้นส่วนรูปภาพเป็นชิ้นงานเดียวโดยใช้ไฟล์ Manifest
การตั้งค่าเพียงครั้งเดียว
- การอัปโหลดไฟล์ Manifest ใช้ได้กับไฟล์ที่อยู่ใน Google Cloud Storage เท่านั้น หากต้องการเริ่มใช้ Google Cloud Storage ให้สร้างโปรเจ็กต์ Google Cloud หากยังไม่มี โปรดทราบว่าการตั้งค่าต้องระบุบัตรเครดิตสำหรับการเรียกเก็บเงิน EE เองไม่ได้เรียกเก็บเงินจากผู้ใช้ในขณะนี้ แต่การโอนไฟล์ไปยัง Google Cloud Storage ก่อนอัปโหลดไปยัง EE จะมีค่าใช้จ่ายเล็กน้อย สำหรับขนาดข้อมูลการอัปโหลดทั่วไป (หลายสิบหรือหลายร้อยกิกะไบต์) ค่าใช้จ่ายจะค่อนข้างต่ำ
- ภายในโปรเจ็กต์ ให้เปิด Cloud Storage API และสร้างที่เก็บข้อมูล
- ติดตั้งไคลเอ็นต์ Python ของ Earth Engine ซึ่งรวมถึงเครื่องมือบรรทัดคำสั่ง
earthengineที่เราจะใช้ในการอัปโหลดข้อมูล - สำหรับการอัปโหลดอัตโนมัติ คุณอาจต้องใช้บัญชีบริการ Google Cloud ที่เชื่อมโยงกับโปรเจ็กต์ของคุณ คุณไม่จำเป็นต้องใช้บัญชีบริการสำหรับการทดสอบ แต่หากมีเวลา โปรดเริ่มทำความคุ้นเคยกับการใช้บัญชีบริการ
ไฟล์ต้นฉบับขนาดใหญ่มาก (100 GB ขึ้นไป) อาจอัปโหลดได้เร็วขึ้นหากแบ่งออกเป็นหลายๆ ไฟล์
รหัสเนื้อหาและชื่อ
สำหรับชิ้นงานที่โปรเจ็กต์ที่อยู่ในระบบคลาวด์เป็นเจ้าของ ให้ใช้รูปแบบชื่อชิ้นงานต่อไปนี้
projects/some-project-id/assets/some-asset-id
ดูข้อมูลเกี่ยวกับชื่อชิ้นงานสำหรับโปรเจ็กต์เดิมและชิ้นงานที่ผู้ใช้เป็นเจ้าของ
สำหรับโปรเจ็กต์เดิมที่เก่ากว่า ชื่อเนื้อหาในไฟล์ Manifest จะต้องแตกต่างจากรหัสเนื้อหาที่มองเห็นได้ในที่อื่นๆ ใน Earth Engine เล็กน้อย หากต้องการอัปโหลดเนื้อหาที่มีรหัสเนื้อหาขึ้นต้นด้วย users/some_user หรือ projects/some_project ชื่อเนื้อหาในไฟล์ Manifest ต้องมีสตริง projects/earthengine-legacy/assets/ นำหน้ารหัส เช่น ควรอัปโหลดรหัสเนื้อหา EE users/username/my_geotiff โดยใช้ชื่อ projects/earthengine-legacy/assets/users/username/my_geotiff
ใช่ ซึ่งหมายความว่ารหัสอย่าง projects/some_projects/some_asset จะแปลงเป็นชื่อที่มีการพูดถึง projects 2 ครั้ง ดังนี้ projects/earthengine-legacy/assets/projects/some_projects/some_asset
ซึ่งอาจทำให้สับสน แต่จำเป็นต้องทำเพื่อให้เป็นไปตามมาตรฐาน Google Cloud API
การใช้ไฟล์ Manifest
ไฟล์ Manifest พื้นฐานจะแสดงในบล็อกโค้ดต่อไปนี้ โดยจะอัปโหลดไฟล์ชื่อ small.tif จากที่เก็บข้อมูล Google Cloud Storage ชื่อ gs://earthengine-test
{
"name": "projects/some-project-id/assets/some-asset-id",
"tilesets": [
{
"sources": [
{
"uris": [
"gs://earthengine-test/small.tif"
]
}
]
}
]
}หากต้องการใช้ ให้บันทึกเป็นไฟล์ชื่อ manifest.json แล้วเรียกใช้คำสั่งต่อไปนี้
earthengine upload image --manifest /path/to/manifest.json
(ไฟล์ gs://earthengine-test/small.tif มีอยู่และอ่านได้แบบสาธารณะ คุณสามารถใช้ไฟล์นี้เพื่อทดสอบได้)
ชุดชิ้นส่วนแผนที่
โครงสร้างไฟล์ Manifest ที่ค่อนข้างซับซ้อนของ JSON จำเป็นต่อการให้ความยืดหยุ่นที่เพียงพอในการจัดการกับความท้าทายในการอัปโหลดที่พบบ่อย ซึ่งก็คือวิธีอธิบายวิธีที่เป็นไปได้ทั้งหมดในการรวมพิกเซลจากไฟล์ต้นฉบับหลายไฟล์เป็นเนื้อหาเดียว โดยเฉพาะอย่างยิ่ง มี 2 วิธีในการจัดกลุ่มไฟล์เข้าด้วยกันอย่างอิสระ ดังนี้
- ภาพโมเสค บางครั้งไฟล์หลายไฟล์จะแสดงไทล์หลายรายการ (เช่น ไทล์แต่ละรายการเป็นสี่เหลี่ยมจัตุรัสขนาด 1x1 องศา) ไฟล์ดังกล่าวต้องโมเสก (ผสานรวมเข้าด้วยกัน) เป็นแบนด์เดียวกันในชิ้นงาน EE
- แยกย่านความถี่ บางครั้งไฟล์หลายไฟล์อาจแสดงถึงย่านความถี่หลายย่าน ไฟล์ดังกล่าวต้องซ้อนกันเป็นแบนด์ในชิ้นงาน EE
(คุณอาจต้องใช้วิธีทั้ง 2 วิธีพร้อมกัน แต่เป็นสถานการณ์ที่เกิดขึ้นไม่บ่อยนัก)
เพื่ออธิบายตัวเลือกเหล่านี้ ไฟล์ Manifest จะแนะนำแนวคิดของ tileset ชุดชิ้นส่วนเดียวจะสอดคล้องกับแหล่งที่มา GDAL แหล่งเดียว ด้วยเหตุนี้ แหล่งที่มาทั้งหมดในชุดชิ้นส่วนเดียวจึงต้องมีโครงสร้าง GDAL เดียวกัน (จำนวนและประเภทของแบนด์, การฉายภาพ, การเปลี่ยนรูปแบบ, ค่าที่ขาดหายไป) เนื่องจากแหล่งที่มา GDAL มีได้หลายแบนด์ ชุดชิ้นส่วนหนึ่งจึงอาจมีข้อมูลสำหรับแบนด์ EE หลายแบนด์
สำหรับการส่งผ่านข้อมูลโมเสก ไฟล์ Manifest จะมีลักษณะดังนี้
{
"name": "projects/some-project-id/assets/some-asset-id",
"tilesets": [
{
"sources": [
{
"uris": [
"gs://bucket/N30W22.tif"
]
},
{
"uris": [
"gs://bucket/N31W22.tif"
]
}
]
}
]
}สำหรับแบนด์แยก ไฟล์ Manifest จะมีลักษณะดังนี้ (คุณต้องเพิ่มส่วน bands ด้วยตามที่อธิบายไว้ด้านล่าง)
{
"name": "projects/some-project-id/assets/some-asset-id",
"bands": ...,
"tilesets": [
{
"id": "tileset_for_band1",
"sources": [
{
"uris": [
"gs://bucket/band1.tif"
]
}
]
},
{
"id": "tileset_for_band2",
"sources": [
{
"uris": [
"gs://bucket/band2.tif"
]
}
]
}
]
}โปรดทราบว่าในกรณีของย่านความถี่ที่แยกกัน เราต้องกำหนดรหัสชุดชิ้นส่วนที่แตกต่างกันให้กับชุดชิ้นส่วนแต่ละชุดเพื่อความชัดเจน รหัสชุดชิ้นส่วนอาจเป็นสตริงที่กำหนดเอง โดยระบบจะไม่เก็บสตริงเหล่านี้ไว้ในชิ้นงานที่อัปโหลด รหัสชุดชิ้นส่วนจะใช้ในการนำเข้าเท่านั้นเพื่อแยกความแตกต่างระหว่างชุดชิ้นส่วนที่ซ้อนกัน
ย่านความถี่
แนวคิดสำคัญประการที่ 2 คือการจับคู่ไฟล์ต้นฉบับกับย่านความถี่ของเนื้อหา EE
ซึ่งทำได้โดยใช้ส่วน bands ของไฟล์ Manifest
คุณสามารถละเว้นส่วน bands ได้ ซึ่งในกรณีนี้ ระบบจะสร้างแบนด์จากไฟล์ในชุดไทล์แรกก่อน จากนั้นจึงสร้างจากชุดไทล์ถัดไป และต่อไปเรื่อยๆ
โดยค่าเริ่มต้น แบนด์จะชื่อ "b1", "b2" ฯลฯ หากต้องการลบล้างชื่อแบนด์เริ่มต้น ให้ใส่ส่วน "bands" ไว้ที่ส่วนท้าย ดังนี้
{
"name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
"tilesets": [
{
"sources": [
{
"uris": [
"gs://bucket/rgb.tif"
]
}
]
}
],
"bands": [
{
"id": "R",
"tilesetBandIndex": 0
},
{
"id": "G",
"tilesetBandIndex": 1
},
{
"id": "B",
"tilesetBandIndex": 2
}
]
}จำนวนแบนด์ EE ต้องเท่ากับจำนวนแบนด์ทั้งหมดในชุดภาพทั้งหมด
หากไม่ต้องการนำเข้าแบนด์ทั้งหมดจากไฟล์ คุณสามารถใช้ช่อง tilesetBandIndex เพื่อระบุแบนด์ GDAL ที่ควรนำเข้า
แถบแรกมี tilesetBandIndex เป็น 0
ตัวอย่าง
สมมติว่าไฟล์ต้นฉบับมี 4 แบนด์ ได้แก่ "tmin", "tmin_error", "tmax", "tmax_error" เราต้องการนำเข้าเฉพาะ "tmin" และ "tmax" เท่านั้น ส่วนไฟล์ Manifest ที่เกี่ยวข้องจะมีลักษณะดังนี้
{
"name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
"tilesets": [
{
"id": "temperature",
"sources": [
{
"uris": [
"gs://bucket/temperature.tif"
]
}
]
}
],
"bands": [
{
"id": "tmin",
"tilesetBandIndex": 0,
"tilesetId": "temperature"
},
{
"id": "tmax",
"tilesetBandIndex": 2,
"tilesetId": "temperature"
}
]
}สายรัดหน้ากาก
การมาสก์แบนด์จะควบคุมโดยคอมโพเนนต์ maskBands ของไฟล์ Manifest
ระบบรองรับการกำหนดค่ามาสก์ที่เป็นไปได้ 3 แบบ (แต่ระบบจะถือว่าแถบมาสก์เป็นแถบสุดท้ายในไฟล์หนึ่งๆ เสมอ)
- มาสก์สำหรับย่านข้อมูลทั้งหมดในไฟล์เดียวกัน
- มาสก์สำหรับย่านข้อมูลทั้งหมดที่มาจากไฟล์อื่นๆ ทั้งหมด
- มาสก์สำหรับย่านข้อมูลบางย่าน
1. กรณีที่พบบ่อยที่สุดคือ GeoTIFF รายการเดียวที่มีการใช้แบนด์สุดท้ายเป็นมาสก์สำหรับแบนด์อื่นๆ วิธีนี้ใช้ได้กับ GeoTIFF ประเภทไบต์เท่านั้น ใช้ไฟล์ Manifest ต่อไปนี้
{
"name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
"tilesets": [
{
"id": "data_tileset",
"sources": [
{
"uris": [
"gs://bucket/data_file.tif"
]
}
]
}
],
"bands": [
{
"id": "data_band",
"tilesetId": "data_tileset"
},
{
"id": "qa_band",
"tilesetId": "data_tileset"
}
],
"maskBands": [
{
"tilesetId": "data_tileset"
}
]
}2. หากต้องการใช้มาสก์ GeoTIFF เป็นมาสก์สำหรับทุกแบนด์ใน GeoTIFF อื่น ให้ใช้ไฟล์ Manifest ต่อไปนี้
{
"name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
"tilesets": [
{
"id": "data_tileset",
"sources": [
{
"uris": [
"gs://bucket/data_file.tif"
]
}
]
},
{
"id": "mask_tileset",
"sources": [
{
"uris": [
"gs://bucket/mask_file.tif"
]
}
]
}
],
"bands": [
{
"id": "data_band",
"tilesetId": "data_tileset"
},
{
"id": "qa_band",
"tilesetId": "data_tileset"
}
],
"maskBands": [
{
"tilesetId": "mask_tileset"
}
]
}3. หากต้องการใช้ GeoTIFF เป็นมาสก์สำหรับแบนด์ที่เฉพาะเจาะจงในไฟล์อื่น ให้ใช้ไฟล์ Manifest ต่อไปนี้ (ความแตกต่างจากกรณีก่อนหน้าคือมีการตั้งค่าช่อง bandIds ใน maskBands)
{
"name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
"tilesets": [
{
"id": "data_tileset",
"sources": [
{
"uris": [
"gs://bucket/data_file.tif"
]
}
]
},
{
"id": "mask_tileset",
"sources": [
{
"uris": [
"gs://bucket/mask_file.tif"
]
}
]
}
],
"bands": [
{
"id": "data_band",
"tilesetId": "data_tileset"
},
{
"id": "qa_band",
"tilesetId": "data_tileset"
}
],
"maskBands": [
{
"tilesetId": "mask_tileset",
"bandIds": ["data_band"]
}
]
}ในตัวอย่างสุดท้าย เรากำลังทำงานกับ 2 แบนด์จากชุดไทล์ data_tileset แต่ใช้มาสก์กับแบนด์เดียวเท่านั้น (data_band) ตามที่ระบุไว้ในช่อง bandIds ของออบเจ็กต์รายการ maskBands เพียงรายการเดียวที่มีให้
โปรดทราบว่าระบบจะใช้เฉพาะแบนด์สุดท้ายของชุดชิ้นส่วนที่กล่าวถึงใน maskBands เป็นแบนด์มาสก์
นโยบายการสร้างเครือข่ายแบบพีระมิด
เมื่อ Earth Engine สร้างปิรามิดรูปภาพระหว่างการนำเข้า จะต้องลดตารางกริดขนาด 2x2 พิกเซลให้เหลือพิกเซลเดียวซ้ำๆ เพื่อเปลี่ยนรูปแบบค่าพิกเซล โดยค่าเริ่มต้น ระบบจะหาค่าเฉลี่ยของค่าพิกเซล ซึ่งเป็นสิ่งที่ควรทำในกรณีส่วนใหญ่เมื่อแบนด์แรสเตอร์แสดงข้อมูลที่ต่อเนื่องไม่มากก็น้อย อย่างไรก็ตาม มี 2 สถานการณ์ที่การใช้ค่าเริ่มต้นจะทำให้ได้ผลลัพธ์ที่ไม่ถูกต้อง ซึ่งในกรณีนี้ต้องตั้งค่าฟิลด์ pyramidingPolicy ในคำจำกัดความของแบนด์ (หากไม่ได้ตั้งค่า ระบบจะถือว่าค่าเป็น "MEAN" โดยค่าเริ่มต้น)
สำหรับการจัดประเภทภาพแรสเตอร์ (เช่น สำหรับการจัดประเภทสิ่งปกคลุมดิน) วิธีที่สมเหตุสมผลที่สุดในการสร้างพีระมิดพิกเซลคือการใช้ค่าส่วนใหญ่จาก 4 ค่าเพื่อสร้างค่าถัดไป ซึ่งทำได้โดยใช้นโยบายการปิรามิด "MODE" ดังนี้
{
"name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
"tilesets": [
{
"sources": [
{
"uris": [
"gs://bucket/landcover.tif"
]
}
]
}
],
"bands": [
{
"id": "landcover",
"pyramidingPolicy": "MODE"
}
]
}สำหรับแบนด์แรสเตอร์ที่ทั้ง "MEAN" และ "MODE" ไม่สมเหตุสมผล (เช่น พิกเซลที่แพ็กบิต) ควรใช้นโยบายการสร้างปิรามิด "SAMPLE" "SAMPLE" จะใช้ค่าของพิกเซลด้านซ้ายบนจากตารางกริด 2x2 แต่ละตารางเสมอ ตัวอย่างต่อไปนี้กำหนดนโยบายการสร้างพีระมิด "MEAN" ให้กับแบนด์ที่แสดงตัวแปรต่อเนื่อง ("NDVI") และ "SAMPLE" ให้กับแบนด์ "QA" ของข้อมูล
{
"name": "projects/earthengine-legacy/assets/users/username/some_folder/some_id",
"tilesets": [
{
"sources": [
{
"uris": [
"gs://bucket/ndvi.tif"
]
}
]
}
],
"bands": [
{
"id": "NDVI",
"tilesetBandIndex": 0,
"pyramidingPolicy": "MEAN"
},
{
"id": "QA",
"tilesetBandIndex": 1,
"pyramidingPolicy": "SAMPLE"
}
]
}เวลาเริ่มต้นและสิ้นสุด
เนื้อหาทั้งหมดควรระบุเวลาเริ่มต้นและสิ้นสุดเพื่อให้บริบทเพิ่มเติมแก่ข้อมูล โดยเฉพาะอย่างยิ่งหากรวมอยู่ในคอลเล็กชัน แม้ว่าฟิลด์เหล่านี้จะไม่บังคับ แต่เราขอแนะนำอย่างยิ่งให้ใช้ฟิลด์เหล่านี้ทุกครั้งที่ทำได้
โดยปกติแล้ว เวลาเริ่มต้นและเวลาสิ้นสุดจะหมายถึงเวลาของการสังเกตการณ์ ไม่ใช่เวลาที่สร้างไฟล์ต้นฉบับ
ระบบจะถือว่าเวลาสิ้นสุดเป็นขอบเขตที่ไม่รวมเพื่อความง่าย เช่น สำหรับเนื้อหาที่ครอบคลุมระยะเวลา 1 วันพอดี ให้ใช้เวลาเที่ยงคืนของ 2 วันติดต่อกัน (เช่น 1980-01-31T00:00:00 และ 1980-02-01T00:00:00) เป็นเวลาเริ่มต้นและเวลาสิ้นสุด หากเนื้อหาไม่มีระยะเวลา ให้ตั้งเวลาสิ้นสุดให้เหมือนกับเวลาเริ่มต้น แสดงเวลาในไฟล์ Manifest เป็นสตริง ISO 8601 เราขอแนะนำให้ถือว่าเวลาสิ้นสุดเป็นแบบไม่รวม (เช่น เที่ยงคืนของวันถัดไปสำหรับชิ้นงานรายวัน) เพื่อให้ค่าวันที่เข้าใจง่ายขึ้น
ตัวอย่าง
{
"name": "projects/some-project-id/assets/some-asset-id",
"tilesets": [
{
"sources": [
{
"uris": [
"gs://bucket/img_20190612.tif"
]
}
]
}
],
"startTime": "1980-01-31T00:00:00Z",
"endTime": "1980-02-01T00:00:00Z"
}ข้อมูลอ้างอิงโครงสร้างไฟล์ Manifest
โครงสร้าง JSON ต่อไปนี้ประกอบด้วยช่องไฟล์ Manifest สำหรับการอัปโหลดรูปภาพที่เป็นไปได้ทั้งหมด ดูคำจำกัดความของช่องได้ในส่วนคำจำกัดความของช่องไฟล์ Manifestต่อไปนี้
{ "name": <string>, "tilesets": [ { "dataType": <string>, "id": <string>, "crs": <string>, "sources": [ { "uris": [ <stringn>> ], "affineTransform": { "scaleX": <double>, "shearX": <double>, "translateX": <double>, "shearY": <double>, "scaleY": <double>, "translateY": <double> } } ] } ], "bands": [ { "id": <string>, "tilesetId": <string>, "tilesetBandIndex": <int32>, "missingData": { "values": [<doublen>>] }, "pyramindingPolicy": <string> } ], "maskBands": [ { "tilesetId": <string>, "bandIds": [ <stringn>> ] } ], "footprint": { "points": [ { "x": <double>, "y": <doublen>> } ], "bandId": <string> }, "missingData": { "values": [<double>] }, "pyramidingPolicy": <string>, "uriPrefix": <string>, "startTime": { "seconds": <integer> }, "endTime": { "seconds": <integer> }, "properties": { <unspecified> } }
คำจำกัดความของช่องไฟล์ Manifest
name
string
ชื่อของชิ้นงานที่จะสร้าง
name อยู่ในรูปแบบ "projects/*/assets/**" (เช่น "projects/earthengine-legacy/assets/users/USER/ASSET")
ชุดชิ้นส่วนแผนที่
list
รายการพจนานุกรมที่กำหนดพร็อพเพอร์ตี้สำหรับชุดชิ้นส่วนแผนที่
ดูข้อมูลเพิ่มเติมได้ที่ช่ององค์ประกอบพจนานุกรม tilesets ต่อไปนี้
tilesets[i].dataType
string
ระบุประเภทข้อมูลตัวเลขของข้อมูล ค่าเริ่มต้นคือประเภทที่ GDAL รายงาน ซึ่งในกรณีนี้ไม่จำเป็นต้องกำหนด
| ประเภทข้อมูล | ค่า |
|---|---|
| ไม่ระบุ | "DATA_TYPE_UNSPECIFIED" |
| จำนวนเต็มแบบมีเครื่องหมาย 8 บิต | "INT8" |
| จำนวนเต็มแบบไม่มีเครื่องหมาย 8 บิต | "UINT8" |
| จำนวนเต็มแบบมีเครื่องหมาย 16 บิต | "INT16" |
| จำนวนเต็มแบบไม่มีเครื่องหมาย 16 บิต | "UINT16" |
| จำนวนเต็มแบบมีเครื่องหมาย 32 บิต | "INT32" |
| จำนวนเต็มแบบ 32 บิตที่ไม่ใช่ค่าลบ | "UINT32" |
| 32-bit float | "FLOAT32" |
| 64-bit float | "FLOAT64" |
tilesets[i].id
string
รหัสของชุดชิ้นส่วน ต้องไม่ซ้ำกันในชุดชิ้นส่วนที่ระบุในไฟล์ Manifest ของชิ้นงาน ระบบจะทิ้งรหัสนี้ในระหว่างขั้นตอนการประมวลผล โดยจะใช้เพื่อลิงก์ชุดชิ้นส่วนกับแบนด์เท่านั้น สตริงว่างเป็นรหัสที่ถูกต้อง
tilesets[i].crs
string
ระบบอ้างอิงพิกัดของตารางกริดพิกเซล ซึ่งระบุเป็นรหัสมาตรฐานหากเป็นไปได้ (เช่น รหัส EPSG) และในรูปแบบ WKT หากเป็นไปไม่ได้
tilesets[i].sources
list
รายการพจนานุกรมที่กำหนดพร็อพเพอร์ตี้ของไฟล์ภาพและไฟล์ Sidecar ดูข้อมูลเพิ่มเติมได้ที่ช่ององค์ประกอบพจนานุกรม sources ต่อไปนี้
tilesets[i].sources[j].uris
list
รายการ URI ของข้อมูลที่จะนำเข้า ระบบรองรับเฉพาะ URI ของ Google Cloud Storage เท่านั้น URI แต่ละรายการต้องระบุในรูปแบบต่อไปนี้
gs://bucket-id/object-id
ออบเจ็กต์หลักควรเป็นองค์ประกอบแรกของรายการ และรายการที่เกี่ยวข้องจะแสดงอยู่หลังจากนั้น URI แต่ละรายการจะมีคำนำหน้าเป็น ImageManifest.uriPrefix หากตั้งค่าไว้
tilesets[i].sources[j].affineTransform
dictionary
การเปลี่ยนรูปแบบแอฟฟีน (ไม่บังคับ) ควรระบุเฉพาะในกรณีที่ข้อมูลจาก uris (รวมถึงไฟล์ Sidecar) ไม่เพียงพอที่จะวางพิกเซล
ระบุเป็นพจนานุกรมที่มีคีย์ต่อไปนี้
"scaleX", "shearX", "translateX", "shearY", "scaleY", "translateY"
ดูข้อมูลเพิ่มเติมได้ในข้อมูลอ้างอิงนี้
ตัวอย่างคีย์และค่า
{
"scaleX": 0.1,
"shearX": 0.0,
"translateX": -180.0,
"shearY": 0.0,
"scaleY": -0.1,
"translateY": 90.0
}สายนาฬิกา
list
รายการพจนานุกรมที่กำหนดพร็อพเพอร์ตี้ของแบนด์เดียวที่มาจากชุดไทล์
โปรดทราบว่าลำดับแบนด์ของชิ้นงานจะเหมือนกับลำดับของ bands
ดูข้อมูลเพิ่มเติมได้ที่ช่ององค์ประกอบพจนานุกรม bands ต่อไปนี้
bands[i].id
string
รหัส (ชื่อ) ของวงดนตรี
bands[i].tilesetId
string
รหัสของชุดชิ้นส่วนที่สอดคล้องกับย่านความถี่
bands[i].tilesetBandIndex
int32
ดัชนีแถบแบบ 0 จากชุดชิ้นส่วนที่สอดคล้องกับแถบ
bands[i].missingData.values
list
รายการค่า (ประเภท Double) ที่แสดงถึงไม่มีข้อมูลในย่านความถี่
bands[i].pyramidingPolicy
string
นโยบายการปิรามิด ดูข้อมูลเพิ่มเติมได้ที่ลิงก์นี้ โดยมีตัวเลือกดังนี้
- "MEAN" (ค่าเริ่มต้น)
- "MODE"
- "SAMPLE"
maskBands
list
รายการพจนานุกรมที่กำหนดพร็อพเพอร์ตี้ของแถบมาสก์เดียวที่มาจากชุดไทล์
ระบุแถบมาสก์ได้สูงสุด 1 แถบ
ดูข้อมูลเพิ่มเติมได้ที่ช่ององค์ประกอบพจนานุกรม maskBands ต่อไปนี้
maskBands[i].tilesetId
string
รหัสของชุดไทล์ที่สอดคล้องกับแถบมาสก์ ระบบจะใช้แบนด์สุดท้ายของชุดชิ้นส่วนเป็นแบนด์มาสก์เสมอ
maskBands[i].bandIds
list of strings
รายการรหัสของย่านความถี่ที่ใช้ย่านความถี่มาสก์ หากเว้นว่างไว้ ระบบจะใช้แถบมาสก์กับแถบทั้งหมดในชิ้นงาน แต่ละย่านความถี่จะมีแถบมาสก์ที่สอดคล้องกันได้เพียงแถบเดียวเท่านั้น
รอยเท้า
dictionary
พจนานุกรมที่กำหนดพร็อพเพอร์ตี้ของฟุตพริ้นท์ของพิกเซลที่ถูกต้องทั้งหมดในรูปภาพ
หากเว้นว่างไว้ ฟุตพริ้นท์เริ่มต้นจะเป็นทั้งรูปภาพ ดูข้อมูลเพิ่มเติมได้ที่ช่ององค์ประกอบพจนานุกรม footprint ต่อไปนี้
footprint.points
list
รายการจุดที่กำหนดรอยเท้าของพิกเซลที่ถูกต้องทั้งหมดในรูปภาพ จุดจะกำหนดโดยพจนานุกรมที่มีคีย์ "x" และ "y" ที่มีค่าแบบ Float รายการจุดต่างๆ จะอธิบายวงแหวนที่สร้างภายนอกของรูปหลายเหลี่ยมแบบง่ายซึ่งต้องมีจุดศูนย์กลางของพิกเซลที่ถูกต้องทั้งหมดของรูปภาพ ซึ่งต้องเป็นวงแหวนเชิงเส้น โดยจุดสุดท้ายต้องเท่ากับจุดแรก พิกัดจะอยู่ในการฉายภาพของย่านความถี่ที่ระบุโดย bandId
หมายเหตุ: ใช้พิกัดที่ไม่ใช่จำนวนเต็ม เช่น จุดศูนย์กลางของแต่ละพิกเซล เนื่องจากระบบจะถือว่า footprint มีพิกเซลหากพิกเซล (สี่เหลี่ยมผืนผ้าขนาด 1x1) ตัดกับพื้นที่ครอบคลุม เพื่อหลีกเลี่ยงการเลือกพิกเซลข้างเคียงโดยไม่ตั้งใจ อย่าใช้พิกัดที่มีค่าเป็นจำนวนเต็ม เนื่องจากพิกัดดังกล่าวเป็นขอบเขตระหว่างพิกเซล การวาดฟุตพริ้นท์ตามศูนย์กลางพิกเซลจะช่วยป้องกันไม่ให้รวมพิกเซลที่ไม่ได้ตั้งใจ ซึ่งอาจทำให้เกิดข้อผิดพลาดเมื่อพิกเซลที่ต้องการอยู่ติดกับขอบเขตแผนที่ เช่น เส้นแอนติเมอริเดียนหรือขั้วโลก
ตัวอย่างเช่น สำหรับรูปภาพขนาด 2x2 ที่มีพิกเซลที่ถูกต้องทั้ง 4 พิกเซล ต่อไปนี้คือวงแหวนที่เป็นไปได้ 1 วง
[
{
"x": 0.5,
"y": 0.5
},
{
"x": 0.5,
"y": 1.5
},
{
"x": 1.5,
"y": 1.5
},
{
"x": 1.5,
"y": 0.5
},
{
"x": 0.5,
"y": 0.5
}
]footprint.bandId
string
รหัสของย่านความถี่ที่ CRS กำหนดพิกัดของพื้นที่ครอบคลุม หากเว้นว่างไว้ ระบบจะใช้ย่านความถี่แรก
missingData.values
list
รายการค่า (ประเภท Double) ซึ่งแสดงถึงไม่มีข้อมูลในทุกแบนด์ของรูปภาพ มีผลกับทุกย่านความถี่ที่ไม่ได้ระบุ missingData ของตัวเอง
pyramidingPolicy
string
นโยบายการปิรามิด หากไม่ได้ระบุ ระบบจะใช้นโยบาย "MEAN" โดยค่าเริ่มต้น มีผลกับทุกย่านความถี่ที่ไม่ได้ระบุย่านความถี่ของตนเอง ดูข้อมูลเพิ่มเติมได้ที่ลิงก์นี้ โดยมีตัวเลือกดังนี้
- "MEAN" (ค่าเริ่มต้น)
- "MODE"
- "SAMPLE"
uriPrefix
string
คำนำหน้าที่ไม่บังคับซึ่งเพิ่มไว้หน้า uris ทั้งหมดที่กำหนดไว้ในไฟล์ Manifest
startTime
integer
การประทับเวลาที่เชื่อมโยงกับเนื้อหา (หากมี) ซึ่งโดยปกติจะสอดคล้องกับเวลาที่ถ่ายภาพจากดาวเทียม สำหรับเนื้อหาที่สอดคล้องกับช่วงเวลา เช่น ค่าเฉลี่ยในช่วง 1 เดือนหรือ 1 ปี การประทับเวลานี้จะสอดคล้องกับจุดเริ่มต้นของช่วงเวลานั้น ระบุเป็นวินาทีและ (ไม่บังคับ) นาโนวินาทีตั้งแต่วันที่ 1 มกราคม ค.ศ. 1970 (Epoch) ระบบจะถือว่าอยู่ในเขตเวลา UTC
endTime
integer
สำหรับเนื้อหาที่สอดคล้องกับช่วงเวลา เช่น ค่าเฉลี่ยในระยะเวลา 1 เดือนหรือ 1 ปี การประทับเวลานี้จะสอดคล้องกับจุดสิ้นสุดของช่วงเวลานั้น (ไม่รวม) ระบุเป็นวินาทีและ (ไม่บังคับ) นาโนวินาทีตั้งแต่วันที่ 1 มกราคม ค.ศ. 1970 (Epoch) ระบบจะถือว่าอยู่ในเขตเวลา UTC
พร็อพเพอร์ตี้
dictionary
พจนานุกรมแบบแฟลตที่กำหนดเองของคู่คีย์-ค่า คีย์ต้องเป็นสตริงและค่าอาจเป็นตัวเลขหรือสตริงก็ได้ ชิ้นงานที่ผู้ใช้อัปโหลดยังไม่รองรับค่ารายการ
ข้อจำกัด
ขนาดไฟล์ Manifest ของ JSON
ไฟล์ Manifest ของ JSON ต้องมีขนาดไม่เกิน 10 MB หากมีไฟล์จำนวนมากที่ต้องอัปโหลด ให้พิจารณาวิธีลดจำนวนอักขระที่จำเป็นในการอธิบายชุดข้อมูล เช่น ใช้ช่อง uriPrefix เพื่อไม่ให้ต้องระบุเส้นทางที่เก็บข้อมูล Google Cloud สำหรับ URI แต่ละรายการในรายการ uris หากต้องการลดขนาดเพิ่มเติม ให้ลองย่อชื่อไฟล์ให้สั้นลง
รูปแบบไฟล์ภาพ
ไฟล์ภาพแต่ละไฟล์ต้องเป็นภาพ TIFF หากไม่ได้ระบุ CRS ในไฟล์ Manifest ไฟล์นั้นต้องเป็น GeoTIFF ที่มี CRS แบบฝัง
ไฟล์ TIFF สามารถบีบอัดด้วย DEFLATE, JPEG-XL/JXL, LERC, LERC_DEFLATE, LERC_ZSTD, LZMA, LZW, WEBP หรือ ZSTD
คำแนะนำเพื่อให้ได้รับประสบการณ์การอัปโหลดไฟล์ขนาดใหญ่ที่ดีที่สุดมีดังนี้
- ตัวเลือกที่ดีที่สุด: ZSTD มีความสมดุลที่ดีระหว่างความเร็วและการบีบอัด
- หลีกเลี่ยง: LZMA อาจทำงานช้ามากแม้ว่าจะบีบอัดได้ดีก็ตาม
- ไฟล์ที่ไม่ได้บีบอัด: จะทำให้ไฟล์มีขนาดใหญ่ขึ้นและใช้เวลาอัปโหลดนานขึ้น
- การบีบอัดแบบสูญเสียบางส่วน (เช่น JPEG): อาจเปลี่ยนแปลงค่าพิกเซล ใช้การบีบอัดแบบไม่สูญเสียรายละเอียด (เช่น DEFLATE, LZMA, LZW, ZSTD) เว้นแต่คุณจะเข้าใจผลกระทบที่อาจเกิดขึ้นกับข้อมูล