การดำเนินการทางคณิตศาสตร์

คุณสามารถทําการคํานวณทางคณิตศาสตร์ของรูปภาพได้โดยใช้โอเปอเรเตอร์ เช่น add() และ subtract() แต่สําหรับการคํานวณที่ซับซ้อนซึ่งมีมากกว่า 2 รายการ ฟังก์ชัน expression() จะเป็นทางเลือกที่ดี ดูข้อมูลเพิ่มเติมเกี่ยวกับโอเปอเรเตอร์และนิพจน์ได้ที่ส่วนต่อไปนี้

โอเปอเรเตอร์

โอเปอเรเตอร์ทางคณิตศาสตร์จะดำเนินการทางคณิตศาสตร์พื้นฐานกับแถบรูปภาพ โดยรับอินพุต 2 รายการ ได้แก่ รูปภาพ 2 รูปหรือรูปภาพ 1 รูปและเทอมคงที่ ซึ่งจะตีความว่าเป็นรูปภาพคงที่ย่านความถี่เดียวที่ไม่มีพิกเซลที่มีการมาสก์ ระบบจะดำเนินการต่อพิกเซลสำหรับแต่ละย่านความถี่

ตัวอย่างพื้นฐานคือ พิจารณางานการคำนวณดัชนีความแตกต่างของพืช (NDVI) ที่ปรับมาตรฐานแล้วโดยใช้ภาพ VIIRS ซึ่งใช้โอเปอเรเตอร์ add(), subtract() และ divide()

เครื่องมือแก้ไขโค้ด (JavaScript)

// Load a VIIRS 8-day surface reflectance composite for May 2024.
var viirs202405 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-05-01', '2024-05-16')).first();

// Compute NDVI.
var ndvi202405 = viirs202405.select('SurfReflect_I2')
  .subtract(viirs202405.select('SurfReflect_I1'))
  .divide(viirs202405.select('SurfReflect_I2')
    .add(viirs202405.select('SurfReflect_I1')));

การตั้งค่า Python

ดูข้อมูลเกี่ยวกับ Python API และการใช้ geemap สําหรับการพัฒนาแบบอินเทอร์แอกทีฟได้ที่หน้า สภาพแวดล้อม Python

import ee
import geemap.core as geemap

Colab (Python)

# Load a VIIRS 8-day surface reflectance composite for May 2024.
viirs202405 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-05-01', '2024-05-16'))
    .first()
)

# Compute NDVI.
ndvi202405 = (
    viirs202405.select('SurfReflect_I2')
    .subtract(viirs202405.select('SurfReflect_I1'))
    .divide(
        viirs202405.select('SurfReflect_I2').add(
            viirs202405.select('SurfReflect_I1')
        )
    )
)

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

ตัวอย่างต่อไปนี้ของการลบภาพหลายย่านความถี่แสดงให้เห็นวิธีจับคู่ย่านความถี่โดยอัตโนมัติ ซึ่งจะทำให้เกิด "เวกเตอร์การเปลี่ยนแปลง" สําหรับแต่ละพิกเซลของย่านความถี่ที่ปรากฏร่วมกันแต่ละย่าน

เครื่องมือแก้ไขโค้ด (JavaScript)

// Load a VIIRS 8-day surface reflectance composite for September 2024.
var viirs202409 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-09-01', '2024-09-16')).first();

// Compute multi-band difference between the September composite and the
// previously loaded May composite.
var diff = viirs202409.subtract(ndvi202405);
Map.addLayer(diff, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: -1,
  max: 1
}, 'difference');

// Compute the squared difference in each band.
var squaredDifference = diff.pow(2);
Map.addLayer(squaredDifference, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: 0,
  max: 0.7
}, 'squared diff.');

การตั้งค่า Python

ดูข้อมูลเกี่ยวกับ Python API และการใช้ geemap สําหรับการพัฒนาแบบอินเทอร์แอกทีฟได้ที่หน้า สภาพแวดล้อม Python

import ee
import geemap.core as geemap

Colab (Python)

# Load a VIIRS 8-day surface reflectance composite for September 2024.
viirs202409 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-09-01', '2024-09-16'))
    .first()
)

# Compute multi-band difference between the September composite and the
# previously loaded May composite.
diff = viirs202409.subtract(ndvi202405)

m = geemap.Map()
m.add_layer(
    diff,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': -1,
        'max': 1,
    },
    'difference',
)

# Compute the squared difference in each band.
squared_difference = diff.pow(2)

m.add_layer(
    squared_difference,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': 0,
        'max': 0.7,
    },
    'squared diff.',
)
display(m)

ในส่วนที่ 2 ของตัวอย่างนี้ ระบบจะคํานวณผลต่างของค่ายกกำลัง 2 โดยใช้ image.pow(2) ดูรายการโอเปอเรเตอร์ทางคณิตศาสตร์ทั้งหมดที่จัดการการดำเนินการทางคณิตศาสตร์พื้นฐาน ตรีโกณมิติ การยกกำลัง การปัดเศษ การแคสต์ การดำเนินการแบบบิต และอื่นๆ ได้ที่เอกสารประกอบ API

นิพจน์

หากต้องการใช้นิพจน์ทางคณิตศาสตร์ที่ซับซ้อนมากขึ้น ให้ลองใช้ image.expression() ซึ่งจะแยกวิเคราะห์การนําเสนอข้อความของการดำเนินการทางคณิตศาสตร์ ตัวอย่างต่อไปนี้ใช้ expression() เพื่อคํานวณดัชนีความอุดมสมบูรณ์ของพืช (Enhanced Vegetation Index หรือ EVI)

เครื่องมือแก้ไขโค้ด (JavaScript)

// Load a Landsat 8 image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');

// Compute the EVI using an expression.
var evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {
      'NIR': image.select('B5'),
      'RED': image.select('B4'),
      'BLUE': image.select('B2')
});

Map.centerObject(image, 9);
Map.addLayer(evi, {min: -1, max: 1, palette: ['a6611a', 'f5f5f5', '4dac26']});

การตั้งค่า Python

ดูข้อมูลเกี่ยวกับ Python API และการใช้ geemap สําหรับการพัฒนาแบบอินเทอร์แอกทีฟได้ที่หน้า สภาพแวดล้อม Python

import ee
import geemap.core as geemap

Colab (Python)

# Load a Landsat 8 image.
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')

# Compute the EVI using an expression.
evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))',
    {
        'NIR': image.select('B5'),
        'RED': image.select('B4'),
        'BLUE': image.select('B2'),
    },
)

# Define a map centered on San Francisco Bay.
map_evi = geemap.Map(center=[37.4675, -122.1363], zoom=9)

# Add the image layer to the map and display it.
map_evi.add_layer(
    evi, {'min': -1, 'max': 1, 'palette': ['a6611a', 'f5f5f5', '4dac26']}, 'evi'
)
display(map_evi)

โปรดทราบว่าอาร์กิวเมนต์แรกสำหรับ expression() คือการแสดงผลแบบข้อความของการดำเนินการทางคณิตศาสตร์ ส่วนอาร์กิวเมนต์ที่ 2 คือพจนานุกรมที่มีคีย์เป็นชื่อตัวแปรที่ใช้ในนิพจน์ และค่าคือแถบรูปภาพที่ควรจับคู่กับตัวแปร แถบในรูปภาพอาจเรียกว่า b("band name") หรือ b(index) เช่น b(0) แทนที่จะระบุพจนานุกรม คุณกำหนดแถบจากรูปภาพอื่นที่ไม่ใช่อินพุตได้เมื่อใช้พจนานุกรมการแมปแถบ โปรดทราบว่า expression() ใช้ "การหารแบบปัดเศษลง" ซึ่งจะทิ้งเศษและแสดงผลจำนวนเต็มเมื่อมีการหารจำนวนเต็ม 2 จำนวน เช่น 10 / 20 = 0 หากต้องการเปลี่ยนลักษณะการทำงานนี้ ให้คูณหนึ่งในออบเจ็กต์โดย 1.0: 10 * 1.0 / 20 = 0.5 ระบบจะพิจารณาเฉพาะจุดตัดของพิกเซลที่ไม่มีการมาสก์และแสดงผลแบบไม่มาสก์เมื่อประเมินแถบจากรูปภาพต้นทางมากกว่า 1 รูป โอเปอเรเตอร์นิพจน์ที่รองรับแสดงอยู่ในตารางต่อไปนี้

โอเปอเรเตอร์สําหรับ expression()
ประเภท สัญลักษณ์ ชื่อ
การดำเนินการทางคณิตศาสตร์ + - * / % ** บวก ลบ คูณ หาร มอดุลัส เลขยกกำลัง
เชิงสัมพันธ์ == != < > <= >= เท่ากับ ไม่เท่ากับ น้อยกว่า มากกว่า ฯลฯ
ตรรกะ && || ! ^ And, Or, Not, Xor
Ternary ? : เงื่อนไข if then else