Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pobliskie miasta
Robert007
post 18.02.2016, 10:55:06
Post #1





Grupa: Zarejestrowani
Postów: 167
Pomógł: 2
Dołączył: 1.07.2009
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Witam, mam w bazie miasta z podanymi lat i lng i chciałbym na podstawie danej pozycji lat lng sprawdzić najbliższe miasta i obliczyć ile w danej odległości jest kilometrów.

Co chcę uzyskać? Mam tak:
1. Podaje do zapytania SQL moje pozycje (np. lat: 53.1351082 lng: 17.90514870000004)
2. W bazie wszystkie miasta mają swoją pozycję lat i lng i chcę by mi wyświetliło X miast tylko najbliższych do podanej pozycji.
3. Policzenie odległości km ile do danego miasta jest od podanej pozycji w linii prostej.

Zapewne trzeba użyć jakiś specyficznych funkcji MySQL ale niestety nie wiem jak się za to zabrać i jakie funkcję mi pomogą.
Liczę na waszą pomoc.

Ten post edytował Robert007 18.02.2016, 10:56:41
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
trueblue
post 18.02.2016, 10:56:39
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Zapewne nie.

http://stackoverflow.com/questions/27928/c...versine-formula


--------------------
Go to the top of the page
+Quote Post
Robert007
post 18.02.2016, 11:17:17
Post #3





Grupa: Zarejestrowani
Postów: 167
Pomógł: 2
Dołączył: 1.07.2009
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Wydaję mi się że działa poprawnie, wrzucam poniżej rozwiązanie:
  1. SELECT location, (6371 * acos(cos(radians(52.3957877)) * cos(radians(coordinates_lat)) * cos(radians(16.7491037) - radians(coordinates_lng)) + sin( radians(52.3957877)) * sin(radians(coordinates_lat)))) AS distanta
  2. FROM `TABELA` WHERE coordinates_lat <> '' AND coordinates_lng <> '' HAVING distanta < 50 ORDER BY distanta ASC


W razie nie będzie działać jak powinno to napiszę Tutaj.
Dzięki!


Go to the top of the page
+Quote Post
trueblue
post 18.02.2016, 11:20:47
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Na pewno nie HAVING, warunek powinien być w WHERE.


--------------------
Go to the top of the page
+Quote Post
Robert007
post 18.02.2016, 11:28:32
Post #5





Grupa: Zarejestrowani
Postów: 167
Pomógł: 2
Dołączył: 1.07.2009
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Jest błąd SQL wtedy jak dam AND zamiast HAVING, w ogóle co to za liczba 6371? Bo tam nie wiem czy trzeba coś podstawić.
Go to the top of the page
+Quote Post
trueblue
post 18.02.2016, 11:34:36
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Trzeba przenieść obliczenie do WHERE, wtedy bez ORDER tak:
  1. SELECT location
  2. FROM `TABELA` WHERE coordinates_lat <> '' AND coordinates_lng <> '' AND (6371 * acos(cos(radians(52.3957877)) * cos(radians(coordinates_lat)) * cos(radians(16.7491037) - radians(coordinates_lng)) + sin( radians(52.3957877)) * sin(radians(coordinates_lat)))) < 50


lub z ORDER:
  1. SELECT location, (6371 * acos(cos(radians(52.3957877)) * cos(radians(coordinates_lat)) * cos(radians(16.7491037) - radians(coordinates_lng)) + sin( radians(52.3957877)) * sin(radians(coordinates_lat)))) AS distanta
  2. FROM `TABELA` WHERE coordinates_lat <> '' AND coordinates_lng <> '' AND (6371 * acos(cos(radians(52.3957877)) * cos(radians(coordinates_lat)) * cos(radians(16.7491037) - radians(coordinates_lng)) + sin( radians(52.3957877)) * sin(radians(coordinates_lat)))) < 50 ORDER BY distanta ASC



Cytat
var R = 6371; // Radius of the earth in km


--------------------
Go to the top of the page
+Quote Post
Robert007
post 18.02.2016, 11:51:19
Post #7





Grupa: Zarejestrowani
Postów: 167
Pomógł: 2
Dołączył: 1.07.2009
Skąd: Poznań

Ostrzeżenie: (0%)
-----


OK czyli przykład z "lub z ORDER:" rozumiem że jest optymalniejszy i może nie generuje tabeli tymczasowej?
Go to the top of the page
+Quote Post
trueblue
post 18.02.2016, 11:56:14
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Raczej bez ORDER jest optymalniejszy i trudniej o błąd w składni obliczeń. Sortować wtedy można już bezpośrednio w kodzie, po pobraniu danych.
Sprawdź sobie optymalność poprzez EXPLAIN.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 14:03