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

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

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

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

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

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

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

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

การปรับโครงสร้างโค้ดเพื่อปรับปรุงโค้ด

สคริปต์ของเรามีเพียง 2 คำสั่ง แต่เราก็มีโอกาสที่จะปรับโครงสร้างโค้ด เพื่อให้สคริปต์สุดท้ายอ่านและดูแลรักษาได้ง่ายขึ้นเมื่อเวลาผ่านไป ปัจจุบัน Map.addLayer() statement จะส่งอาร์กิวเมนต์เดียว 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% สำหรับบริเวณ Paraná Delta ใกล้บัวโนสไอเรส

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

การสำรวจโลกด้วยการเลื่อนและซูมนั้นสนุก แต่โลกก็กว้างใหญ่และบางครั้งการข้ามไปยังตำแหน่งที่เฉพาะเจาะจงโดยตรงก็ช่วยได้ ต่อไปนี้คือชุดข้อความที่แสดงตัวอย่างเล็กๆ ของสถานที่ที่น่าสนใจในแง่ของน้ำผิวดิน เพียงยกเลิกการแสดงความคิดเห็นของคำสั่งใดคำสั่งหนึ่งครั้งละ 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
});

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