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:

Setting geospatial configuration

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: