การติดตั้ง Python

การรองรับ Python

ไลบรารีของไคลเอ็นต์ Python ของ Earth Engine เข้ากันได้กับเวอร์ชัน Python ที่ Google Cloud รองรับ การสนับสนุนจะอัปเดตทุกปีตามกำหนดการเผยแพร่ของ Python (PEP 602;สถานะของเวอร์ชัน Python) การใช้ Python เวอร์ชันที่ไม่รองรับอาจทําให้การตรวจสอบสิทธิ์ไม่สําเร็จ ลักษณะการทํางานที่ไม่คาดคิด หรือการดําเนินการบางอย่างไม่สําเร็จ

ตัวเลือกการติดตั้ง

หากคุณใช้ Google Colab ระบบจะติดตั้งไลบรารีไคลเอ็นต์ Python ของ Earth Engine เวอร์ชันล่าสุดไว้ให้แล้ว (ผ่าน pip) ลองใช้โน้ตบุ๊กต่อไปนี้เพื่อเริ่มต้นใช้งาน Earth Engine และ Colab

หากคุณไม่ได้ใช้ Colab คุณสามารถติดตั้งและอัปเดตไลบรารีไคลเอ็นต์ Earth Engine ในระบบด้วยตนเองได้โดยใช้ conda (แนะนำ) หรือ pip โดยทำดังนี้


ติดตั้ง API ลงในสภาพแวดล้อม Python ใดก็ได้โดยใช้ pip จากเทอร์มินัลหรือคอมมานด์พรอมต์ ให้ทำดังนี้

pip install earthengine-api

เมื่อติดตั้งแล้ว คุณจะนําเข้า ตรวจสอบสิทธิ์ และเริ่มต้นใช้งาน Earth Engine API ตามที่อธิบายไว้ที่นี่

อัปเดต API

pip install earthengine-api --upgrade

การนําเข้าแพ็กเกจ

แพ็กเกจ Python API มีชื่อว่า ee คุณต้องนําเข้าและเริ่มต้นเซสชันสคริปต์ Python ใหม่แต่ละรายการดังนี้

import ee

การตรวจสอบสิทธิ์และการจัดเตรียม

คุณต้องตรวจสอบสิทธิ์และใช้ข้อมูลเข้าสู่ระบบที่ได้เพื่อเริ่มต้นใช้งานไคลเอ็นต์ Python ก่อนจึงจะใช้ไลบรารีไคลเอ็นต์ Python ของ Earth Engine ได้ เรียกใช้

ee.Authenticate()

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

ee.Initialize(project='my-project')

ดูคู่มือการตรวจสอบสิทธิ์เพื่อแก้ปัญหาและดูข้อมูลเพิ่มเติมเกี่ยวกับโหมดการตรวจสอบสิทธิ์และโปรเจ็กต์ที่อยู่ในระบบคลาวด์

สวัสดีทุกท่าน!

สคริปต์สั้นๆ ต่อไปนี้จะช่วยทดสอบว่าคุณพร้อมใช้งาน Earth Engine แล้ว

import ee
ee.Authenticate()
ee.Initialize(project='my-project')
print(ee.String('Hello from the Earth Engine servers!').getInfo())

ไวยากรณ์

ทั้ง Python และ JavaScript API จะเข้าถึงฟังก์ชันฝั่งเซิร์ฟเวอร์เดียวกัน แต่นิพจน์ฝั่งไคลเอ็นต์ (ดูข้อมูลเพิ่มเติมเกี่ยวกับไคลเอ็นต์กับเซิร์ฟเวอร์) อาจแตกต่างกันเนื่องจากไวยากรณ์ของภาษาไม่เหมือนกัน ตารางต่อไปนี้แสดงรายการความแตกต่างของไวยากรณ์ที่พบบ่อยซึ่งคุณจะพบเมื่อใช้ Python API เทียบกับ JavaScript API

ความแตกต่างที่พบบ่อยของไวยากรณ์ระหว่าง JavaScript กับ Python
พร็อพเพอร์ตี้ JavaScript Python
คําจํากัดความของฟังก์ชัน
function myFun(arg) {
  return arg;
}

var myFun = function(arg) {
  return arg;
};
def my_fun(arg):
  return arg
