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, 14:39:01
Post #2





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

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


Cytat(acztery @ 12.09.2011, 13:22:40 ) *
tak jest.. chodzi o to ze zmienna distance jest zła wartość - tam mam jakieś duże liczny.. Ograniczać nie mogę... na bazie 30 tys rekordów narazie zapytanie wykonuję sie mniej niż sek. wiec to nie problem.

aha żeby ograniczyć zakres i tak muszę wyliczyć dystans dla wszystkich wiec Twoja rada na temat jest bez sensu:)


w php mam ładny skrypt.


  1. class OrthodromicDistance
  2. {
  3.  
  4. const EQUATORIAL_RADIUS = 6378.137; // km
  5. const POLAR_RADIUS = 6356.7523; // km
  6.  
  7. private static function sqr($x)
  8. {
  9. return $x * $x;
  10. }
  11.  
  12. private static function getRadiusAt($latitude)
  13. {
  14. $latitude = deg2rad($latitude);
  15.  
  16. return sqrt((self::sqr(self::sqr(self::EQUATORIAL_RADIUS) * cos($latitude)) + self::sqr(self::sqr(self::POLAR_RADIUS) * sin($latitude))) /
  17. (self::sqr(self::EQUATORIAL_RADIUS * cos($latitude)) + self::sqr(self::POLAR_RADIUS * sin($latitude))));
  18. }
  19.  
  20. public static function getDistanceByCoordinates($fromLatitude, $fromLongitude,
  21. $toLatitude, $toLongitude)
  22. {
  23. $fromLatitude = deg2rad($fromLatitude);
  24. $fromLongitude = deg2rad($fromLongitude);
  25. $toLatitude = deg2rad($toLatitude);
  26. $toLongitude = deg2rad($toLongitude);
  27.  
  28. $x = sqrt(self::sqr(cos($toLatitude) * sin($fromLongitude - $toLongitude)) + self::sqr(cos($fromLatitude) * sin($toLatitude) - sin($fromLatitude) * cos($toLatitude) * cos($fromLongitude - $toLongitude)));
  29. $y = sin($fromLatitude) * sin($toLatitude) + cos($fromLatitude) * cos($toLatitude) * cos($fromLongitude - $toLongitude);
  30.  
  31. $averageRadius = (self::getRadiusAt($fromLatitude) + self::getRadiusAt($toLatitude)) / 2;
  32.  
  33. return atan2($x, $y) * $averageRadius;
  34. }
  35. }


i ładnie działa, to samo trzeba zrobić w SQL.

zrobiłbym to też na php ale tu paginacja inaczej wygląda po jak sortujemy w w SQL to paginacja za pomocą LIMIT , a jak za pomocą php miałbym obliczać to pobieram wszystko to tablicy potem tem skryptem wyliczam. potem sortuje nową tablice i sortuje już inaczej.. a nie mam czasu na takie działania teraz.

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 - 18:57