การเกิดน้ำท่วม (1984-2015)

ชุดข้อมูล GSW มีชั้นข้อมูลจำนวนมากที่แสดงข้อมูลน้ำผิวดินในรูปแบบต่างๆ เราจะเริ่มต้นด้วยการแสดงภาพเลเยอร์การเกิดน้ำ ซึ่งจะแสดงข้อมูลสรุปเกี่ยวกับตำแหน่งและความถี่ที่เกิดน้ำผิวดินตลอดระยะเวลาระหว่างเดือนมีนาคม 1984 ถึงตุลาคม 2015

ส่วนนี้ของบทแนะนำจะอธิบายสิ่งต่อไปนี้

  1. เพิ่มเลเยอร์ของแผนที่เพื่อแสดงภาพการเกิดน้ำผิวดิน
  2. แสดงวิธีค้นหาค่าของเลเยอร์ของแผนที่
  3. เพิ่มการจัดรูปแบบที่กำหนดเองเพื่อปรับปรุงการแสดงข้อมูลผ่านภาพ
  4. สร้างเลเยอร์มาสก์น้ำแบบไบนารีโดยใช้ค่าเกณฑ์
  5. ตั้งศูนย์กลางแผนที่ไว้ที่ส่วนต่างๆ ของโลกที่น่าสนใจ และ
  6. แสดงวิธีเปลี่ยนโครงสร้างภายในโค้ดของสคริปต์เพื่อให้อ่านและดูแลรักษาได้ง่ายขึ้น

การสร้างการแสดงภาพพื้นฐาน

เริ่มโดยคัดลอกข้อความต่อไปนี้ลงในตัวแก้ไขโค้ด

ตัวแก้ไขโค้ด (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 จะเพิ่มรูปภาพการเกิดลงในแผนที่แบบอินเทอร์แอกทีฟของตัวแก้ไขโค้ด

คลิกปุ่ม "เรียกใช้" ของตัวแก้ไขโค้ด และหลังจากผ่านไป 2-3 วินาที คุณควรเห็นแผนที่ที่มีสีเทาตามแนวชายฝั่ง คล้ายกับรูปที่ 1

การแสดงข้อมูลผ่านภาพเริ่มต้น
รูปที่ 1 การแสดงภาพเริ่มต้นของชั้นข้อมูลการเกิดน้ำผิวดินทั่วโลก

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

การตรวจสอบค่า

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

แท็บเครื่องมือตรวจสอบ
รูปที่ 2 ตัวอย่างเอาต์พุตของแท็บเครื่องมือตรวจสอบ

ในตัวอย่างด้านบน ค่าของเลเยอร์ชื่อ value คือ 98 หน่วยเป็นเปอร์เซ็นต์ ดังนั้นประมาณ 98% ของเวลาทั้งหมดที่ตำแหน่งดังกล่าวได้รับการจัดประเภทว่ามีน้ำปกคลุม ค่านี้คือค่าเฉลี่ยของค่าการเกิดน้ำผิวดินรายเดือนแต่ละค่า ซึ่งปรับให้สอดคล้องกับความแปรปรวนตามฤดูกาลตามที่อธิบายไว้ใน คู่มือผู้ใช้ข้อมูล (เวอร์ชัน 2)

การเปลี่ยนโครงสร้างภายในโค้ดเพื่อปรับปรุงโค้ด

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

อาร์กิวเมนต์ Map.addLayer
รูปที่ 3 ภาพหน้าจอแสดงอาร์กิวเมนต์ของเมธอด 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)) จะทำให้ระบบตั้งค่าความทึบแสง/ความโปร่งใสของพิกเซลตามค่าการเกิด

เรียกใช้สคริปต์อีกครั้ง แล้วดูผลลัพธ์ที่แก้ไขแล้วจากการเปลี่ยนแปลงการจัดรูปแบบ

การเกิดน้ำผิวดิน
รูปที่ 4 ภาพหน้าจอของการเกิดน้ำในสามเหลี่ยมปากแม่น้ำปารานาใกล้กับบัวโนสไอเรส โดยใช้สีแดงโปร่งใสสำหรับปลายทางค่าต่ำสุด 0% และสีน้ำเงินทึบสำหรับปลายทางค่าสูงสุด

ตอนนี้พื้นที่น้ำเป็นสีน้ำเงินแล้ว ความคืบหน้า

การสร้างเลเยอร์เกณฑ์

รูปภาพการเกิดน้ำประกอบด้วยข้อมูลเกี่ยวกับความถี่ที่คาดว่าจะเกิดน้ำโดยใช้ช่วงค่าตั้งแต่ 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'
});
มาสก์น้ำ 90%
รูปที่ 5 ภาพหน้าจอของมาสก์น้ำ 90% สำหรับสามเหลี่ยมปากแม่น้ำปารานาใกล้กับบัวโนสไอเรส

การเดินทางไปยังส่วนต่างๆ ของโลกที่น่าสนใจ

การสำรวจโลกด้วยการเลื่อนและซูมไปรอบๆ เป็นเรื่องสนุก แต่โลกนั้นกว้างใหญ่และบางครั้งการข้ามไปยังสถานที่หนึ่งๆ โดยตรงก็ช่วยได้ ต่อไปนี้เป็นชุดข้อความที่แสดงตัวอย่างเล็กๆ น้อยๆ ของสถานที่ที่น่าสนใจในแง่ของน้ำผิวดิน เพียงยกเลิกการคอมเมนต์คำสั่งทีละรายการ แล้วสคริปต์จะไปยังตำแหน่งนั้นเมื่อเรียกใช้

ตัวแก้ไขโค้ด (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
});

ในส่วนถัดไป คุณจะได้สำรวจว่าการเกิดน้ำเปลี่ยนแปลงไปอย่างไรเมื่อเวลาผ่านไป