การแมปฟังก์ชันที่ไม่ระบุชื่อ
var foo = col.map(function(arg) {
  return arg;
});
foo = col.map(lambda arg: arg)
คําจํากัดความตัวแปร
var myVar = 'var';
my_var = 'var'
โอเปอเรเตอร์ตรรกะ
var match = such.and(that);
var match = such.or(that);
var match = such.not(that);
match = such.And(that)
match = such.Or(that)
match = such.Not(that)
เชนเมธอดหลายบรรทัด
var foo = my.really()
              .reallyLong()
              .methodChain();
foo = (my.really()
       .reallyLong()
       .methodChain())
คีย์พจนานุกรม
var dic = {'key': value};
var dic = {key: value};
dic = {'key': value}
การเข้าถึงออบเจ็กต์พจนานุกรม
var value = dic.key;
var value = dic['key'];
value = dic['key']
คําจํากัดความอาร์กิวเมนต์ของฟังก์ชัน
// Positional arguments.
var foo = fun(argX, argY, argZ);
// Keyword arguments object.
var foo = fun({y: argY});
# Positional arguments.
foo = fun(arg_x, arg_y, arg_z)
# Keyword arguments dictionary.
foo = fun(**{'y': arg_y})
# Keyword arguments.
foo = fun(x=arg_x, z=arg_z)
บูลีน
var t = true;
var f = false;
t = True
f = False
ค่า Null
var na = null;
na = None
ความคิดเห็น
//
#

ออบเจ็กต์วันที่

กําหนดค่าและจัดการออบเจ็กต์วันที่ฝั่งไคลเอ็นต์ด้วยข้อบังคับ datetime ใส่โมดูลในสคริปต์

import datetime

แปลง ee.Date เป็นวันที่ฝั่งไคลเอ็นต์

ee_date = ee.Date('2020-01-01')
py_date = datetime.datetime.utcfromtimestamp(ee_date.getInfo()['value']/1000.0)

แปลงวันที่ฝั่งไคลเอ็นต์เป็น ee.Date:

py_date = datetime.datetime.utcnow()
ee_date = ee.Date(py_date)

การส่งออกข้อมูล

การส่งออกข้อมูลด้วย Python API ต้องใช้โมดูล ee.batch ซึ่งให้อินเทอร์เฟซกับฟังก์ชัน Export ส่งอาร์กิวเมนต์พารามิเตอร์เช่นเดียวกับที่ใช้กับ JavaScript API โดยคํานึงถึงความแตกต่างที่ระบุไว้ในตารางไวยากรณ์ด้านบน คุณต้องเริ่มการส่งออกงานด้วยการเรียกใช้เมธอด start() ในงานที่กําหนด ค้นหาสถานะของงานโดยเรียกใช้เมธอด status() ตัวอย่างต่อไปนี้แสดงการส่งออกออบเจ็กต์ ee.Image

สร้างงานการส่งออก

task = ee.batch.Export.image.toDrive(image=my_image,  # an ee.Image object.
                                     region=my_geometry,  # an ee.Geometry object.
                                     description='mock_export',
                                     folder='gdrive_folder',
                                     fileNamePrefix='mock_export',
                                     scale=1000,
                                     crs='EPSG:4326')

วิธีเริ่มงานการส่งออก

task.start()

ตรวจสอบสถานะงานการส่งออก

task.status()

ผลลัพธ์ของ task.status() คือพจนานุกรมที่มีข้อมูล เช่น สถานะของงานและรหัสงาน

{
  'state': 'READY',
  'description': 'my_export_task',
  'creation_timestamp_ms': 1647567508236,
  'update_timestamp_ms': 1647567508236,
  'start_timestamp_ms': 0,
  'task_type': 'EXPORT_IMAGE',
  'id': '56TVJIZABUMTD5CJ5YHTMYK4',
  'name': 'projects/earthengine-legacy/operations/56TVJIZABUMTX5CJ5HHTMYK4'
}

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

วัตถุการพิมพ์

การพิมพ์ออบเจ็กต์ Earth Engine ใน Python จะพิมพ์คำขอที่แปลงเป็นอนุกรมสำหรับออบเจ็กต์ ไม่ใช่ออบเจ็กต์นั้นๆ โปรดดูสาเหตุที่หน้าไคลเอ็นต์กับเซิร์ฟเวอร์

เรียก getInfo() บนออบเจ็กต์ Earth Engine เพื่อรับออบเจ็กต์ที่ต้องการจากเซิร์ฟเวอร์ไปยังไคลเอ็นต์

# Load a Landsat image.
img = ee.Image('LANDSAT/LT05/C02/T1_L2/LT05_034033_20000913')

