sql >> Databasteknik >  >> RDS >> Mysql

Välj punkter från kartdatabasen efter radie

Ibland parametern till ACOS() kan bara vara något större än 1 -- något utanför domänen för den funktionen -- när avstånden är små. Det finns en bättre distansformel tillgänglig, tack vare Vincenty. Den använder ATAN2(y,x) funktion istället för ACOS() funktion och är därför mer numeriskt stabil.

Det här är det.

DEGREES(
    ATAN2(
      SQRT(
        POW(COS(RADIANS(lat2))*SIN(RADIANS(lon2-lon1)),2) +
        POW(COS(RADIANS(lat1))*SIN(RADIANS(lat2)) -
             (SIN(RADIANS(lat1))*COS(RADIANS(lat2)) *
              COS(RADIANS(lon2-lon1))) ,2)),
      SIN(RADIANS(lat1))*SIN(RADIANS(lat2)) +
      COS(RADIANS(lat1))*COS(RADIANS(lat2))*COS(RADIANS(lon2-lon1))))

Denna funktion returnerar sitt resultat i grader. Det finns 111.045 km i en grad. 60 sjömil. 69 lagstadgade mil. Så multiplicera resultatet med ett av dessa siffror för att få avstånd. Det finns en mer komplett uppskrivning, inklusive en lagrad funktionsdefinition för MySQL, här .

En annan lösning är att använda ISNULL(ACOS(formula), 0.0)




  1. Varför använda främmande nycklar utan åtgärd vid radering eller uppdatering

  2. SQL Server-nätverksgränssnitt:Anslutningssträngen är inte giltig [87]

  3. Hur YEARWEEK() fungerar i MariaDB

  4. MariaDB UNION Operatör förklaras