sql >> Databasteknik >  >> RDS >> Mysql

Formler för att beräkna geografisk närhet

Cosinuslagen och Haversineformeln kommer att ge identiska resultat om man antar en maskin med oändlig precision. Haversine-formeln är mer robust mot flyttalsfel. Men dagens maskiner har dubbel precision i storleksordningen 15 signifikanta siffror, och cosinuslagen kan fungera alldeles utmärkt för dig. Båda dessa formler antar sfärisk jord, medan Vicentys iterativa lösning (mest korrekt) antar ellipsoid jord (i verkligheten är jorden inte ens en ellipsoid - den är en geoid). Några referenser:http://www.movable-type. co.uk/scripts/gis-faq-5.1.html

Det blir bättre:notera vilken latitud som ska användas i cosinuslagen, liksom att Haversine är den geocentriska breddgraden, som skiljer sig från geodetisk bredd. För en sfär är dessa två desamma.

Vilken är snabbast att beräkna?

I ordning från snabbast till långsammast är:cosinuslagen (5 trig.anrop) -> haversine (involverar sqrt) -> Vicenty (måste lösa detta iterativt i en for-loop)

Vilken är mest korrekt?

Vicenty.

Vilken är bäst när både hastighet och noggrannhet beaktas?

Om din problemdomän är sådan att för de avstånd du försöker beräkna kan jorden betraktas som platt, då kan du räkna ut (jag ska inte ge detaljer) en formel av formen x =kx * skillnad i longitud , y =ky * skillnad i latitud. Då avstånd =sqrt(dxdx + dy dy). Om din problemdomän är sådan att den kan lösas med avstånd i kvadrat, så behöver du inte ta sqrt, och denna formel kommer att vara så snabb som du kan få. Det har den extra fördelen att du kan beräkna vektorn avstånd - x är avstånd i östlig riktning och y är avstånd i nordlig riktning. Annars experimentera med 3:an och välj det som fungerar bäst i din situation.



  1. Hur ställer jag in ett SQL Server-skripts timeout inifrån skriptet?

  2. Hur man får aktuellt datum och tid (utan tidszon) i T-SQL

  3. Vad är MySQL-ekvivalenten för STUFF() i SQL Server?

  4. Hur man endast returnerar numeriska värden i SQL Server