Kako implementirati geoprostorske funkcije MongoDB

Kako Implementirati Geoprostorske Funkcije Mongodb



Geoprostorska funkcija MongoDB zagotavlja preprost način za shranjevanje geografskih podatkov v zbirki podatkov. V bistvu lahko shranimo geoprostorske podatke v MongoDB kot objekte GeoJSON. GeoJSON je brezplačen in odprtokodni format, ki je odvisen od zapisa objekta JavaScript s preprostimi geografskimi podatki. Ta funkcija je pomembna za aplikacije, ki zahtevajo storitve na podlagi lokacije, kot je postopek kartiranja, na podlagi iskanja lokacije in druge. Ta članek pokriva geoprostorsko funkcijo s primerom izvedbe.

Dodajanje dokumentov v zbirko za geoprostorske značilnosti

Za predstavitev funkcionalnosti funkcije MongoDB Geospatial potrebujemo dokumente za določeno zbirko. V zbirko »območij« vstavimo nekaj dokumentov, kot je prikazano v nadaljevanju:

db.area.insertMany( [
{
ime: 'Otroški park' ,
lokacija: { tip: 'Točka' , koordinate: [ - 60,97 , 30.77 ]},
kategorija: 'Vrt'
},
{
ime: 'Študentsko območje' ,
lokacija: { tip: 'Točka' , koordinate: [ - 60,9928 , 30.7193 ]},
kategorija: 'Vrt'
},
{
ime: 'Nogometno igrišče' ,
lokacija: { tip: 'Točka' , koordinate: [ - 60.9375 , 30.8303 ]},
kategorija: 'Stadion'
}
] )

Imamo dokumente, ki vsebujejo podatke o lokaciji, kot so koordinate. Poleg tega na terenu ustvarimo geoprostorski indeks za optimizacijo delovanja geoprostorskih poizvedb.









Primer 1: Uporaba operatorja poizvedbe $geoIntersects

Prvič, imamo operator $geoIntersects geoprostorske funkcije, ki se križa s podanim objektom. Razmislite o naslednji izvedbi operatorja $geoIntersects:



db.area.find({ lokacija: { $geoIntersects: { $geometrija: { vrsta: 'Točka' ,

koordinate: [ - 60,97 , 30.77 ] } } } })

V primeru pokličemo zbirko »območje« skupaj z operacijo »najdi«. Metodi find() posredujemo nabore polj »lokacija« operatorju poizvedbe $geoIntersects geoprostorske funkcije. To se uporablja za preverjanje, ali se podana točka seka z geometrijo, ki je shranjena v polju geometrije.





Nato operator $geoIntesects prevzame operator $geometry, kjer je polje tipa nastavljeno z vrednostjo »Point«, polje koordinat pa je podano z vrednostmi »koordinate«. Tu je $geometrija definirana za geoprostorsko primerjavo.

Naslednji izhod je, kjer se pridobi pričakovani dokument in kjer geometrijsko polje vsebuje geometrijski objekt, ki seka z navedeno točko:



Primer 2: Uporaba operatorja poizvedbe $near

Operator $near je tudi geoprostorska funkcija, ki se uporablja za izvajanje geoprostorskih poizvedb za prepoznavanje dokumentov, ki so geografsko blizu določenega kraja. Pridobi dokumente, ki so razvrščeni glede na njihovo bližino določene lokacije. Tukaj ponujamo implementacijo operatorja $near:

db.area.find(
{
lokacija:
{$blizu:
{
$geometry: { vrsta: 'Točka' ,  koordinate: [ - 60,9667 , 30.78 ]},
$minDistance: 1000 ,
$maxDistance: 5000
}
}
}
)

V primeru definiramo polje »lokacija« zbirke »območje« znotraj operacije »najdi«. Nato smo nastavili operator poizvedbe $near geoprostorske funkcije na to polje »lokacija«. Operator $near išče bližnjo točko z danimi koordinatami točke. Nato uporabimo parametra $minDistance in $maxDistance v operatorju $near, ki imata določene vrednosti za pridobivanje dokumentov v določenem obsegu razdalje od dane točke.

Dokument je pridobljen v izhodu, ki je v bližini določenih lokacij ali zanimivih točk v zbirki geoprostorskega »območja«:

Primer 3: Uporaba operatorja poizvedbe $nearsphere

Druga možnost je, da imamo operator $nearsphere, ki je podoben operatorju $near, vendar $nearSphere pri izračunu razdalj upošteva sferično obliko Zemlje.

