ชุดข้อมูล GSW มีเลเยอร์ข้อมูลจำนวนมากที่แสดงข้อมูลน้ำผิวดินในรูปแบบต่างๆ เราจะเริ่มด้วยการแสดงภาพเลเยอร์การเกิดน้ำ ซึ่งจะสรุปว่าน้ำผิวดินเกิดขึ้นที่ใดและบ่อยเพียงใดตลอด ช่วงเวลาระหว่างเดือนมีนาคม 1984 ถึงตุลาคม 2015
ส่วนนี้ของบทแนะนำจะทำสิ่งต่อไปนี้
- เพิ่มเลเยอร์แผนที่เพื่อแสดงภาพการเกิดน้ำผิวดิน
- แสดงวิธีค้นหาค่าของเลเยอร์แผนที่
- เพิ่มการจัดรูปแบบที่กำหนดเองเพื่อปรับปรุงการแสดงภาพ
- สร้างเลเยอร์มาสก์น้ำแบบไบนารีโดยใช้ค่าเกณฑ์
- วางแผนที่ไว้ตรงกลางส่วนที่น่าสนใจของโลก และ
- แสดงวิธีปรับโครงสร้างโค้ดสคริปต์เพื่อให้โค้ดอ่านง่ายขึ้นและบำรุงรักษาได้ง่ายขึ้น
การสร้างภาพพื้นฐาน
เริ่มโดยการคัดลอกข้อความต่อไปนี้ลงในเครื่องมือแก้ไขโค้ด
โปรแกรมแก้ไขโค้ด (JavaScript)
var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater'); var occurrence = gsw.select('occurrence'); Map.addLayer(occurrence);
คำสั่งแรกอ้างอิงออบเจ็กต์รูปภาพของ Earth Engine สำหรับชุดข้อมูล GSW และ
จัดเก็บไว้ในตัวแปรชื่อ gsw
คำสั่งที่ 2 เลือกเลเยอร์เดียวของชุดข้อมูล GSW และจัดเก็บไว้ในตัวแปรที่ชื่อ occurrence
คำสั่งที่ 3 จะเพิ่มรูปภาพการเกิดไปยังแผนที่แบบอินเทอร์แอกทีฟของโปรแกรมแก้ไขโค้ด
คลิกปุ่ม "เรียกใช้" ของโปรแกรมแก้ไขโค้ด แล้วหลังจากนั้นไม่กี่วินาที คุณควรเห็นแผนที่ที่มี การระบายสีเทาตามแนวชายฝั่ง คล้ายกับรูปที่ 1

ในพื้นที่ส่วนใหญ่ ชุดข้อมูล GSW จะปรากฏอย่างโปร่งใส เนื่องจากตำแหน่งที่ไม่ได้รวบรวม รูปภาพ Landsat (เช่น พื้นที่มหาสมุทร) หรือตำแหน่งที่ไม่มีการตรวจพบน้ำ จากการสังเกตการณ์ใดๆ ในช่วง 32 ปีที่ผ่านมาจะ ถูกมาสก์ออก
การตรวจสอบค่า
หากต้องการสํารวจค่าของเลเยอร์การเกิดน้ำ เราจะใช้แท็บ Inspector ของ Code Editor ก่อนอื่นให้คลิกแท็บเครื่องมือตรวจสอบ แล้วคลิกแผนที่เพื่อเลือกตำแหน่ง แท็บเครื่องมือตรวจสอบ จะแสดงข้อมูลเกี่ยวกับเลเยอร์แต่ละเลเยอร์ที่ปรากฏในตำแหน่งที่คุณคลิก

