Geospatiala och GeoJSON-platsdata i Azure Cosmos DB för NoSQL

GÄLLER FÖR: NoSQL

Azure Cosmos DB for NoSQL har inbyggda geospatiala funktioner som representerar geometriska former eller faktiska platser/polygoner på en karta.

Geospatiala data omfattar ofta närhetsfrågor. Frågan "hitta alla detaljhandelsplatser nära min aktuella plats" besvaras till exempel med hjälp av en närhetsfråga över flera geospatiala dataobjekt.

Vanliga geospatiala användningsfall omfattar, men är inte begränsade till:

  • Geoplatsanalys som driver specifika platsbaserade marknadsföringsinitiativ.
  • Platsbaserad anpassning för branscher som detaljhandel och sjukvård för att förbättra användarupplevelsen.
  • Logistikförbättringar för branscher som transport där optimering är avgörande.
  • Riskanalys för branscher som försäkring och ekonomi för att komplettera andra metadata.
  • Situationsmedvetenhet*, för proxmiitetsbaserade aviseringar och meddelanden.

Introduktion till rumsliga data

Rumsliga data beskriver positionen och formen på objekt i rymden. I de flesta program motsvarar dessa punkter och former objekt på jorden och geospatiala data. Rumsliga data kan användas för att representera platsen för en person, en plats av intresse eller gränsen för en stad eller en sjö.

Azure Cosmos DB för NoSQL stöder två rumsliga datatyper: datatypen geometri och geografidatatypen .

  • Geometritypen representerar data i ett euklidiskt (platt) koordinatsystem. Den här typen är användbar för vanliga geometriska uppgifter, som att mäta linjer, korsa polygoner och mäta avståndet mellan punkter.
  • Geografitypen representerar data i ett jorden runt-koordinatsystem. Den här typen är användbar för vanliga geografiska uppgifter, som att avgöra om en plats ligger inom specifika gränser och mäta avståndet mellan platser.

Datatyper som stöds

Azure Cosmos DB for NoSQL stöder indexering och frågekörning av geospatiala punktdata som representeras med hjälp av GeoJSON-specifikationen. GeoJSON-datastrukturer är alltid giltiga JSON-objekt, så de kan lagras och efterfrågas med hjälp av Azure Cosmos DB utan några särskilda verktyg eller bibliotek.

Azure Cosmos DB stöder följande rumsliga datatyper:

  • Punkt
  • LineString
  • Polygon
  • MultiPolygon

Punkter

En punkt anger en enda position i blanksteg. I geospatiala data representerar en punkt den exakta platsen, som kan vara en gatuadress för en livsmedelsbutik, en kiosk, en bil eller en stad. En punkt representeras i GeoJSON (och Azure Cosmos DB för NOSQL) med hjälp av dess koordinatpar (longitud och latitud).

Överväg det här exemplet GeoJSON-punkt. Longitud är -122.12826822304672 och latitud är 47.63980239335718.

{
  "type": "Point",
  "coordinates": [
    -122.12826822304672,
    47.63980239335718
  ]
}

Tips

För geografidatatypen anger GeoJSON-specifikationen longitud först och latitud sekund. Precis som i andra mappningsprogram är longitud och latitud vinklar och representeras i termer av grader. Longitudvärden mäts från Prime Meridian och är mellan -180 grader och 180.0 grader, och latitudvärden mäts från ekvatorn och är mellan -90.0 grader och 90.0 grader.

För datatypen geometri anger GeoJSON-specifikationen den vågräta axeln först och den lodräta axeln sekund.

Rumsliga datatyper kan bäddas in i ett objekt enligt det här exemplet på ett anläggningsobjekt som innehåller GeoJSON-data.

{
  "name": "Headquarters",
  "location": {
    "type": "Point",
    "coordinates": [
      -122.12826822304672,
      47.63980239335718
    ]
  },
  "category": "business-offices"
}

Azure Cosmos DB for NoSQL tolkar koordinaterna enligt WGS-84-referenssystemet. Mer information finns i koordinatreferenssystem.

LineStrings

LineStrings representerar en serie med två eller flera punkter i utrymmet och de linjesegment som ansluter dem. I geospatiala data används LineStrings ofta för att representera motorvägar eller floder.

I det här exemplet används en radsträng för att representera en linje som ritas mellan två punkter.

{
  "type": "LineString",
  "coordinates": [
    [ 31.8, -5 ],
    [ 31.8, -4.7 ]
  ]
}

Polygoner

En Polygon är en gräns för anslutna punkter som utgör en stängd LineString. Polygoner används ofta för att representera naturliga formationer som sjöar eller politiska jurisdiktioner som städer och stater.

Punkter i en Polygon måste anges i motsols ordning. En polygon som anges i medsols ordning representerar inversen av regionen i den.

I det här exemplet skapas en polygon genom att ansluta flera punkter.

{
    "type":"Polygon",
    "coordinates":[ [
        [ 31.8, -5 ],
        [ 32, -5 ],
        [ 32, -4.7 ],
        [ 31.8, -4.7 ],
        [ 31.8, -5 ]
    ] ]
}

Tips

GeoJSON-specifikationen kräver att det senast angivna koordinatparet för giltiga polygoner ska vara samma som det första för att skapa en sluten form.

MultiPolygoner

En MultiPolygon är en matris med noll eller fler polygoner. MultiPolygoner kan inte överlappa sidor eller ha något gemensamt område. De kan röra vid en eller flera punkter.

Här är ett exempel på en MultiPolygon.

{
    "type":"MultiPolygon",
    "coordinates":[[[
            [52.0, 12.0],
            [53.0, 12.0],
            [53.0, 13.0],
            [52.0, 13.0],
            [52.0, 12.0]
        ]],
        [[
            [50.0, 0.0],
            [51.0, 0.0],
            [51.0, 5.0],
            [50.0, 5.0],
            [50.0, 0.0]
        ]]]
}

Koordinatreferenssystem

Eftersom jordens form är oregelbunden representeras koordinater för geospatiala geografiska data i många referenssystem (CRS). Varje CRS har sina egna referensramar och måttenheter. Till exempel är "National Grid of Britain" ett referenssystem som är korrekt för Storbritannien, men inte utanför det.

Den mest populära CRS som används idag är World Geodetic System WGS-84. GPS-enheter och många karttjänster, inklusive Google Maps- och Bing Maps-API:er, använder WGS-84. Azure Cosmos DB for NoSQL stöder indexering och frågekörning av geospatiala geografiska data med endast WGS-84 CRS.

Skapa objekt med rumsliga data

När du skapar objekt som innehåller GeoJSON-värden indexeras de automatiskt med ett rumsligt index. Den här standardindexeringen sker i enlighet med containerns indexeringsprincip. Standardindexeringsprincipen, om den inte anges, indexerar GeoJSON-data korrekt. Om du arbetar med en SDK på ett dynamiskt skrivet språk som Python eller Node.js måste du skapa en giltig GeoJSON.

var userProfileitem = {
    "id":"cosmosdb",
    "location":{
        "type":"Point",
        "coordinates":[ -122.12, 47.66 ]
    }
};

client.createitem(`dbs/${databaseName}/colls/${collectionName}`, userProfileitem, (err, created) => {
    // additional code within the callback
});

Om du inte har latitud- och longitudinformationen, men har de fysiska adresserna eller platsnamnet, letar du upp de faktiska koordinaterna med hjälp av en onlinetjänst. Tjänster som Bing Maps kan hjälpa dig att hitta faktiska geografidata från ett känt platsnamn. Mer information om geokodning för Bing Maps finns i REST Services för Bing Maps.