sql >> Databáze >  >> RDS >> Mysql

Vyberte body z mapové databáze podle poloměru

Někdy parametr na ACOS() může být jen o málo větší než 1 -- mírně mimo doménu této funkce -- když jsou vzdálenosti malé. Díky Vincentymu je k dispozici lepší vzorec vzdálenosti. Používá ATAN2(y,x) namísto ACOS() funkce a tak je numericky stabilnější.

To je ono.

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))))

Tato funkce vrací výsledek ve stupních. Ve stupni je 111 045 km. 60 námořních mil. 69 zákonných mil. Takže vynásobte výsledek jedním z těchto čísel, abyste získali vzdálenost. Existuje úplnější zápis, včetně definice uložené funkce pro MySQL, zde .

Dalším řešením je použití ISNULL(ACOS(formula), 0.0)




  1. SQL Server vložit, pokud neexistuje, osvědčený postup

  2. Jak získat zeměpisnou šířku a délku z sdo_geometry v oracle

  3. Přístup k výstupu uložené procedury MySQL v Zend Framework 2

  4. PostgreSQL udává, kolikrát se podřetězec vyskytuje v textu