ในตัวอย่างด้านบน ค่าของเลเยอร์ที่ชื่อ value
คือ 98 หน่วยคือ
จุดเปอร์เซ็นต์ ดังนั้นประมาณ 98% ของเวลาที่ระบบจัดประเภทสถานที่ตั้งว่าปกคลุมด้วยน้ำ
ค่านี้คือค่าเฉลี่ยของค่าการเกิดน้ำผิวดินรายเดือนแต่ละค่า ซึ่ง
จะปรับเทียบกับการเปลี่ยนแปลงตามฤดูกาลตามที่อธิบายไว้ใน
คู่มือผู้ใช้ข้อมูล (v2)
การปรับโครงสร้างโค้ดเพื่อปรับปรุงโค้ด
สคริปต์ของเรามีเพียง 2 คำสั่ง แต่เราก็มีโอกาสที่จะปรับโครงสร้างโค้ด
เพื่อให้สคริปต์สุดท้ายอ่านและดูแลรักษาได้ง่ายขึ้นเมื่อเวลาผ่านไป
ปัจจุบัน Map.addLayer()
statement จะส่งอาร์กิวเมนต์เดียว
occurrence
ซึ่งเป็นออบเจ็กต์รูปภาพของ Earth Engine ที่เราต้องการแสดงบน
แผนที่ อย่างไรก็ตาม Map.addLayer()
ยังอนุญาตให้ส่งอาร์กิวเมนต์เพิ่มเติม
ไปยังฟังก์ชันได้ด้วย หากต้องการดูอาร์กิวเมนต์ที่ใช้ได้โดยเร็ว ให้วางเคอร์เซอร์หลังวงเล็บเปิด
แล้วกดแป้นพิมพ์ลัดสำหรับ "แสดงคำแนะนำโค้ด" เพื่อแสดง
เอกสารช่วยเหลือสำหรับเมธอด addLayer
(ดูแป้นพิมพ์ลัดได้โดย
เลือกเมนูความช่วยเหลือ -> แป้นพิมพ์ลัด)

แป้นพิมพ์ลัดแสดงว่ามีอาร์กิวเมนต์ 5 รายการที่ส่งไปยัง
Map.addLayer
ได้
eeObject
, visParams
, name
, shown
และ
opacity
ในสคริปต์ปัจจุบัน เราส่งตัวแปรเดียวคือ occurrence
ซึ่ง
ตีความเป็นอาร์กิวเมนต์แรก eeObject
หากต้องการส่งทั้งออบเจ็กต์ตัวแปรและอาร์กิวเมนต์เพิ่มเติมที่ตั้งชื่อเลเยอร์ เราสามารถ
ปรับโครงสร้างโค้ดเพื่อใช้ "อาร์กิวเมนต์ที่มีชื่อ" (eeObject
และ name
)
ซึ่งส่งภายในไปยังเมธอดจากภายใน
โครงสร้างข้อมูล JSON
ดังที่แสดงด้านล่าง
โปรแกรมแก้ไขโค้ด (JavaScript)
Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});
เรียกใช้โค้ดอีกครั้งเพื่อให้แน่ใจว่ายังใช้งานได้หลังจากทำการเปลี่ยนแปลงการปรับโครงสร้าง แผนที่ที่ได้ควรไม่มีการเปลี่ยนแปลง
การเพิ่มพารามิเตอร์การแสดงข้อมูลภาพ
จากนั้นเราจะปรับปรุงพารามิเตอร์การแสดงภาพเริ่มต้น ซึ่งทำให้
น้ำของเราปรากฏเป็นสีเทา เพิ่มคำสั่งใหม่ที่สร้างตัวแปร
VIS_OCCURRENCE
และส่งเป็นอาร์กิวเมนต์เพิ่มเติมไปยังเมธอด addLayer
โปรแกรมแก้ไขโค้ด (JavaScript)
var VIS_OCCURRENCE = { min: 0, max: 100, palette: ['red', 'blue'] };
โปรแกรมแก้ไขโค้ด (JavaScript)
Map.addLayer({ eeObject: occurrence.updateMask(occurrence.divide(100)), name: 'Water Occurrence (1984-2015)', visParams: VIS_OCCURRENCE });
พารามิเตอร์การแสดงภาพที่จัดเก็บไว้ในโครงสร้าง JSON VIS_OCCURRENCE
ระบุ
ว่าควรใช้สีแดงสำหรับค่าต่ำสุดที่ 0% และสีน้ำเงินสำหรับค่าสูงสุดที่ 100%
การเพิ่ม .updateMask(occurrence.divide(100))
จะทำให้ระบบตั้งค่าความทึบแสง/ความโปร่งใสของพิกเซลตามค่าการเกิด
เรียกใช้สคริปต์อีกครั้ง แล้วดูผลลัพธ์ที่แก้ไขจากการเปลี่ยนแปลงสไตล์

