Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> SQL i sortowanie według odległości GPS
acztery
post 12.09.2011, 13:40:09
Post #1





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

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


Witam,

Mam bazę 30 tys rekordów, każdy rekord ma dane geograficzne (szerokość i długość - dziesiętną) jak zrobić zapytanie które pokaże listę posortowanych rekordów według dystansu.



Czyli najpierw obliczamy dystans dla każdego rekordu na podstawie danych lokalizacyjnych. potem sortujemy.

żeby zobrazować.

mam listę kin w Polsce użytkownik normalnie ogląda listę posortowaną według daty dodana. Ale jak w swoich ustawieniach konta poda swoje dane geograficzne to na ich podstawie będzie mógł zobaczyć co jest najbliżej jego lokalizacji.

na razie wyklułem coś takiego:

  1. function m_listdatabase ($category)
  2. {
  3. return $this->MysqlGetArray("SELECT *, ROUND( ACOS( SIN( RADIANS( lat ) ) * SIN( 19.0237800 ) + COS( RADIANS( lat ) ) * COS( 50.2648900 ) * COS( RADIANS( lat ) - 50.2648900 ) ) * 6371.01, 2 ) AS distance FROM `database` WHERE act=1 AND cat = '".$this->sqlFiltr($category)."' GROUP by id ORDER by distance DESC LIMIT ".model_settings::m_get_value(34)." ");
  4. }



MUSI BYC TO ZAPYTANIE BEZ INGERENCJI PHP.

Ten post edytował acztery 12.09.2011, 14:19:35
Powód edycji: [wookieb]:
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
acztery
post 12.09.2011, 17:06:38
Post #2





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

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


erix mogę ale wtedy mogą być przekłamania w wynikach. czyli jak mam np 3 kina obok siebie to te wyniki mogą być złe. Po za tym błędna różnica w odległości bedzie rosnąć wraz z odległością od punktu a do punktu B. Jak zrobie to pokażę.

Ps to co pokazałem uwzględnia to że ziemia jest okrągła.... (prawie okrągła bo koło to to nie jest ale to tak na marginesie)


Procedura ładnie działa.
  1. CREATE DEFINER=`nazwa_usera_bazy`@`%` FUNCTION `get_distance_metres`(lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE) RETURNS double
  2. BEGIN
  3. DECLARE rlo1 DOUBLE;
  4. DECLARE rla1 DOUBLE;
  5. DECLARE rlo2 DOUBLE;
  6. DECLARE rla2 DOUBLE;
  7. DECLARE dlo DOUBLE;
  8. DECLARE dla DOUBLE;
  9. DECLARE a DOUBLE;
  10.  
  11. SET rlo1 = RADIANS(lng1);
  12. SET rla1 = RADIANS(lat1);
  13. SET rlo2 = RADIANS(lng2);
  14. SET rla2 = RADIANS(lat2);
  15. SET dlo = (rlo2 - rlo1) / 2;
  16. SET dla = (rla2 - rla1) / 2;
  17. SET a = SIN(dla) * SIN(dla) + COS(rla1) * COS(rla2) * SIN(dlo) * SIN(dlo);
  18. RETURN (6378137 * 2 * ATAN2(SQRT(a), SQRT(1 - a)))/1000;
  19. END


Ten post edytował acztery 12.09.2011, 17:51:07
Go to the top of the page
+Quote Post

Posty w temacie


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 - 20:00