MaxCompute mendukung secara native tipe data GEOGRAPHY, yang merepresentasikan objek geografis seperti titik, garis, dan poligon pada permukaan Bumi. Tipe data ini memungkinkan Anda menyimpan, membuat, dan melakukan operasi pada data geospasial secara efisien. Tipe data GEOGRAPHY di MaxCompute menggunakan pustaka S2 Geometry.
Jenis geometri yang didukung
MaxCompute mendukung jenis geometri berikut:
Geometry type | Description |
Point | Posisi pada permukaan Bumi yang didefinisikan oleh koordinat bujur dan lintang, dengan bujur ditentukan terlebih dahulu, diikuti oleh lintang. Contoh: |
LineString | Kurva satu dimensi yang terdiri dari serangkaian titik dan garis geodesik yang menghubungkannya. Contoh: |
Polygon | Permukaan dua dimensi yang dijelaskan oleh satu atau lebih loop tertutup. Loop pertama menentukan batas luar (shell), dan loop berikutnya (jika ada) menentukan lubang di dalam poligon tersebut. Lubang menunjukkan area yang dikecualikan dalam poligon. Contoh: |
MultiPoint | Kumpulan titik. |
MultiLineString | Kumpulan LineString. |
MultiPolygon | Kumpulan Polygon. |
GeometryCollection | Kumpulan objek dengan berbagai jenis geometri. |
Koordinat ditentukan sebagai (bujur, lintang) dalam satuan derajat, mengikuti sistem koordinat WGS84. Bujur harus berada dalam rentang [-180, 180], dan lintang harus berada dalam rentang [-90, 90].
Tipe data GEOGRAPHY MaxCompute menggunakan pustaka S2 Geometry. Berbeda dengan pustaka Geographic Information System (GIS) tradisional, S2 Geometry tidak menggunakan proyeksi peta planar seperti proyeksi Mercator. Sebaliknya, pustaka ini memperlakukan Bumi sebagai bola sempurna dan terlebih dahulu mengonversi koordinat lintang-bujur menjadi koordinat Kartesius tiga dimensi (x, y, z) pada bola tersebut. Pendekatan ini menghindari peningkatan kesalahan komputasi yang dapat disebabkan oleh proyeksi planar, terutama di dekat kutub.
Pustaka S2 Geometry menggunakan tipe DOUBLE untuk menggambarkan koordinat objek geografis. Saat mengonversi data masukan menjadi objek S2, mungkin terjadi kehilangan presisi yang sangat kecil, sehingga menghasilkan perbedaan yang sangat minim antara data masukan dan keluaran.
Batasan
Batasan versi klien: Untuk mengkueri data GEOGRAPHY, Anda harus menggunakan odpscmd versi 0.56.0 atau lebih baru. Pengaturan
use_instance_tunnel=truetidak didukung.Batasan tipe data: Tipe data GEOGRAPHY tidak didukung dalam sistem tipe data 1.0. Anda harus mengaktifkan sistem tipe data 2.0 di tingkat proyek atau sesi dengan mengatur
odps.sql.type.system.odps2=true;.Tipe data GEOGRAPHY tidak mendukung operasi perbandingan. Oleh karena itu, Anda tidak dapat menggunakannya dalam klausa SELECT DISTINCT, GROUP BY, atau ORDER BY, maupun sebagai kondisi equi-join dalam klausa JOIN.
Tipe data GEOGRAPHY tidak mendukung dimensi Z (elevasi) atau M (measure) untuk objek geografis.
Tipe data GEOGRAPHY tidak mendukung pembuatan objek geografis yang lebih besar dari satu belahan bumi. Misalnya, pernyataan SQL berikut mencoba membuat objek geografis yang mencakup hampir seluruh dunia, dari bujur 179°B hingga 179°T. Namun, hasil sebenarnya adalah objek yang lebih kecil dari satu belahan bumi dengan bujur yang membentang ke arah timur dari 179°T, melintasi meridian 180°, dan berakhir di 179°B.
SELECT ST_GEOGFROMTEXT( 'POLYGON ((-179 -89, 179 -89, 179 89, -179 89, -179 -89))' ); -- Result: +------+ | _c0 | +------+ | POLYGON ((-179 89, 179 89, 179 -89, -179 -89, -179 89)) | +------+
Membuat dan menggunakan data GEOGRAPHY
Anda dapat menggunakan tipe data GEOGRAPHY sebagai tipe bidang saat membuat tabel:
SET odps.sql.type.system.odps2=true;
CREATE TABLE spatial_points (
id BIGINT,
name STRING,
location GEOGRAPHY,
region GEOGRAPHY
);Anda dapat menggunakan fungsi bawaan, seperti ST_GEOGPOINT, ST_GEOGFROMTEXT, ST_GEOGFROMWKB, ST_MAKELINE, dan ST_MAKEPOLYGON, untuk membuat objek geografis. Untuk informasi lebih lanjut, lihat Geography function overview.
-- Masukkan data: Buat objek GEOGRAPHY menggunakan fungsi geografi.
INSERT INTO spatial_points VALUES
(1, 'Beijing Center', ST_GEOGPOINT(116.4074, 39.9042),
ST_GEOGFROMTEXT('POLYGON((116.3 39.8, 116.5 39.8, 116.5 40.0, 116.3 40.0, 116.3 39.8))')),
(2, 'The Bund', ST_GEOGPOINT(121.4894, 31.2403),
ST_MAKEPOLYGON(ST_MAKELINE(ARRAY(
ST_GEOGPOINT(121.4, 31.2),
ST_GEOGPOINT(121.5, 31.2),
ST_GEOGPOINT(121.5, 31.3),
ST_GEOGPOINT(121.4, 31.3),
ST_GEOGPOINT(121.4, 31.2)
))));
-- Kueri data yang telah dimasukkan.
SELECT * FROM spatial_points;
-- Result:
+------------+--------------+--------------------------+--------+
| id | name | location | region |
+------------+--------------+--------------------------+--------+
| 1 | Beijing Center | POINT (116.4074 39.9042) | POLYGON ((116.3 39.8, 116.5 39.8, 116.5 40, 116.3 40, 116.3 39.8)) |
| 2 | The Bund | POINT (121.4894 31.2403) | POLYGON ((121.4 31.2, 121.5 31.2, 121.5 31.3, 121.4 31.3, 121.4 31.2)) |
+------------+--------------+--------------------------+--------+Fungsi geografi
MaxCompute menyediakan serangkaian fungsi geografi dengan awalan ST_ untuk membuat, mengonversi, dan menganalisis data GEOGRAPHY. Anda dapat menggunakan fungsi-fungsi ini untuk membuat objek geografis seperti titik, garis, dan poligon dari koordinat bujur dan lintang atau dari teks WKT/WKB. Anda juga dapat mengekstrak properti seperti koordinat dan kotak pembatas, menentukan hubungan spasial seperti ketercakupan, irisan, dan cakupan, serta menghitung jarak antar objek geografis.
Untuk informasi lebih lanjut, lihat Geography function overview.
Fungsi geografi berikut didukung:
Category | Function | Description |
Construction and parsing | Membuat objek geografis titik dari bujur dan lintang yang ditentukan. | |
Membuat objek geografis garis dari titik ujung yang ditentukan. | ||
Membuat objek geografis poligon dari batas luar (shell) yang ditentukan dan nol atau lebih lubang. | ||
Mengonversi string dalam format WKT menjadi objek GEOGRAPHY. | ||
Mengonversi nilai BINARY dalam format WKB menjadi objek GEOGRAPHY. | ||
Formatting | Mengonversi nilai GEOGRAPHY menjadi nilai BINARY dalam format WKB. | |
Mengonversi nilai GEOGRAPHY menjadi nilai STRING dalam format WKT. | ||
Property access | Mengembalikan kotak pembatas dari nilai GEOGRAPHY. | |
Mengembalikan bujur dari objek geografis titik. | ||
Mengembalikan lintang dari objek geografis titik. | ||
Spatial operations | Memeriksa apakah objek geografis pertama mencakup objek kedua. | |
Memeriksa apakah objek geografis pertama menutupi objek kedua (semua titik objek kedua berada pada batas atau di dalam objek pertama). | ||
Memeriksa apakah dua objek geografis saling berpotongan (memiliki setidaknya satu titik yang sama). | ||
Memeriksa apakah objek geografis pertama berada di dalam objek kedua. | ||
Memeriksa apakah jarak terpendek antara dua objek geografis kurang dari atau sama dengan jarak yang ditentukan. | ||
Menghitung jarak terpendek antara dua objek geografis, dalam satuan meter. |
Spatial join
Spatial join adalah operasi join non-equi antara dua tabel yang berisi data GEOGRAPHY. Kondisi join menggunakan fungsi predikat spasial (seperti ST_CONTAINS atau ST_INTERSECTS) yang mengevaluasi hubungan spasial antara objek geografis.
Kasus penggunaan umum adalah menggunakan fungsi geografi sebagai kondisi JOIN untuk mengevaluasi hubungan spasial antara kolom GEOGRAPHY.
Kasus penggunaan khas termasuk menentukan apakah suatu point of interest (POI) berada dalam area tertentu atau menganalisis irisan lintasan dengan geofence.
MaxCompute mengimplementasikan spatial join berdasarkan tabel broadcast. Anda harus menggunakan MAPJOIN HINT untuk menentukan tabel mana yang akan dibroadcast.
Untuk informasi lebih lanjut, lihat Spatial JOIN.