ตอนนี้พื้นที่น้ำเป็นสีฟ้าแล้ว ความคืบหน้า
การสร้างเลเยอร์ขีดจำกัด
รูปภาพการเกิดน้ำมีข้อมูลเกี่ยวกับความถี่ที่คาดการณ์ว่าจะมีน้ำ โดยใช้ ช่วงค่าตั้งแต่ 0 ถึง 100% อย่างไรก็ตาม การกำหนดเลเยอร์น้ำแบบไบนารี (เช่น "น้ำ" กับ "ไม่ใช่ น้ำ") โดยอิงตามเปอร์เซ็นต์การเกิดที่แน่นอน (เช่น ค่า เกณฑ์) มักจะมีประโยชน์ เราจะใช้เลเยอร์ไบนารีแบบง่ายนี้เป็นเลเยอร์พื้นหลังที่สะอาดซึ่งวางซ้อนทับ เลเยอร์ GSW อื่นๆ ได้ คุณสร้างเลเยอร์เกณฑ์นี้ได้โดยใช้คำสั่งต่อไปนี้ ซึ่งใช้ค่าเกณฑ์ 90% เพื่อแยกน้ำและสิ่งที่ไม่ใช่น้ำ
ก่อนอื่นเราจะกำหนดตัวแปรการแสดงภาพใหม่ VIS_WATER_MASK
เพื่อเก็บข้อมูลการจัดรูปแบบ
สำหรับมาสก์น้ำ
โปรแกรมแก้ไขโค้ด (JavaScript)
var VIS_WATER_MASK = { palette: ['white', 'black'] };
จากนั้นเราจะคำนวณเลเยอร์มาสก์น้ำโดยใช้ตัวดำเนินการเปรียบเทียบ "มากกว่า"
.gt(90)
แล้วตั้งค่าพื้นที่ที่มาสก์ไว้ก่อนหน้านี้เป็น 0 โดยใช้วิธี
.unmask()
โปรแกรมแก้ไขโค้ด (JavaScript)
// Create a water mask layer, and set the image mask so that non-water areas // are opaque. var water_mask = occurrence.gt(90).unmask(0);
และสุดท้าย ให้เพิ่มเลเยอร์ลงในแผนที่ หากต้องการให้เลเยอร์นี้แสดงผลใต้เลเยอร์อื่นๆ ทั้งหมด
ให้วางคำสั่งต่อไปนี้ก่อนคำสั่งอื่นๆ ทั้งหมดMap.addLayer
โปรแกรมแก้ไขโค้ด (JavaScript)
Map.addLayer({ eeObject: water_mask, visParams: VIS_WATER_MASK, name: '90% occurrence water mask' });

การเดินทางไปยังส่วนที่น่าสนใจของโลก
การสำรวจโลกด้วยการเลื่อนและซูมนั้นสนุก แต่โลกก็กว้างใหญ่และบางครั้งการข้ามไปยังตำแหน่งที่เฉพาะเจาะจงโดยตรงก็ช่วยได้ ต่อไปนี้คือชุดข้อความที่แสดงตัวอย่างเล็กๆ ของสถานที่ที่น่าสนใจในแง่ของน้ำผิวดิน เพียงยกเลิกการแสดงความคิดเห็นของคำสั่งใดคำสั่งหนึ่งครั้งละ 1 รายการ สคริปต์ก็จะไปยังตำแหน่งนั้น เมื่อเรียกใช้
โปรแกรมแก้ไขโค้ด (JavaScript)
// Uncomment one of the following statements to center the map. // Map.setCenter(-90.162, 29.8597, 10); // New Orleans, USA // Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico // Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA // Map.setCenter(149.412, -35.0789, 11); // Lake George, Australia // Map.setCenter(105.26, 11.2134, 9); // Mekong River Basin, SouthEast Asia // Map.setCenter(90.6743, 22.7382, 10); // Meghna River, Bangladesh // Map.setCenter(81.2714, 16.5079, 11); // Godavari River Basin Irrigation Project, India // Map.setCenter(14.7035, 52.0985, 12); // River Oder, Germany & Poland // Map.setCenter(-59.1696, -33.8111, 9); // Buenos Aires, Argentina Map.setCenter(-74.4557, -8.4289, 11); // Ucayali River, Peru
นี่เป็นเพียงตัวอย่างเล็กๆ ของสถานที่ที่น่าสนใจ คุณสามารถเพิ่มคำสั่งของคุณเองได้
การปรับโครงสร้างภายในโค้ดอีกครั้ง...
ก่อนที่จะไปยังเลเยอร์ถัดไปของชุดข้อมูล GSW เราจะทำการปรับโครงสร้างโค้ดเพิ่มเติมเล็กน้อย โดยเฉพาะอย่างยิ่ง เราจะจัดกลุ่มคำสั่งที่คล้ายกันไว้ด้วยกัน และเพิ่มความคิดเห็นบางอย่างที่จะแบ่งโค้ดออกเป็นส่วนๆ สำหรับชิ้นงาน ค่าคงที่ การคำนวณ การจัดกึ่งกลางแผนที่ และการเพิ่มเลเยอร์แผนที่
นี่คือสคริปต์ที่ปรับโครงสร้างขั้นสุดท้าย
โปรแกรมแก้ไขโค้ด (JavaScript)
////////////////////////////////////////////////////////////// // Asset List ////////////////////////////////////////////////////////////// var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater'); var occurrence = gsw.select('occurrence'); ////////////////////////////////////////////////////////////// // Constants ////////////////////////////////////////////////////////////// var VIS_OCCURRENCE = { min: 0, max: 100, palette: ['red', 'blue'] }; var VIS_WATER_MASK = { palette: ['white', 'black'] }; ////////////////////////////////////////////////////////////// // Calculations ////////////////////////////////////////////////////////////// // Create a water mask layer, and set the image mask so that non-water areas // are opaque. var water_mask = occurrence.gt(90).unmask(0); ////////////////////////////////////////////////////////////// // Initialize Map Location ////////////////////////////////////////////////////////////// // Uncomment one of the following statements to center the map. // Map.setCenter(-90.162, 29.8597, 10); // New Orleans, USA // Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico // Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA // Map.setCenter(149.412, -35.0789, 11); // Lake George, Australia // Map.setCenter(105.26, 11.2134, 9); // Mekong River Basin, SouthEast Asia // Map.setCenter(90.6743, 22.7382, 10); // Meghna River, Bangladesh // Map.setCenter(81.2714, 16.5079, 11); // Godavari River Basin Irrigation Project, India // Map.setCenter(14.7035, 52.0985, 12); // River Oder, Germany & Poland // Map.setCenter(-59.1696, -33.8111, 9); // Buenos Aires, Argentina Map.setCenter(-74.4557, -8.4289, 11); // Ucayali River, Peru ////////////////////////////////////////////////////////////// // Map Layers ////////////////////////////////////////////////////////////// Map.addLayer({ eeObject: water_mask, visParams: VIS_WATER_MASK, name: '90% occurrence water mask', shown: false }); Map.addLayer({ eeObject: occurrence.updateMask(occurrence.divide(100)), name: 'Water Occurrence (1984-2015)', visParams: VIS_OCCURRENCE });
ในส่วนถัดไป คุณจะได้ดูว่าการเกิดน้ำ เปลี่ยนแปลงไปอย่างไรเมื่อเวลาผ่านไป