Haversine Formulasından (PHP, Python, MySQL, MSSQL Nümunələri) istifadə edərək, Enlem və Boylam Nöqtələri Arasındakı Böyük Dairənin Məsafəsini Hesablayın və ya Sorğu Edin

Haversine Formula - Böyük Dairə Məsafəsi - PHP, Python, MySQL

Bu ay GIS ilə bağlı PHP və MySQL-də bir az proqram hazırladım. Şəbəkəni gözdən qaçırarkən, bəzilərini tapmaqda çətinlik çəkdim Coğrafi hesablamalar iki yer arasındakı məsafəni tapmaq üçün onları burada bölüşmək istədim.

Böyük dairə məsafəsi ilə Avropaya uçuş xəritəsi

İki nöqtə arasındakı məsafəni hesablamağın sadə yolu üçbucağın (A² + B² = C²) hipotenusunu hesablamaq üçün Pifaqor düsturundan istifadə etməkdir. Bu kimi tanınır Evklid məsafəsi.

Bu maraqlı bir başlanğıcdır, ancaq coğrafiya ilə tətbiq olunmur, çünki enlem və boylam xətləri arasındakı məsafə bərabər məsafələr deyil ayrı. Ekvatora yaxınlaşdıqca enlik xətləri bir-birindən uzaqlaşır. Bir növ sadə üçbucaq tənliyindən istifadə edirsinizsə, Yerin əyriliyi səbəbi ilə bir yerdə məsafəni dəqiq, digərində olduqca səhv ölçə bilər.

Böyük dairə məsafəsi

Yer kürəsi ətrafında uzun məsafələrə gedən marşrutlar Böyük dairə məsafəsi. Yəni... kürənin iki nöqtəsi arasındakı ən qısa məsafə düz xəritədəki nöqtələrdən fərqlidir. Bunu enlik və uzunluq xətlərinin bərabər məsafədə olmaması faktı ilə birləşdirin... və çətin bir hesablama var.

Budur Böyük Dairələrin necə işlədiyini göstərən fantastik video izahatı.

Haversine Formulu

Yerin əyriliyindən istifadə olunan məsafə Haversin qarışığı, yerin əyriliyinə imkan vermək üçün trigonometriyadan istifadə edir. Yer üzündə 2 yer arasındakı məsafəni tapdığınız zaman (qarğa uçduğu kimi), düz bir xətt həqiqətən bir qövsdür.

Bu hava uçuşlarında tətbiq olunur - heç uçuşların həqiqi xəritəsinə baxmısınızmı və onların tağlı olduğuna diqqət yetirmisiniz? Bunun səbəbi iki nöqtə arasındakı bir tağda uçmaq birbaşa yerə deyil, daha qısa olmasıdır.

PHP: Enlem və Boylam 2 nöqtəsi arasındakı məsafəni hesablayın

Budur iki nöqtə arasındakı məsafəni hesablamaq üçün PHP düsturu (Mile vs. Kilometrə çevirmə ilə birlikdə) iki onluq yerə yuvarlaqlaşdırılıb.

function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles') {
  $theta = $longitude1 - $longitude2; 
  $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); 
  $distance = acos($distance); 
  $distance = rad2deg($distance); 
  $distance = $distance * 60 * 1.1515; 
  switch($unit) { 
    case 'miles': 
      break; 
    case 'kilometers' : 
      $distance = $distance * 1.609344; 
  } 
  return (round($distance,2)); 
}

Dəyişənlər bunlardır:

  • $Enlem1 – ilk yerinizin eni üçün dəyişən.
  • $Uzunluq1 – ilk yerinizin uzunluğu üçün dəyişən
  • $Enlem2 – ikinci yerinizin eni üçün dəyişən.
  • $Uzunluq2 – ikinci yerinizin uzunluğu üçün dəyişən.
  • $vahid – standart varlıq mil. Bu yenilənə və ya ötürülə bilər kilometr.

Python: 2 Enlem və Boylam Nöqtələri Arasındakı Məsafəni Hesablayın

Hər halda, burada iki nöqtə arasındakı məsafəni hesablamaq üçün Python düsturu (Mile vs. Kilometrə çevirmə ilə birlikdə) iki onluq yerə yuvarlaqlaşdırılıb. Məlumat alimi olan oğlum Bill Karr-a kredit OpenINSIGHTS, kod üçün.

