2009-06-25 9 views
7

W moim DB i przechowywać punkt środkowy, wraz z promieniem (w metrach).Odwróć formułę Haversine dla MySQL?

Szukam przekazać w lat/lng, a następnie mieć wartości mysql, które zostały zapisane, utworzyć krąg, aby powiedzieć mi, czy mój punkt, który przekazałem jest w tym kręgu. Czy jest coś, co pozwoliłoby mi to zrobić, podobne do haversine forumla (które mogłoby zakładać, że mój punkt był już w db).

Haversine Wzór: (3959 * (cos (ACOS radianach (40)) * cos (radianów (ac)) * cos (radianów (long) - radianach (-110)), + sin (radianów (40)) * sin (radianów (long)))

db:

circleLatCenter, circleLngCenter, Promień

przekazując> select id z foo gdzie szer LNG (marka funkcję kółko: circleLat, circleLng, promień)

Odpowiedz

2

Wykonałem podobne wyszukiwania geograficzne, obliczając obwiednię za pomocą wielkiej odległości i wysyłając zapytanie do bazy danych. Nadal potrzebujesz kolejnego podania w aplikacji, aby "zaokrąglać rogi" od obwiedni do okręgu.

więc, biorąc pod uwagę bazę danych punktów, punkt wyszukiwania (X, Y) i odległość D, znaleźć wszystkie punkty wewnątrz D (X, Y):

  1. Compute deltaX, który jest punktem jeśli przesunąłeś odległość D wzdłuż osi Y.
  2. Oblicz deltaY, czyli punkt, w którym przesunięto odległość D wzdłuż osi X.
  3. Oblicz swoją obwiedni: (X-deltaX, Y-deltaY), (x + deltaX, Y + deltaY) bazy
  4. Query punktów używać SQL między operatorem: SELECT * FROM tabela WHERE X pomiędzy X-deltaX I X + deltaX I Y MIĘDZY Y-deltaY I Y + deltaY
  5. Po zakończeniu procesu zwraca listę punktów, obliczając faktyczny duży dystans okręgu, aby usunąć punkty w rogach kwadratu, które nie znajdują się w twoim okręgu odległości.

Jako skrót, zazwyczaj obliczam stopnie na milę dla zarówno długości jak i długości geograficznej (na równiku, ponieważ stopnie na milę są różne na biegunach dla lon) i wyprowadzam deltaX i DELTAY jako (D * stopnie na milę) lub stopnie na kilometr na milę. Różnica na równiku z biegunem nie ma większego znaczenia, ponieważ już obliczam rzeczywistą odległość po zapytaniu SQL.

FYI - 0,167469 do 0,014564 stopni-LON-per-mili, a 0,014483 stopni LAT-per-mili

+0

zrobić to samo, (najpierw przejść z kwadratem następnie zaokrąglenie rogu z długości hypotenus), ale nie można znaleźć lepszy sposób na to, że skoro napisałem ten post? –

-1

Wiem, że jest to od dawna nieumiejętny post, ale na wypadek, gdyby ktoś kiedykolwiek się z tym spotkał, wcale nie trzeba tworzyć "odwróconej formuły haversine". Formuła Haversine podaje odległość między punktem a punktem b. Do obliczenia potrzebujesz odległości między punktem b a punktem a.Są to ta sama wartość.

SELECT *, 
(3959 * acos(cos(radians(40)) * cos(radians(`circleLatCenter`)) * cos(radians(`circleLngCenter`) - radians(-110)) + sin(radians(40)) * sin(radians(`circleLngCenter`))) as `haversine` 
FROM `table` WHERE 1=1 
HAVING `haversine` < `Radius` 
+0

Użycie 'acos()' oznacza, że ​​nie jest to obliczenie haversine, to "sferyczne prawo cosinusów". –