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 proxybaserade aviseringar och meddelanden.
Introduktion till rumsliga data
Rumsliga data beskriver objektens position och form 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 datatypen geografi .
- 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 frågas med hjälp av Azure Cosmos DB utan några särskilda verktyg eller bibliotek.
Azure Cosmos DB stöder följande spatiala 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).
Tänk på det här exemplet GeoJSON-punkt. Longitud är -122.12826822304672
och latitud är 47.63980239335718
.
{
"type": "Point",
"coordinates": [
-122.12826822304672,
47.63980239335718
]
}
Dricks
För geografidatatypen anger GeoJSON-specifikationen longitud först och latitud sekund. Precis som i andra mappningsprogram är longitud och latitud vinklar och representeras när det gäller 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 som visas i 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 rymden 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 linjesträ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 inom 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 ]
] ]
}
Dricks
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 koordinaterna 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 har stöd för 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": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
"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 geografiska data från ett känt platsnamn. Mer information om geokodning av Bing Maps finns i Bing Maps REST Services.