from numpy import sin, cos, arccos, pi, round

def rad2deg(radians):
    degrees = radians * 180 / pi
    return degrees

def deg2rad(degrees):
    radians = degrees * pi / 180
    return radians

def getDistanceBetweenPointsNew(latitude1, longitude1, latitude2, longitude2, unit = 'miles'):
    
    theta = longitude1 - longitude2
    
    distance = 60 * 1.1515 * rad2deg(
        arccos(
            (sin(deg2rad(latitude1)) * sin(deg2rad(latitude2))) + 
            (cos(deg2rad(latitude1)) * cos(deg2rad(latitude2)) * cos(deg2rad(theta)))
        )
    )
    
    if unit == 'miles':
        return round(distance, 2)
    if unit == 'kilometers':
        return round(distance * 1.609344, 2)

Dəyişənlər bunlardır:

  • enlik1 – ilk yeriniz üçün dəyişən Enlem.
  • uzunluq 1 – ilk yeriniz üçün dəyişən uzunluq
  • enlik2 – ikinci yeriniz üçün dəyişən Enlem.
  • uzunluq 2 – ikinci yeriniz üçün dəyişən uzunluq.
  • vahid – standart varlıq mil. Bu yenilənə və ya ötürülə bilər kilometr.

MySQL: Enlem və Boylamdan istifadə edərək millərlə məsafəni hesablamaqla bir diapazonda olan bütün qeydləri əldə etmək

Bütün qeydləri müəyyən bir məsafədə tapmaq üçün hesablama aparmaq üçün SQL istifadə etmək də mümkündür. Bu nümunədə MyTQL-də dəyişmədən az olan və ya bərabər olan $ məsafəni (Mil-də) yerləşməyimə $ enlik və $ uzunluqda olan bütün qeydləri tapmaq üçün MySQL-də sorğu göndərəcəyəm:

Bütün qeydləri konkret daxilində almaq üçün sorğu məsafə enlem ve boylam iki nöqtəsi arasındakı məsafəni hesablayaraq bunlardır:

$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`)*pi()/180)))) * 180/pi()) * 60 * 1.1515) as distance FROM `table` WHERE distance <= ".$distance."

Bunu fərdiləşdirməlisiniz:

  • uzunluq - bu nöqtənin uzunluğunu keçdiyim bir PHP dəyişənidir.
  • $ enlem - bu nöqtənin uzunluğunu keçdiyim bir PHP dəyişənidir.
  • $ məsafə - bütün qeydləri daha az və ya bərabər tapmaq istədiyiniz məsafə.
  • masa - bu cədvəl ... bunu masa adınızla əvəz etmək istərdiniz.
  • Enlem - bu sizin enliyinizin sahəsi.
  • uzunluq - bu sənin boyunun sahəsidir.

MySQL: Enlem və Boylamdan istifadə edərək kilometrlərlə məsafəni hesablamaqla bir diapazonda olan bütün qeydləri əldə etmək

Və MySQL-də kilometrlərdən istifadə edən SQL sorğusu:

$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`) * pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as distance FROM `table` WHERE distance <= ".$distance."

Bunu fərdiləşdirməlisiniz:

  • uzunluq - bu nöqtənin uzunluğunu keçdiyim bir PHP dəyişənidir.
  • $ enlem - bu nöqtənin uzunluğunu keçdiyim bir PHP dəyişənidir.
  • $ məsafə - bütün qeydləri daha az və ya bərabər tapmaq istədiyiniz məsafə.
  • masa - bu cədvəl ... bunu masa adınızla əvəz etmək istərdiniz.
  • Enlem - bu sizin enliyinizin sahəsi.
  • uzunluq - bu sənin boyunun sahəsidir.

Bu kodu Şimali Amerika daxilində 1,000-dən çox yeri olan pərakəndə mağaza üçün istifadə etdiyimiz bir müəssisə xəritələşdirmə platformasında istifadə etdim və çox yaxşı işlədi.

Microsoft SQL Server Coğrafi Məsafə: STDistance

