Tak, jest lepszy sposób. Musisz użyć indeksu przestrzennego . Indeksy te organizują metadane dotyczące geometrii, aby bardzo szybko odfiltrować odległe geometrie, oszczędzając wiele cykli procesora, unikając opisywanych obliczeń. Nie powinieneś zawracać sobie głowy ich implementacją, ponieważ wszystkie główne relacyjne bazy danych zapewniają typ geometrii przestrzennej i odpowiednie indeksy.
To, co chcesz sprawdzić, to zapytania „w odległości” (zapytania dotyczące geometrii w pewnej odległości od innej geometrii). Są to bardzo standardowe i bardzo rozwiązane problemy i są możliwe we wszystkich powyższych bazach danych (i są wbudowane w kilka):
- PostGIS:
ST_DWithin
- SQL Server:
STDistance
(Nie jest jasne, że użycie indeksu w wersji geograficznej 3D tej funkcji jest obsługiwane)
- Oracle:
SDO_WITHIN_DISTANCE
(To nie mówi wprost, że spowoduje użycie indeksu. Chciałbym dokładnie sprawdzić plan zapytań. Może być konieczne zastosowanie an, SDO_FILTER
aby uzyskać indeks).
- MySQL: Wciąż to rozgryzam.
Obejście dotyczące wyzwalania użycia indeksu
W najgorszym przypadku, gdy masz problemy z użyciem przez system indeksu przestrzennego do tych zapytań, możesz dodać dodatkowy filtr. Można by utworzyć obwiednię kwadratowy o bokach długości 2 * (wyszukiwanie na odległość) na środku u punktu wyszukiwanie i porównywanie geometrii tabeli ograniczającej pola przeciwko że przed sprawdzeniem faktycznej odległości. I tak właśnie robi PostGIS ST_DWithin
powyżej.
Odległość w GIS
Podczas gdy indeksy przestrzenne są fantastyczne i absolutnie właściwe rozwiązanie problemu, obliczanie odległości może być logicznie skomplikowane. W szczególności musisz się martwić o to, w jakim rzucie (w zasadzie wszystkie parametry układu współrzędnych) są przechowywane twoje dane. Większość rzutów 2D (inne niż układy współrzędnych kątowych, takie jak różne rzuty szerokości / długości) znacznie zniekształcają długość. Na przykład projekcja Web Mercator (ta używana przez Google, Bing i każdego innego głównego dostawcę map bazowych) rozszerza obszary i odległości w miarę zbliżania się do równika . Mogę się mylić, ponieważ nie jestem formalnie wykształcony w GIS, ale najlepsze, co widziałem dla projekcji 2D, to niektóre z tych, które obiecują prawidłowe odległości odpojedynczy, stały punkt na całym świecie. (Nie, nie jest praktyczne użycie innej projekcji dla każdego zapytania; to uczyniłoby twoje indeksy bezużytecznymi).
Najważniejsze jest to, że musisz upewnić się, że matematyka jest dokładna. Najprostszym sposobem na to z punktu widzenia rozwoju jest użycie rzutów kątowych (często określanych jako „geograficzne”) i funkcji, które wspierają wykonywanie matematyki przy użyciu modelu sferoidalnego, ale te obliczenia są nieco droższe niż odpowiedniki 2D a niektóre bazy danych mogą nie obsługiwać ich indeksowania. Jeśli jednak możesz uzyskać akceptowalną wydajność przy ich użyciu, prawdopodobnie jest to właściwy sposób. Inną powszechną opcją są prognozy regionalne (takie jak strefy UTM), które zbliżają zarówno odległości, jak i obszary, bardzo blisko do poprawienia, jeśli dane są ograniczone do określonej części świata. To, co będzie najlepsze dla Twojej aplikacji, będzie zależeć od Twoich konkretnych wymagań,
Dotyczy to nawet jeśli nie korzystasz z wbudowanych indeksów przestrzennych. Twoje dane mają pewną projekcję, niezależnie od tego, jakiej technologii lub techniki obecnie używasz lub używasz w przyszłości, i już teraz wpływa ona na wszelkie zapytania i obliczenia, które wykonujesz.