Tổng quan
Cấu trúc điện toán của Earth Engine được tối ưu hoá để tính toán hình ảnh (dựa trên pixel) nhanh chóng và có thể mở rộng. BigQuery cũng được tối ưu hoá để xử lý dữ liệu dạng bảng (vectơ) theo quy mô và có nhiều tính năng giúp bổ sung hiệu quả cho Earth Engine.
Sau đây là một số ví dụ về quy trình công việc:
- Thực hiện các phép nối BigQuery lớn trên dữ liệu được tạo trong Earth Engine
- Chú thích dữ liệu vectơ bằng số liệu thống kê bắt nguồn từ hình ảnh để xử lý thêm trong BigQuery
- Xuất dữ liệu định kỳ từ Earth Engine vào một bảng BigQuery có thể nối
Nếu bạn có các trường hợp sử dụng tuyệt vời khác, chúng tôi rất mong được nghe bạn chia sẻ!
Kiến thức cơ bản về BigQuery
Earth Engine ghi vào các bảng BigQuery và tất cả các bảng đều nằm trong bộ dữ liệu. Các tác vụ xuất sẽ không thành công nếu tập dữ liệu được chỉ định không có trong BigQuery. Tìm hiểu thêm trong phần Giới thiệu về tập dữ liệu BigQuery.
Tạo tập dữ liệu
Tập dữ liệu có một số tuỳ chọn tại thời điểm tạo, bao gồm tên, khu vực lưu trữ và hành vi hết hạn (cùng với một số tuỳ chọn khác, nâng cao hơn).
Có nhiều cơ chế để tạo tập dữ liệu, nhưng cách đơn giản nhất để bắt đầu là thông qua Cloud Console:
- Chuyển đến trang BigQuery trong Cloud Console.
- Nhấp vào "Bật" để bật API (nếu được nhắc).
- Trong thẻ "SQL Workspace" (Không gian làm việc SQL), hãy nhấp vào trình đơn ba dấu chấm ( ) bên cạnh dự án.
- Chọn tuỳ chọn "Tạo tập dữ liệu".
- Làm theo hướng dẫn cấu hình.
Để biết tất cả các tuỳ chọn tạo và định cấu hình tập dữ liệu, hãy xem tài liệu về BigQuery.
Quyền
Ngoài các vai trò và quyền tiêu chuẩn cần thiết để sử dụng Earth Engine, phương thức gọi cũng cần có quyền BigQuery chính xác trên dự án hoặc tập dữ liệu trên đám mây.
bigquery.tables.get
bigquery.tables.create
bigquery.tables.updateData
bigquery.tables.delete
bigquery.jobs.create
Bất kỳ tổ hợp nào sau đây của các vai trò Quản lý danh tính và quyền truy cập (IAM) được xác định trước đều có các quyền cần thiết:
bigquery.dataEditor
vàbigquery.jobUser
bigquery.dataOwner
vàbigquery.jobUser
bigquery.user
bigquery.admin
Giá
BigQuery là một dịch vụ có tính phí của Google Cloud, vì vậy, bạn sẽ phải trả phí khi sử dụng BigQuery, bao gồm cả việc lưu trữ và phân tích mọi dữ liệu Earth Engine mà bạn xuất sang BigQuery.
Để biết thông tin chi tiết về giá của tính năng xuất sang BigQuery của Earth Engine, hãy xem phần giá bên dưới.
Xuất cấu hình
Cú pháp
Trình soạn thảo mã (JavaScript)
Export.table.toBigQuery({
'collection': myFeatureCollection,
'table': 'myproject.mydataset.mytable',
'description': 'put_my_data_in_bigquery',
'append': true,
'overwrite': false
});
Python
task = ee.batch.Export.table.toBigQuery(
collection=myFeatureCollection,
table='myproject.mydataset.mytable',
description='put_my_data_in_bigquery',
append=True,
overwrite=False)
task.start()
Thông số kỹ thuật của giản đồ tự động hoặc thủ công
Nếu không có bảng nào trong BigQuery, Earth Engine sẽ cố gắng xác định giản đồ bằng cách sử dụng các thuộc tính của ee.Feature
đầu tiên trong tập hợp. Đây là dự đoán tốt nhất và bạn có thể tạo một bộ sưu tập trong đó giản đồ của tính năng đầu tiên khác với giản đồ của các tính năng khác.
Nếu bạn cần một giản đồ cụ thể trên bảng BigQuery, hãy định cấu hình giản đồ đó bằng cách tạo một bảng trống có giản đồ mục tiêu.
Tên thuộc tính
Các thuộc tính trên các tính năng của Earth Engine tương ứng với các cột trong BigQuery. Earth Engine sử dụng tên "geo" để ghi hình học ee.Feature
(bộ chọn ".geo") vào BigQuery.
Để tránh việc đổi tên, hãy đảm bảo rằng các đối tượng ee.Feature
của bạn có các thuộc tính là tên cột hợp lệ và không có thuộc tính nào có tên là "geo" (vì tên này được dùng cho hình học của đối tượng không có tên trong Earth Engine).
Các ký tự không hợp lệ trong tên tài sản khiến quá trình xuất không thành công do các quy định hạn chế về tên cột BigQuery.
Chuyển đổi kiểu
Dữ liệu Earth Engine (giá trị của các thuộc tính ee.Feature
) được chuyển đổi thành một loại BigQuery tương đương khi có thể. Xin lưu ý rằng tính chất rỗng được kiểm soát bởi giản đồ bảng, chứ không phải loại.
Loại Earth Engine | Loại BigQuery | Lưu ý |
---|---|---|
ee.String |
STRING |
|
ee.Number
|
FLOAT hoặc INTEGER
|
|
ee.Geometry |
GEOGRAPHY |
|
ee.Date |
TIMESTAMP |
|
ee.ByteString |
BYTES |
|
ee.Array
|
STRUCT<ARRAY<INT64>,
ARRAY<INT64|FLOAT64>> |
Xem phần về mảng |
Các loại ee.* khác
|
không được hỗ trợ | Xem phần về giá trị JSON |
Mảng
Earth Engine xuất mọi ee.Array
nhiều chiều sang STRUCT<ARRAY<INT64> dimensions, ARRAY<INT64|FLOAT64> values>
, tương tự như định dạng mà hàm ML.DECODE_IMAGE của BigQuery sử dụng.
Mảng đầu tiên trong cấu trúc, dimensions
, chứa các phương diện của mảng Earth Engine, $d_1$ đến $d_n$.
Mảng thứ hai trong cấu trúc, values
, chứa tất cả các giá trị trong mảng nhiều chiều, được làm phẳng thành một mảng BigQuery duy nhất.
Tổng số giá trị trong mảng đã làm phẳng là $\sum_{i=1}^n d_i$ và giá trị tại chỉ mục $(i_i, \ldots, i_n)$ trong mảng Earth Engine ban đầu tương ứng với giá trị tại chỉ mục sau trong mảng đã làm phẳng:
\[ \sum_{j=1}^n \left( i_j \cdot \prod_{k=j+1}^n d_k \right) \]
Đối với các trường hợp phổ biến, biểu thức lập chỉ mục cho mảng values
như sau:
Kích thước mảng | Phương diện | Biểu thức lập chỉ mục |
---|---|---|
1 chiều | d1 |
[i1] |
2 chiều | d1, d2 |
[(i1 * d2) + i2] |
3 chiều | d1, d2, d3 |
[(i1 * d2 * d3) + (i2 * d3) + i3] |
Ví dụ: hãy xem xét một mảng Earth Engine 2x3x4
:
ee.Array([
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
],
[
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]
]
]);
Mảng này dịch sang STRUCT
BigQuery, trong đó phần tử dimensions
là mảng [2, 3, 4]
và phần tử values
là mảng [1, 2, 3, 4, 5, 6, 7, 8, ..., 21, 22, 23, 24]
được làm phẳng.
Bạn có thể tính toán các chỉ mục trong mảng được làm phẳng là [(i1 * 12) + (i2 * 4) + i3]
.
Giá trị JSON
Để hỗ trợ dữ liệu có cấu trúc phong phú hơn trong một ô, bạn có thể mã hoá các giá trị Earth Engine dưới dạng đối tượng JSON. BigQuery hỗ trợ các thao tác SQL trên dữ liệu được mã hoá JSON, cho phép các truy vấn "xem bên trong" các giá trị JSON đã mã hoá mà bạn tạo trong Earth Engine.
Trình soạn thảo mã (JavaScript)
var states = ee.FeatureCollection('TIGER/2018/States'); var mod11a1 = ee.ImageCollection('MODIS/061/MOD11A1'); // Find the max day and night temperatures per pixel for a given time. var maxTemp = mod11a1 .select(['LST_Day_1km', 'LST_Night_1km']) .filterDate('2023-05-15', '2023-05-25') .max(); // Annotate each state with its max day/night temperatures. var annotatedStates = states.map(function (e) { var dict = maxTemp.reduceRegion({ reducer: ee.Reducer.max(), geometry: e.geometry(), scale: 10 * 1000, // 10 km }); // Convert the dictionary to JSON and add it as a property. return e.set('maxTemp', ee.String.encodeJSON(dict)); }); Export.table.toBigQuery(annotatedStates);
import ee import geemap.core as geemap
Colab (Python)
states = ee.FeatureCollection('TIGER/2018/States') mod11a1 = ee.ImageCollection('MODIS/061/MOD11A1') # Find the max day and night temperatures per pixel for a given time. max_temp = ( mod11a1.select(['LST_Day_1km', 'LST_Night_1km']) .filterDate('2023-05-15', '2023-05-25') .max() ) def get_max_temp_for_state(e): max_temp_dict = max_temp.reduceRegion( reducer=ee.Reducer.max(), geometry=e.geometry(), scale=10 * 1000, # 10 km ) # Convert the dictionary to JSON and add it as a property. return e.set('maxTemp', ee.String.encodeJSON(max_temp_dict)) # Annotate each state with its max day/night temperatures. annotated_states = states.map(get_max_temp_for_state) task = ee.batch.Export.table.toBigQuery( collection=annotated_states, table='myproject.mydataset.mytable' ) task.start()
Chuyển đổi hình học
BigQuery hỗ trợ hạn chế cho nhiều phép chiếu, vì vậy, tất cả hình học Earth Engine đều được chuyển đổi thành EPSG:4326
geodesic bằng cách sử dụng biên độ sai số là 1 mét.
Để kiểm soát chặt chẽ hơn quá trình biến đổi này, bạn có thể ánh xạ các đặc điểm và biến đổi hình học của các đặc điểm đó theo cách thủ công, ví dụ:
Trình soạn thảo mã (JavaScript)
var transformedCollection = originalCollection.map(function transformGeo(e) { var myErrorMargin = 10 * 1000; // meters return e.setGeometry(e.geometry(myErrorMargin, 'EPSG:4326', true)); });
import ee import geemap.core as geemap
Colab (Python)
def transform_geo(e): my_error_margin = 10 * 1000 # meters return e.setGeometry(e.geometry(my_error_margin, 'EPSG:4326', True)) transformed_collection = original_collection.map(transform_geo)
Hiệu suất
Hiệu suất của Earth Engine
Tính toán Earth Engine thường là nút thắt cổ chai cho các hoạt động Export
. Để đạt được mục tiêu này, điều quan trọng là bạn phải sắp xếp quy trình xử lý để đạt được mức độ song song tối đa.
Bất kỳ phép tính nào được tạo trong quá trình xử lý tuần tự (ví dụ: ee.FeatureCollection.iterate()
) đều có thể khiến quá trình xuất của bạn chạy chậm hoặc không thành công.
Hiệu suất trong BigQuery
Việc sắp xếp cấu trúc và nhóm dữ liệu một cách chính xác là cách tốt nhất để đảm bảo rằng các truy vấn có thể được thực hiện hiệu quả trong BigQuery. Nếu không có bảng nào hiện diện trong BigQuery, thì các bảng được xuất từ Earth Engine sẽ được nhóm lại dựa trên hình học của các đối tượng (nếu có). Việc phân cụm theo trường địa lý rất phổ biến đối với dữ liệu không gian địa lý. Tính năng này giúp cải thiện hiệu suất và giảm chi phí cho các truy vấn sử dụng bộ lọc không gian, thường là cho các thao tác BigQuery như:
WHERE ST_DWithin(<table_column>, <constant_geography>, <distance>)
WHERE ST_Intersects(<table_column>, <constant_geography>)
Việc thêm tính năng phân cụm vào một bảng không phân cụm cũng thường không gây hại gì, mặc dù có thể làm tăng một chút thời gian tải dữ liệu vào bảng. Để biết thêm thông tin về việc tối ưu hoá truy vấn, hãy xem tài liệu về BigQuery.
Xin lưu ý rằng chế độ cài đặt cụm chỉ ảnh hưởng đến dữ liệu mới được ghi vào bảng.
Bản minh hoạ: sử dụng reduceRegions
Trong một số trường hợp, bạn có thể sử dụng reduceRegions
để có được nhiều tính năng song song nhất có thể từ cơ sở hạ tầng xử lý Earth Engine. Ví dụ này minh hoạ cách sử dụng số lượng lệnh gọi reduceRegions
ít hơn (vài trăm) thay vì hàng chục nghìn lệnh gọi reduceRegion
(phương pháp thông thường để ánh xạ một hàm trên một tập hợp).
Trình soạn thảo mã (JavaScript)
var lucas = ee.FeatureCollection('JRC/LUCAS_HARMO/COPERNICUS_POLYGONS/V1/2018'); var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED'); // Fetch the unique date values from the dataset. var dates = lucas.aggregate_array('survey_date') .distinct() .map(function (date) { return ee.Date.parse('dd/MM/yy', date); }); // For each date, annotate the LUCAS samples with the Sentinel-2 band values for // a two-week window. function getLucasSamplesForDate(date) { date = ee.Date(date); var imageForDate = s2 .filterDate( date.advance(-1, 'week'), date.advance(1, 'week')) .select('B.*'); var median = imageForDate.median(); var lucasForDate = lucas.filter( ee.Filter.equals('survey_date', date.format('dd/MM/yy'))); var sample = median.reduceRegions({ collection: lucasForDate, reducer: ee.Reducer.mean(), scale: 10, tileScale: 8, }); return sample; } // Flatten the collection. var withSamples = ee.FeatureCollection(dates.map(getLucasSamplesForDate)) .flatten(); Export.table.toBigQuery({ collection: withSamples, description: 'lucas_s2_annotated' });
import ee import geemap.core as geemap
Colab (Python)
lucas = ee.FeatureCollection('JRC/LUCAS_HARMO/COPERNICUS_POLYGONS/V1/2018') s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') # Fetch the unique date values from the dataset. dates = ( lucas.aggregate_array('survey_date') .distinct() .map(lambda date: ee.Date.parse('dd/MM/yy', date)) ) # For each date, annotate the LUCAS samples with the Sentinel-2 band values for # a two-week window. def get_lucas_samples_for_date(date): date = ee.Date(date) image_for_date = s2.filterDate( date.advance(-1, 'week'), date.advance(1, 'week') ).select('B.*') median = image_for_date.median() lucas_for_date = lucas.filter( ee.Filter.equals('survey_date', date.format('dd/MM/yy')) ) sample = median.reduceRegions( collection=lucas_for_date, reducer=ee.Reducer.mean(), scale=10, tileScale=8, ) return sample # Flatten the collection. with_samples = ee.FeatureCollection( dates.map(get_lucas_samples_for_date) ).flatten() task = ee.batch.Export.table.toBigQuery( collection=with_samples, table='myproject.mydataset.mytable', description='lucas_s2_annotated', ) task.start()
Song song tác vụ
Với tuỳ chọn {append: true}
, nhiều tác vụ có thể ghi dữ liệu vào một bảng BigQuery đồng thời. Đây là cơ chế ghi dữ liệu với thông lượng cao hơn, nhưng phải trả giá bằng độ phức tạp gia tăng (quản lý hàng đợi tác vụ, thử lại, v.v.).
Sự khác biệt về hiệu suất giữa các tham số append
và overwrite
Xin lưu ý rằng việc ghi đè sẽ chậm hơn so với việc nối vì BigQuery phải xử lý dữ liệu mới trước khi ghi đè dữ liệu cũ. Việc đặt tham số {overwrite: true} khi xuất sang bảng BigQuery hiện có sẽ kích hoạt quy trình ghi đè an toàn:
- Bảng tạm thời: dữ liệu được xuất sang một bảng tạm thời, mới trong tập dữ liệu đích.
- Ghi đè nguyên tử: nội dung của bảng tạm thời được sao chép vào bảng đích cuối cùng, thay thế dữ liệu hiện có trong một giao dịch nguyên tử duy nhất.
- Dọn dẹp: bảng tạm thời sẽ bị xoá.
Việc này giúp đảm bảo rằng các lỗi trong quá trình xuất sẽ không làm hỏng dữ liệu hiện có của bạn. Đối với các bảng nhỏ, độ trễ thường là vài phút.
Các giải pháp thay thế hiệu suất cao
Đối với các quy trình làm việc yêu cầu băng thông rất cao, hãy cân nhắc sử dụng GeoBeam để chuyển dữ liệu từ Earth Engine sang BigQuery. Việc này đòi hỏi nhiều cấu hình và cơ sở hạ tầng hơn, vì vậy, bạn nên bắt đầu bằng chức năng Earth Engine tích hợp.
Giá
Xuất sang BigQuery là một quy trình hàng loạt, tiêu tốn thời gian EECU hàng loạt. Nếu bạn sử dụng Earth Engine cho mục đích thương mại hoặc hoạt động, thì việc xuất dữ liệu sang BigQuery sẽ tính phí bạn theo thời gian EECU mà các tác vụ sử dụng. Bạn có thể theo dõi tất cả mức sử dụng bằng chính các công cụ giám sát hoạt động cho phần còn lại của Earth Engine.
Tài khoản thanh toán trên Cloud
Để ghi dữ liệu vào BigQuery, dự án trên Google Cloud được liên kết cần bật tài khoản thanh toán. Để tìm hiểu thêm về cách định cấu hình tài khoản thanh toán, hãy xem tài liệu về tài khoản thanh toán trên đám mây.
Lưu lượng ra
Tất cả chi phí truy cập và thoát đều được tính là lưu lượng truy cập mạng tiêu chuẩn.
Earth Engine chỉ được lưu trữ ở Hoa Kỳ, nhưng các tập dữ liệu BigQuery có thể được lưu trữ ở một số khu vực khác. Tuỳ thuộc vào khu vực và dung lượng dữ liệu liên quan, việc ghi dữ liệu từ Earth Engine vào BigQuery có thể tạo ra lưu lượng truy cập mạng đáng kể.
Vấn đề đã biết
Hướng cho đa giác lớn
Hàm xuất BigQuery đảo ngược các đa giác lớn hơn một bán cầu bằng cách đảo ngược hướng của các đa giác đó (thay đổi đa giác thành phần bổ sung hình học). Trong một số ít trường hợp, các đa giác lớn hơn một bán cầu có thể không tải được.
Nếu cần, bạn có thể sửa các đa giác đã đảo ngược trong BigQuery bằng cách đảo ngược lại các đa giác đó bằng biểu thức BigQuery ST_Difference(ST_GeogFromText('fullglobe'), geo)
.
Để biết thêm thông tin, hãy xem tại đây.