# Print image object WITHOUT call to getInfo(); prints serialized request instructions.
print(img)

# Print image object WITH call to getInfo(); prints image metadata.
print(img.getInfo())
โปรดทราบว่า getInfo() เป็นการดำเนินการแบบซิงค์ ซึ่งหมายความว่าการเรียกใช้นิพจน์ตามการเรียก getInfo() จะถูกบล็อกจนกว่าระบบจะแสดงผลลัพธ์ไปยังไคลเอ็นต์ นอกจากนี้ คำขอข้อมูลจำนวนมากหรือการคํานวณที่ใช้เวลานานอาจแสดงข้อผิดพลาดและ/หรือค้าง โดยทั่วไป แนวทางปฏิบัติแนะนำคือส่งออกผลลัพธ์ และเมื่อเสร็จแล้ว ให้นําเข้าไปยังสคริปต์ใหม่เพื่อการวิเคราะห์เพิ่มเติม

ออบเจ็กต์ UI

ui โมดูล Earth Engine มีให้บริการผ่านเครื่องมือแก้ไขโค้ด JavaScript API เท่านั้น ใช้ไลบรารีของบุคคลที่สามสำหรับองค์ประกอบ UI ใน Python ไลบรารีต่างๆ เช่น geemap, Folium และ ipyleaflet แสดงแผนที่แบบอินเทอร์แอกทีฟ ส่วนการสร้างแผนภูมิทำได้ด้วย Matplotlib, Altair หรือ seaborn เป็นต้น ดูตัวอย่างการใช้ geemap และ Matplotlib ในสมุดบันทึกการตั้งค่า Earth Engine ใน Colab

Python ในคู่มือนักพัฒนาซอฟต์แวร์

โค้ด Python จะรวมอยู่ในคู่มือนักพัฒนาซอฟต์แวร์ Earth Engine คุณดูตัวอย่างโค้ดได้ (หากมี) โดยคลิกแท็บ "Colab (Python)" ที่ด้านบนของบล็อกโค้ด หน้าคำแนะนำอาจมีปุ่มที่ด้านบนสำหรับเรียกใช้หน้าเว็บเป็นสมุดบันทึก Colab หรือดูใน GitHub ด้วย ตัวอย่างโค้ด Python มีไว้เพื่อเรียกใช้โดยใช้ Google Colab การสํารวจแผนที่และวัตถุแบบอินเทอร์แอกทีฟจะจัดการโดยไลบรารี geemap ทั้งไลบรารีของไคลเอ็นต์ Python ของ Earth Engine และ geemap ได้รับการติดตั้งไว้ล่วงหน้าใน Colab

การตั้งค่า Earth Engine

ในการเรียกใช้โค้ด Python คุณต้องนำเข้าไลบรารี Earth Engine, ตรวจสอบสิทธิ์ และเริ่มต้น ตัวอย่างต่อไปนี้ใช้คําสั่งต่อไปนี้ (ดูทางเลือกอื่นๆ ในหน้าการตรวจสอบสิทธิ์และการจัดเตรียม)

import ee
ee.Authenticate()
ee.Initialize(project='my-project')

การสำรวจแบบอินเทอร์แอกทีฟด้วย geemap

ระบบจะใช้ไลบรารี geemap เพื่อแสดงไทล์แผนที่และพิมพ์การแสดงผลที่สมบูรณ์ของวัตถุ Earth Engine โดยไลบรารีจะขึ้นอยู่กับฟีเจอร์เหล่านี้ของ ipyleaflet และ eerepr ตามลำดับ ไลบรารี geemap และ Dependency ของไลบรารีนี้ติดตั้งไว้ล่วงหน้าใน Google Colab แล้ว ให้นําเข้าไปไว้ในเซสชันแต่ละเซสชัน

import geemap.core as geemap

คลาสข้อมูลทางภูมิศาสตร์ของ Earth Engine เช่น ee.Image และ ee.FeatureCollection จะดูได้โดยใช้ออบเจ็กต์ geemap.Map ก่อนอื่น ให้กําหนดออบเจ็กต์แผนที่ จากนั้นเพิ่มเลเยอร์หรือเปลี่ยนวิวพอร์ต

# Initialize a map object.
m = geemap.Map()

# Define an example image.
img = ee.Image.random()

# Add the image to the map.
m.add_layer(img, None, 'Random image')

# Display the map (you can call the object directly if it is the final line).
display(m)