sql >> Database teknologi >  >> RDS >> Mysql

Formler til at beregne geografisk nærhed

Cosinusloven og Haversine-formlen vil give identiske resultater, hvis man antager en maskine med uendelig præcision. Haversine-formlen er mere robust over for floating point-fejl. Men nutidens maskiner har dobbelt præcision af størrelsesordenen 15 signifikante cifre, og cosinusloven kan fungere fint for dig. Begge disse formler antager sfærisk jord, hvorimod Vicentys iterative løsning (mest nøjagtige) antager ellipsoid jord (i virkeligheden er jorden ikke engang en ellipsoide - den er en geoide). Nogle referencer:http://www.movable-type. co.uk/scripts/gis-faq-5.1.html

Det bliver bedre:bemærk breddegraden, der skal bruges i cosinusloven, og Haversine er den geocentriske breddegrad, som er forskellig fra geodætisk breddegrad. For en kugle er disse to de samme.

Hvilken er hurtigst at beregne?

I rækkefølge fra hurtigste til langsomste er:lov om cosinus (5 trig. kald) -> haversine (involverer sqrt) -> Vicenty (skal løse dette iterativt i en for-løkke)

Hvilken er mest nøjagtig?

Vicenty.

Hvilken er bedst, når både hastighed og nøjagtighed tages i betragtning?

Hvis dit problemdomæne er sådan, at for de afstande, du forsøger at beregne, kan jorden betragtes som flad, så kan du regne ud (jeg vil ikke give detaljer) en formel på formen x =kx * længdeforskel , y =ky * forskel i breddegrad. Så distance =sqrt(dxdx + dy D y). Hvis dit problemdomæne er sådan, at det kan løses med afstand i kvadrat, så behøver du ikke tage sqrt, og denne formel vil være så hurtig, som du overhovedet bliver. Det har den ekstra fordel, at du kan beregne vektoren afstand - x er afstand i østlig retning, og y er afstand i nordlig retning. Ellers eksperimenter med de 3 og vælg det, der fungerer bedst i din situation.



  1. Oracle:SQL-forespørgsel for at finde alle de triggere, der hører til tabellerne?

  2. MySQL-replikering:Fejlgående transaktioner i GTID-baseret replikering

  3. postgresql-sekvens nextval i skema

  4. MySQL SIGN() Funktion – Find ud af, om et tal er positivt eller negativt i MySQL