db.area.find(
{
lokacija: {
$nearSphere: {
$geometry: {
vrsta: 'Točka' ,
koordinate : [ - 60,9667 , 30.78 ]
},
$minDistance: 1000 ,
$maxDistance: 5000
}
}
}
)

V primeru uporabljamo operator $nearsphere geoprostorske poizvedbe. Operator $nearspehere tukaj išče dokument, katerega najbližje točke so blizu točkam, podanim v poizvedbi, točke pa so nastavljene na niz koordinatnih polj.

Po tem izboljšamo rezultate z določitvijo parametrov $minDistance in $maxDistance. Parameter $minDistance zagotavlja, da so vrnjeni dokumenti oddaljeni vsaj 1000 metrov od podane točke, medtem ko parameter $maxDistance omejuje rezultate na lokacije, ki niso oddaljene več kot 5000 metrov.

Dokument je prikazan v izhodu z lokacijo v določenem metru od točke z danimi koordinatami:

Primer 4: Uporaba operatorja poizvedbe $geoWithin

Nato imamo operater $geoWithin v MongoDB, ki se uporablja za geoprostorske poizvedbe za iskanje dokumentov, ki so popolnoma znotraj določene oblike, kot je krog. Oglejmo si naslednjo predstavitev poizvedbe $geoWithin:

db.area.find({ lokacija:

{ $geoWithin:

{ $centerSphere: [ [ - 60.93414657 , 30.82302903 ], 3 / 3963.2 ] } } })

V primeru uporabljamo operator $geoWithin za iskanje dokumentov zbirke »area« znotraj določenega krožnega območja na 2D krogli. Za to določimo operator $centerSphere znotraj operatorja $geoWithin, ki vzame dva argumenta kot središčno točko, ki tukaj verjetno predstavlja koordinatno točko, in polmer kroga, ki predstavlja vrednost razdalje v miljah.

Nastali dokument je pridobljen v naslednjem, ki predstavlja geoprostorsko točko, ki spada znotraj kroga, ki je opredeljen z dano središčno točko in polmerom približno 3 milj:

Primer 5: Uporaba operatorja poizvedbe $geoNear

Poleg tega je operater $geoNear tudi geoprostorski operater, ki se uporablja za cevovod združevanja. Izvede geoprostorsko poizvedbo in vrne dokumente, ki so razvrščeni glede na bližino določene točke. Tukaj smo podali operator $geoNear, ki se kliče znotraj cevovoda združevanja.

db.area.aggregate([
{
$geoNear: {
blizu: { vrsta: 'Točka' , koordinate: [ - 60.99279 , 30.719296 ]},
distanceField: 'dist.calculated' ,
maxDistance: 2 ,
poizvedba: { kategorija: 'Vrt' },
includeLocs: 'dist.location' ,
sferično: res
}
}
])

V primeru kličemo agregatno metodo MongoDB in znotraj nje definiramo operator $geoNear. Operator $geoNear je nastavljen z več parametri za določanje obnašanja poizvedbe. Najprej nastavimo parameter »blizu«, ki zagotavlja vrednosti »koordinat« kot referenčno točko za iskanje.

Nato uporabimo parameter »distanceField«, da podano polje določimo kot polje izida. To nastavljeno polje rezultatov shrani razdaljo med vsakim dokumentom in referenčno točko. Nato definiramo parameter »maxDistance« z vrednostjo »2«, ki predstavlja največjo razdaljo v metrih.

Po tem imamo parameter »poizvedbe«, ki filtrira dokumente po polju »kategorija« in upošteva samo dokumente, kjer je »kategorija« »Parki«. Nato pokličemo parameter »includeLocs«, ki vsebuje informacije o lokaciji. Končno določimo 'sferični' parameter z 'true' vrednostjo, ki izračuna razdalje z uporabo 2D sferičnega koordinatnega sistema.

Cevovod združevanja predstavlja dokument v izhodu, ki ustrezno prikazuje informacije glede na parameter. Naslednje polje »dist.calculated« prikazuje razdaljo vsakega dokumenta od referenčne točke:

Zaključek

Spoznali smo, da nam geoprostorske zmogljivosti MongoDB pomagajo pri učinkoviti obdelavi in ​​poizvedovanju po informacijah, ki temeljijo na lokaciji. S primerom programa smo se naučili implementacije geoprostorske funkcije z uporabo njenih različnih operaterjev. Imamo veliko več funkcij in metod, ki so prav tako koristne za široko paleto aplikacij.