Microsoft SQL Serverindən istifadə edirsinizsə, onlar öz funksiyalarını təklif edirlər, STDistance Coğrafiya məlumat növündən istifadə edərək iki nöqtə arasındakı məsafəni hesablamaq üçün.

DECLARE @g geography;  
DECLARE @h geography;  
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);  
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);  
SELECT @g.STDistance(@h);  

VP və Memarı Manash Sahoo-ya papaq ucu Highbridge.

77 Şərhlər

  1. 1

    Paylaşdığınız üçün çox sağ olun. Bu, asan kopyalayıb yapışdırmaq işi idi və əla işləyir. Mənə çox vaxt qənaət etdin.
    C-yə keçid edən hər kəs üçün məlumat:
    double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }

  2. 2

    Çox gözəl yazı parçası - çox gözəl işlədi - Mən yalnız uzunluqda olan masanın adını dəyişməli oldum. Bu olduqca sürətli işləyir.. Mən kifayət qədər az sayda lat-longs (< 400) var, lakin mən bu gözəl miqyasda olardı. Çox gözəl saytdır – mən onu indicə del.icio.us hesabıma əlavə etdim və müntəzəm olaraq yoxlayacağam.

  3. 4
  4. 5

    Bütün günü məsafə hesablamaları üçün axtardım və harversine alqoritmini tapdım, bunun sql ifadəsinə necə qoyulacağına dair nümunə verdiyiniz üçün təşəkkür edirəm. Təşəkkür edirəm və salamlayıram, Daniel

  5. 8

    Düşünürəm ki, SQL-in bir ifadəyə ehtiyacı var.
    HARƏDƏ məsafə <= $distance əvəzinə sizə lazım ola bilər
    HAVING məsafədən istifadə edin <= $distance

    əks halda mənə çoxlu vaxt və enerjiyə qənaət etdiyiniz üçün təşəkkür edirəm.

  6. 10
  7. 11
  8. 12

    Bu kodu paylaşdığınız üçün çox sağ olun. Bu, mənə çoxlu inkişaf vaxtı qənaət etdi. Həmçinin, MySQL 5.x üçün HAVING ifadəsinin zəruri olduğunu qeyd etdiyiniz üçün oxucularınıza təşəkkür edirik. Çox faydalıdır.

  9. 14
  10. 15

    , Hello

    Başqa bir sual. Aşağıdakı kimi NMEA sətirləri üçün formula varmı?

    1342.7500,N,10052.2287,E

    $GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B

    Thanks,
    Harry

  11. 16

    Mən də tapdım ki, WHERE mənim üçün işləmir. HAVING olaraq dəyişdirildi və hər şey mükəmməl işləyir. Əvvəlcə şərhləri oxumadım və iç içə seçimdən istifadə edərək onu yenidən yazdım. Hər ikisi yaxşı işləyəcək.

  12. 17
  13. 18

    İnanılmaz dərəcədə faydalıdır, çox sağ olun! “HARADA” deyil, yeni “HAVING” ilə bağlı bəzi problemlər yaşayırdım, lakin bir dəfə buradakı şərhləri oxudum (təxminən yarım saat məyusluq içində dişlərimi üyütdükdən sonra =P), onu yaxşı işlətdim. Təşəkkür edirəm ^_^

  14. 19
  15. 20

    Nəzərə alın ki, belə bir seçilmiş ifadə çox hesablama baxımından sıx və buna görə də yavaş olacaq. Əgər bu sorğuların çoxu varsa, o, işi çox tez çaşdıra bilər.

    Daha az intensiv yanaşma hesablanmış məsafə ilə müəyyən edilmiş Kvadrat sahədən istifadə edərək birinci (xam) seçimi həyata keçirməkdir, yəni “enlem1 və enlik2 arasında olan cədvəl adından * seçin və uzunluq1 və uzunluq2 arasındadır”. lat1 = hədəf eni – latdiff, lat2 = hədəf eni + latdiff, lon ilə oxşar. latdiff ~= məsafə / 111 (km üçün) və ya məsafə/69 mil üçün 1 dərəcə enlik ~ 111 km olduğundan (yer bir qədər oval olduğundan cüzi dəyişiklik, lakin bu məqsəd üçün kifayətdir). londiff = məsafə / (abs(cos(deg2rad(enlem))*111)) — və ya mil üçün 69 (dəyişiklikləri nəzərə almaq üçün əslində bir qədər böyük kvadrat götürə bilərsiniz). Sonra bunun nəticəsini götürün və onu radial seçimə daxil edin. Sadəcə olaraq, sərhəddən kənar koordinatları nəzərə almağı unutmayın, yəni məqbul uzunluq diapazonu -180 ilə +180 arasındadır və məqbul enlik diapazonu -90 ilə +90 arasındadır - latdiff və ya londiffiniz bu diapazondan kənarda işləyirsə. . Nəzərə alın ki, əksər hallarda bu tətbiq olunmaya bilər, çünki bu, yalnız qütbdən qütbə Sakit okeandan keçən xətt üzrə hesablamalara təsir göstərir, baxmayaraq ki, o, Çukotkanın bir hissəsi ilə Alyaskanın bir hissəsini kəsir.

    Bununla əldə etdiyimiz şey, bu hesablamanı apardığınız xalların sayının əhəmiyyətli dərəcədə azalmasıdır. Əgər verilənlər bazanızda təxminən bərabər paylanmış bir milyon qlobal nöqtəniz varsa və siz 100 km məsafədə axtarış etmək istəyirsinizsə, o zaman ilk (sürətli) axtarışınız 10000 kv km sahədədir və yəqin ki, təxminən 20 nəticə verəcəkdir (eyni zamanda bərabər paylanma əsasında). səth sahəsi təxminən 500M kv km), bu o deməkdir ki, siz bu sorğu üçün bir milyon dəfə əvəzinə 20 dəfə kompleks məsafə hesablamasını yerinə yetirirsiniz.

    • 21

      Nümunədə kiçik bir səhv… kvadratımızın “radiusuna” baxdığımız üçün bu, 50 km (100 deyil) üçün olardı.

      • 22

        Fantastik məsləhət! Mən əslində daxili kvadratı çəkən funksiyanı və sonra qalan nöqtələri daxil etmək və xaric etmək üçün perimetr ətrafında “kvadratlar” yaradan rekursiv funksiyanı yazan bir tərtibatçı ilə işlədim. Nəticə inanılmaz sürətli nəticə oldu - o, milyonlarla balları mikrosaniyələrdə qiymətləndirə bildi.

        Yuxarıdakı yanaşmam mütləq “xamdır”, lakin bacarıqlıdır. Bir daha təşəkkürlər!

        • 23

          Doug,

          Mən uzun nöqtənin çoxbucaqlı daxilində olub olmadığını qiymətləndirmək üçün mysql və php-dən istifadə etməyə çalışıram. Tərtibatçı dostunuzun bu tapşırığı yerinə yetirmək üçün hər hansı bir nümunə dərc etdiyini bilirsinizmi? Və ya yaxşı nümunələr bilirsiniz. Əvvəlcədən təşəkkürlər.

  16. 24

    Hamıya salam bu mənim SQL testimdir:

    SELECT DISTINCT area_id, (
    (
    (
    acos( sin( ( 13.65 * pi( ) /180 ) ) * sin( (
    `lat_dec` * pi( ) /180 ) ) + cos( ( 13.65 * pi( ) /180 ) ) * cos( (
    `lat_dec` * pi( ) /180 )
    ) * cos( (
    ( 51.02 - `lon_dec` ) * pi( ) /180 )
    )
    )
    ) *180 / pi( )
    ) *60 * 1.1515 * 1.609344
    ) AS distance
    FROM `post_codes` WHERE distance <= 50

    və Mysql mənə deyir ki, bu məsafə sütun kimi mövcud deyil, mən sifarişdən istifadə edə bilərəm, HARƏS olmadan edə bilərəm və işləyir, amma onunla deyil...

  17. 26

    Bu əladır, lakin quşların uçması kimidir. Fərqli nəqliyyat formasından istifadə edərək fikir vermək üçün Google Maps API-ni hər hansı bir şəkildə (bəlkə də yollardan istifadə etməklə və s.) sınamaq və əlavə etmək əla olardı. Mən hələ də PHP-də səyyar satıcı probleminə səmərəli həll təklif edə biləcək simulyasiya edilmiş yumşalma funksiyası etməliyəm. Ancaq düşünürəm ki, bunu etmək üçün kodunuzdan bəzilərini təkrar istifadə edə bilərəm.

  18. 27

    Salam Douglas,
    bu məqaləyə görə çox sağ olun - sadəcə mənə çox vaxt qənaət etdiniz.
    özündən müğayət ol,
    nimrod @İsrail

  19. 28

    Yaxşı məqalə! İki nöqtə arasındakı məsafəni necə hesablamağı təsvir edən bir çox məqalə tapdım, lakin həqiqətən SQL parçasını axtarırdım.

  20. 29
  21. 30
  22. 31
  23. 32
  24. 36

    Problemimi həll edən bu səhifəni tapmaq üçün 2 günlük araşdırma. Deyəsən, daha yaxşı WolframAlpha-mı çıxarıb riyaziyyatımı təzələyim. WHERE-dən HAVING-ə dəyişiklik mənim skriptim işlək vəziyyətdədir. ÇOX SAĞ OL

  25. 37
    • 38

      Təşəkkürlər Georgi. "məsafə" sütunu tapılmadı. Bir dəfə mən HARAYI dəyişdirdim, o, cazibədar kimi işləyirdi!

  26. 39

    Kaş ki, bu barədə tapdığım ilk səhifə bu olsun. Çoxlu müxtəlif əmrləri sınadıqdan sonra bu, düzgün işləmək üçün yeganə idi və öz verilənlər bazama uyğunlaşmaq üçün minimal dəyişikliklər tələb olundu.
    Thanks a lot!

  27. 40

    Kaş ki, bu barədə tapdığım ilk səhifə bu olsun. Çoxlu müxtəlif əmrləri sınadıqdan sonra bu, düzgün işləmək üçün yeganə idi və öz verilənlər bazama uyğunlaşmaq üçün minimal dəyişikliklər tələb olundu.
    Thanks a lot!

  28. 41
  29. 42
  30. 43
  31. 45
  32. 46
  33. 47

    Bu düsturun işlədiyini bilirəm, amma yerin radiusunun harada nəzərə alındığını görə bilmirəm. Kimsə məni maarifləndirə bilər, zəhmət olmasa?

  34. 49
  35. 50
  36. 52

    Təşəkkür edirəm Duqlas, SQL Sorğusu mənə lazım olan şeydir və düşündüm ki, onu özüm yazmalıyam. Siz məni bəlkə də saatlarla enlik uzunluğu öyrənmə əyrisindən xilas etdiniz!

  37. 53
  38. 55
  39. 56

    Duqlas, bu heyrətamiz kod üçün təşəkkür edirəm. GPS icma portalımda bunu necə edəcəyim barədə başımı sındırdım. Mənə saatlara qənaət etdin.

  40. 58

    bu faydalı məqaləni dərc etdiyiniz üçün təşəkkür edirik,  
    amma nədənsə soruşmaq istərdim
    mysql db daxilindəki kordlar ilə istifadəçi tərəfindən php-yə daxil edilən kordlar arasındakı məsafəni necə əldə etmək olar?
    daha aydın təsvir etmək üçün:
    1.istifadəçi db-dən və istifadəçinin özünün koordinatlarından müəyyən edilmiş məlumatları seçmək üçün [id] daxil etməlidir
    2. php faylı [id] istifadə edərək hədəf verilənləri (koordları) alır və sonra istifadəçi ilə hədəf nöqtəsi arasındakı məsafəni hesablayır

    və ya sadəcə aşağıdakı koddan məsafə əldə edə bilərsiniz?

    $qry = “SEÇİN *,(((acos(sin((“.$enlem."*pi()/180)) * sin((`Enlem`*pi()/180))+cos((". $enlem.”*pi()/180)) * cos((`Enlem`*pi()/180)) * cos(((“.$ Boylam.”- `Enlem`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) `Mənim Cədvəlim`DƏN məsafə kimi HARƏDƏ məsafə >= “.$distance.” >>>>Mən buradan məsafəni “çıxara” bilərəmmi?
    Bir daha təşəkkürlər,
    Timmy S

    • 59

      ağlıma gəlmir, mən “funksiya”nın php-də necə işlədiyini başa düşdüm
      $dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
      çox təşəkkür edirəm !! 

  41. 60

    ok, sınadığım hər şey işləmir. Demək istədiyim şeylər işləyir, amma məsafələr çox uzaqdır.

    Hər kəs bu kodun nə olduğunu görə bilərmi?

    if(isset($_POST['göndərildi'])){ $z = $_POST['poçt kodu']; $r = $_POST['radius']; echo ““.$z üçün nəticələr; $sql = mysql_query(“SEÇ DISTINCT m.zipcode, m.MktName,m.LocAddSt,m.LocAddCity,m.LocAddState,m.x1,m.y1,m.verified,z1.lat,z2.lon,z1. şəhər,z1.state FROM mrk m, zip z1, zip z2 HARADA m.zipcode = z1.zipcode VƏ z2.zipcode = $z AND (3963 * acos( truncate( sin( z2.lat / 57.2958 ) .) * sin(m) y1 / 57.2958 ) + cos( z2.lat / 57.2958 ) * cos( m.y1 / 57.2958 ) * cos( m.x1 / 57.2958 – z2.lon / 57.2958 ) , 8 <) = ölür )" (mysql_error()); while($row = mysql_fetch_array( $sql )) { $store1 = $row['MktName']."”; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].", ".$row['LocAddState']." “.$sətir['poçt kodu']; $enlem1 = $sətir['lat']; $longitude1 = $row['lon']; $enlem2 = $sətir['y1']; $longitude2 = $row['x1']; $city = $row['city']; $state = $row['state']; $dis = getnew($enlem1, $uzunluq1, $enlem2, $uzunluk2, $vahid = 'Mi'); // $dis = məsafə($lat1, $lon1, $lat2, $lon2); $verified = $row['verified']; if($verified == '1'){ echo “”; echo “”.$mağaza.””; echo $dis . " kilometrlərlə uzaqda"; əks-səda “”; } else { echo “”.$store.””; echo $dis . " kilometrlərlə uzaqda"; əks-səda “”; } }}

    my functions.php kodu
    funksiya getnew($enlem1, $enlem1, $enlem2, $uzunluq2, $vahid = 'Mi') { $theta = $uzunluk1 – $boylam2; $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)) ); $distance = acos($distance); $distance = rad2deg($distance); $məsafə = $məsafə * 60 * 1.1515; switch($unit) { case 'Mi': break; hal 'Km' : $məsafə = $məsafə * 1.609344; } qaytarma (round($distance,2)); }

    Əvvəlcədən təşəkkür edirik

  42. 61
  43. 62

    Salam Duqlas, əla məqalə. Coğrafi anlayışlar və kod haqqında izahatınızı həqiqətən maraqlı tapdım. Yeganə təklifim, boşluq qoymaq və ekran üçün kodu daxil etmək olardı (məsələn, Stackoverflow kimi). Mən başa düşürəm ki, siz məkana qənaət etmək istəyirsiniz, lakin adi kod intervalı/absorbsiya mənim üçün bir proqramçı kimi oxumağı və tədqiq etməyi çox asanlaşdıracaq. Hər halda, bu kiçik bir şeydir. Böyük işə davam edin.

  44. 64
  45. 65

    burada funksiya ilə işləyərkən bir növ məsafə əldə edirik..sorğudan istifadə edərkən onun başqa bir məsafə növü gəlir

  46. 66
  47. 67
  48. 68
  49. 69
  50. 70

    Seçimdə düsturdan iki dəfə istifadə etmək daha sürətli görünür (mysql 5.9) və burada:
    $formula = “(((acos(sin((“.$enlem."*pi()/180)) * sin((`Enlem`*pi()/180))+cos((".$enlem. ”*pi()/180)) * cos((`Enlem`*pi()/180)) * cos(((“.$ Boylam.”- ` Boylam`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
    $sql = 'SEÇİN *, '.$formula.' Cədvəldən məsafə kimi '..$formula.' <= '.$distance;

  51. 71
  52. 72

    Bu məqaləni kəsdiyiniz üçün çox sağ olun. çox faydalıdır.
    PHP əvvəlcə “Şəxsi Əsas Səhifə” adlı sadə skript platforması kimi yaradılmışdır. Hal-hazırda PHP (Hypertext Preprocessor üçün qısa) Microsoft-un Active Server Pages (ASP) texnologiyasına alternativdir.

    PHP dinamik veb səhifələr yaratmaq üçün istifadə olunan açıq mənbəli server tərəfi dilidir. HTML-ə daxil edilə bilər. PHP adətən Linux/UNIX veb serverlərində MySQL verilənlər bazası ilə birlikdə istifadə olunur. Bu, yəqin ki, ən populyar skript dilidir.

  53. 73

    Yuxarıdakı həllin düzgün işləmədiyini gördüm.
    Mən dəyişməliyəm:

    $qqq = “SEÇİN *,(((acos(sin((“.$enlem.”*pi()/180)) * sin((`latt`*pi()/180))+cos((" . $enlem . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((" . $uzunluq . "- `uzunq`)*pi()/180) )))*180/pi())*60*1.1515) `qeydiyyatdan` məsafə kimi “;

  54. 75
  55. 76

    Salam, zəhmət olmasa, bu barədə sizin köməyinizə çox ehtiyacım olacaq.

    Veb serverimə get sorğusu göndərdim http://localhost:8000/users/findusers/53.47792/-2.23389/20/
    53.47792 = $enlem
    -2.23389 = $uzunluq
    və 20 = almaq istədiyim məsafə

    Bununla belə, sizin düsturunuzdan istifadə edərək, db-dəki bütün sətirləri alır

    $nəticələr = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$enlem."*pi()/180)) * sin((lat*pi()/180) ))+cos((“.$enlem.”*pi()/180)) * cos((lat*pi()/180)) * cos(((“.$uzunluq.”- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) məsafəyə malik olan markerlərdən məsafə olaraq >= “.$distance ));

    [{“id”:1,”name”:”Frankie Johnnie & Luigo Too”,”ünvan”:”939 W El Camino Real, Mountain View, CA”,”lat”:37.386337280273,”lng”:-122.08582305908, ”distance”:16079.294719663},{“id”:2,”name”:”Amici's East Coast Pizzeria”,”ünvan”:”790 Castro St, Mountain View, CA”,”lat”:37.387138366699,”lng”: -122.08323669434,”distance”:16079.175940152},{“id”:3,”name”:”Kapp's Pizza Bar & Grill”,”ünvan”:”191 Castro St, Mountain View, CA”,”lat”:37.393886566162 ”lng”:-122.07891845703,”distance”:16078.381373826},{“id”:4,”name”:”Round Table Pizza: Mountain View”,”ünvan”:”570 N Shoreline Blvd, Mountain View, CA”, ”lat”:37.402652740479,”lng”:-122.07935333252,”distance”:16077.420540582},{“id”:5,”name”:”Tony & Alba's Pizza & Pasta”,”ünvan”:”Alave Escu View, CA”,”lat”:619,”lng”:-37.394012451172,”distance”:122.09552764893},{“id”:16078.563225154,”name”:”Oregano's Wood-Fired Pizza”,”6”: Ünvan El Camino Real, Los Altos, CA”,”lat”:4546,”lng”:-37.401725769043,”distance”:122.11464691162},{“ id”:16077.937560795,”name”:”The bars and grills”,”ünvan”:”7 Whiteley Street, Manchester”,”lat”:24,”lng”:-53.485118865967,”distance”:2.1828699111938}]

    Mən yalnız 20 mil olan cərgələri əldə etmək istəyirəm, lakin bu, bütün cərgələri gətirir. Xahiş edirəm nəyi səhv edirəm

  56. 77

    Mən oxşar sorğu axtarıram, lakin bir az artırdım – bir sözlə, bu, bütün koordinatları hər bir koordinatdan 2 mil məsafədə qruplaşdırmaq və sonra hər qrupda neçə koordinatı hesablamaq və ən çox koordinata malik olan yalnız bir qrupu çıxarmaqdır – hətta ən çox koordinatları olan qruplar arasında birdən çox qrupunuz var – sadəcə olaraq eyni sayda qruplardan təsadüfi qrupu çıxarın –

Siz nə düşünürsünüz?

Bu sayt spam azaldılması üçün Akismet istifadə edir. Yorumunuzun necə işləndiyini öyrənin.