Mengindeks data geospasial dengan Azure Cosmos DB
BERLAKU UNTUK:
SQL API
Kami merancang mesin database Azure Cosmos DB agar benar-benar agnostik skema dan memberikan dukungan kelas satu untuk JSON. Mesin database tulis yang dioptimalkan dari Azure Cosmos DB secara native memahami data spasial yang direpresentasikan dalam standar GeoJSON.
Singkatnya, geometri diproyeksikan dari koordinat geodetis ke bidang 2D kemudian dibagi secara progresif ke dalam sel, menggunakan quadtree. Sel-sel ini dipetakan ke 1D berdasarkan lokasi sel dalam kurva pengisian ruang Hilbert, yang mempertahankan lokalitas titik. Selain itu ketika data lokasi diindeks, data akan melalui proses yang dikenal sebagai tessellation, yaitu semua sel yang bersinggungan dengan lokasi diidentifikasi dan disimpan sebagai kunci dalam indeks Azure Cosmos DB. Pada waktu kueri, argumen seperti titik dan Poligon juga di-tessellate untuk mengekstrak rentang ID sel yang relevan, lalu digunakan untuk mengambil data dari indeks.
Jika Anda menentukan kebijakan pengindeksan yang menyertakan indeks spasial untuk /* (semua jalur), semua data yang ditemukan dalam kontainer diindeks untuk mendapatkan kueri spasial yang efisien.
Catatan
Azure Cosmos DB mendukung pengindeksan Point, LineString, Polygon, dan MultiPolygon. Jika Anda mengindeks salah satu dari jenis ini, kami akan secara otomatis mengindeks semua jenis lainnya. Dengan kata lain, jika Anda mengindeks Polygons, kami juga akan mengindeks Point, LineStrings, dan MultiPolygon. Mengindeks jenis spasial baru tidak memengaruhi biaya RU tulis atau ukuran indeks kecuali Anda memiliki data GeoJSON yang valid dari jenis tersebut.
Memodifikasi konfigurasi geospasial
Di kontainer Anda, Konfigurasi Geospasial menentukan bagaimana data spasial akan diindeks. Tentukan satu Konfigurasi Geospasial per kontainer: geografi atau geometri.
Anda dapat beralih antara jenis spasial geografi dan geometri di portal Microsoft Azure. Penting bagi Anda untuk membuat kebijakan pengindeksan geometri spasial yang valid dengan kotak batas sebelum beralih ke jenis spasial geometri.
Berikut cara mengatur Konfigurasi Geospasi di Azure Data Explorer dalam portal Microsoft Azure:
Anda juga dapat memodifikasi geospatialConfig di .NET SDK untuk menyesuaikan Konfigurasi Geospasial:
Jika tidak ditentukan, geospatialConfig akan menjadi default bagi tipe data geografi. Ketika Anda memodifikasi geospatialConfig, semua data geospasial yang ada dalam kontainer akan diindeks kembali.
Berikut adalah contoh untuk memodifikasi jenis data geospasial geometry dengan mengatur geospatialConfig properti dan menambahkan boundingBox:
//Retrieve the container's details
ContainerResponse containerResponse = await client.GetContainer("db", "spatial").ReadContainerAsync();
//Set GeospatialConfig to Geometry
GeospatialConfig geospatialConfig = new GeospatialConfig(GeospatialType.Geometry);
containerResponse.Resource.GeospatialConfig = geospatialConfig;
// Add a spatial index including the required boundingBox
SpatialPath spatialPath = new SpatialPath
{
Path = "/locations/*",
BoundingBox = new BoundingBoxProperties(){
Xmin = 0,
Ymin = 0,
Xmax = 10,
Ymax = 10
}
};
spatialPath.SpatialTypes.Add(SpatialType.Point);
spatialPath.SpatialTypes.Add(SpatialType.LineString);
spatialPath.SpatialTypes.Add(SpatialType.Polygon);
spatialPath.SpatialTypes.Add(SpatialType.MultiPolygon);
containerResponse.Resource.IndexingPolicy.SpatialIndexes.Add(spatialPath);
// Update container with changes
await client.GetContainer("db", "spatial").ReplaceContainerAsync(containerResponse.Resource);
Contoh pengindeksan data geografi
Cuplikan JSON berikut menunjukkan kebijakan pengindeksan dengan pengindeksan spasial yang diaktifkan untuk jenis data geografi. Ini berlaku untuk data spasial dengan jenis data geografi dan akan mengindeks GeoJSON Point, Polygon, MultiPolygon, atau LineString apa pun yang ditemukan di dalam dokumen untuk kueri spasial. Jika Anda mengubah kebijakan pengindeksan menggunakan portal Microsoft Azure, Anda dapat menentukan JSON berikut untuk kebijakan pengindeksan guna mengaktifkan pengindeksan spasial pada kontainer Anda:
Kebijakan pengindeksan kontainer JSON dengan pengindeksan spasial geografi
{
"automatic": true,
"indexingMode": "Consistent",
"includedPaths": [
{
"path": "/*"
}
],
"spatialIndexes": [
{
"path": "/*",
"types": [
"Point",
"Polygon",
"MultiPolygon",
"LineString"
]
}
],
"excludedPaths": []
}
Catatan
Jika nilai GeoJSON lokasi dalam dokumen cacat atau tidak valid, nilai tersebut tidak akan diindeks untuk kueri spasial. Anda bisa memvalidasi nilai lokasi dengan menggunakan ST_ISVALID dan ST_ISVALIDDETAILED.
Anda juga dapat mengubah kebijakan pengindeksan dengan menggunakan Azure CLI, PowerShell, atau SDK apa pun.
Contoh pengindeksan data geometri
Dengan jenis data geometri, yang mirip dengan jenis data geografi, Anda harus menentukan jalur dan jenis yang relevan untuk diindeks. Selain itu, Anda juga harus menentukan boundingBox dalam kebijakan pengindeksan untuk menunjukkan area pengindeksan yang diinginkan untuk jalur tertentu tersebut. Setiap jalur geospasial membutuhkan boundingBox.
Kotak batas terdiri dari properti berikut ini:
- xmin: koordinat x terindeks minimum
- ymin: koordinat y terindeks minimum
- xmax: koordinat x terindeks maksimum
- ymax: koordinat y terindeks maksimum
Kotak batas diperlukan karena data geometris menempati bidang yang mungkin tidak terbatas. Akan tetapi, Indeks spasial membutuhkan ruang terbatas. Untuk jenis data geografi, bumi adalah batasnya dan Anda tidak perlu mengatur kotak batas.
Buat kotak batas yang berisi semua (atau sebagian besar) data Anda. Hanya operasi yang dihitung pada objek yang sepenuhnya berada di dalam kotak batas yang dapat menggunakan indeks spasial. Membuat kotak batas lebih besar dari yang diperlukan akan berdampak negatif pada performa kueri.
Berikut adalah contoh kebijakan pengindeksan yang mengindeks data geometri dengan geospatialConfig diatur ke geometry:
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*"
}
],
"excludedPaths": [
{
"path": "/\"_etag\"/?"
}
],
"spatialIndexes": [
{
"path": "/locations/*",
"types": [
"Point",
"LineString",
"Polygon",
"MultiPolygon"
],
"boundingBox": {
"xmin": -10,
"ymin": -20,
"xmax": 10,
"ymax": 20
}
}
]
}
Kebijakan pengindeksan di atas memiliki boundingBox (-10, 10) untuk koordinat x dan (-20, 20) untuk koordinat y. Kontainer dengan kebijakan pengindeksan di atas akan mengindeks semua Points, Polygons, MultiPolygons, dan LineStrings yang sepenuhnya berada di wilayah ini.
Catatan
Anda akan menemui kegagalan jika mencoba menambahkan kebijakan pengindeksan dengan boundingBox ke kontainer dengan jenis data geography. Anda harus memodifikasi konfigurasi geospatialConfig kontainer menjadi geometry sebelum menambahkan boundingBox. Anda dapat menambahkan data dan memodifikasi sisa kebijakan pengindeksan Anda (seperti jalur dan jenis) baik sebelum atau sesudah memilih jenis data geospasial untuk kontainer.
Langkah berikutnya
Karena telah mempelajari cara memulai dukungan geospasial di Azure Cosmos DB, selanjutnya Anda dapat:
- Mempelajari lebih lanjut tentang Kueri Azure Cosmos DB
- Mempelajari lebih lanjut tentang Mengkueri data spasial dengan Azure Cosmos DB
- Mempelajari lebih lanjut tentang Data lokasi Geospasial dan GeoJSON di Azure Cosmos DB