Haversine Formülünü Kullanarak Enlem ve Boylam Noktaları Arasındaki Büyük Daire Mesafesini Hesaplayın veya Sorgulayın (PHP, Python, MySQL, MSSQL Örnekleri)

Haversine Formülü - Büyük Daire Mesafesi - PHP, Python, MySQL

Bu ay PHP ve MySQL'de CBS ile ilgili olarak epeyce programlama yapıyorum. İnternette gezinirken, aslında bazılarını bulmakta zorlandım. Coğrafi hesaplamalar iki konum arasındaki mesafeyi bulmak için onları burada paylaşmak istedim.

Büyük Daire Mesafeli Avrupa Uçuş Haritası

İki nokta arasındaki mesafeyi hesaplamanın basit yolu, bir üçgenin hipotenüsünü hesaplamak için Pisagor formülünü kullanmaktır (A² + B² = C²). Bu, Öklid mesafesi.

Bu ilginç bir başlangıç ​​ancak Coğrafya için geçerli değil çünkü enlem ve boylam çizgileri arasındaki mesafe eşit mesafeler değil ayrı. Ekvatora yaklaştıkça enlem çizgileri birbirinden uzaklaşır. Bir çeşit basit nirengi denklemi kullanırsanız, bir konumda mesafeyi doğru bir şekilde ölçebilir ve diğerinde Dünya'nın eğriliği nedeniyle son derece yanlış olabilir.

Büyük Daire Mesafesi

Dünya çevresinde uzun mesafeler kat edilen rotalar, Büyük Daire Mesafesi. Yani… bir küre üzerindeki iki nokta arasındaki en kısa mesafe, düz bir haritadaki noktalardan farklıdır. Bunu enlem ve boylam çizgilerinin eşit uzaklıkta olmadığı gerçeğiyle birleştirin… ve zor bir hesaplamanız var.

İşte Harika Çevreler'in nasıl çalıştığına dair harika bir video açıklaması.

Haversine Formülü

Dünyanın eğriliğini kullanan mesafe, Haversine formülü, dünyanın eğriliğine izin vermek için trigonometri kullanan. Dünyadaki 2 yer arasındaki mesafeyi bulduğunuzda (karga uçarken), düz bir çizgi gerçekten bir yaydır.

Bu, hava uçuşunda geçerlidir - uçuşların gerçek haritasına hiç baktınız ve kavisli olduklarını fark ettiniz mi? Bunun nedeni, doğrudan konuma göre iki nokta arasında bir kemerde uçmanın daha kısa olmasıdır.

PHP: 2 Enlem ve Boylam Noktası Arasındaki Mesafeyi Hesaplayın

İşte iki nokta arasındaki mesafeyi hesaplamak için kullanılan PHP formülü (Mil ve Kilometre dönüşümü ile birlikte) iki ondalık basamağa yuvarlanmıştır.

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)); 
}

Değişkenler şunlardır:

  • $Enlem1 – ilk konumunuzun enlemi için bir değişken.
  • $Boylam1 – ilk konumunuzun boylamı için bir değişken
  • $Enlem2 – ikinci konumunuzun enlemi için bir değişken.
  • $Boylam2 – ikinci konumunuzun boylamı için bir değişken.
  • $birim - varsayılan varlık mil. Bu güncellenebilir veya şu şekilde iletilebilir: kilometre.

Python: 2 Enlem ve Boylam Noktası Arasındaki Mesafeyi Hesaplayın

Her neyse, işte iki nokta arasındaki mesafeyi hesaplamak için Python formülü (Mil ve Kilometre dönüşümüyle birlikte) iki ondalık basamağa yuvarlanmış. Veri Bilimcisi olan oğlum Bill Karr'a teşekkür ederiz. OpenINSIGHTS, kod için.

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)

Değişkenler şunlardır:

  • enlem1 – ilk konumunuz için bir değişken enlem.
  • boylam1 – ilk konumunuz için bir değişken boylam
  • enlem2 – ikinci konumunuz için bir değişken enlem.
  • boylam2 – ikinci konumunuz için bir değişken boylam.
  • birim - varsayılan varlık mil. Bu güncellenebilir veya şu şekilde iletilebilir: kilometre.

MySQL: Enlem ve Boylam Kullanarak Mil Olarak Mesafeyi Hesaplayarak Bir Aralık İçindeki Tüm Kayıtları Alma

Belirli bir mesafedeki tüm kayıtları bulmak için bir hesaplama yapmak için SQL kullanmak da mümkündür. Bu örnekte, $ enlem ve $ boylamdaki konumuma olan değişken $ distance (Mil cinsinden) değerine eşit veya daha az olan tüm kayıtları bulmak için MyTable'da MyTable'ı sorgulayacağım:

Belirli bir kayıt içindeki tüm kayıtları almak için sorgu mesafe iki enlem ve boylam noktası arasındaki mesafeyi mil cinsinden hesaplayarak:

$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 özelleştirmeniz gerekecek:

  • $ boylam - bu, noktanın boylamını geçtiğim bir PHP değişkenidir.
  • $ latitude - bu, noktanın boylamını geçtiğim bir PHP değişkenidir.
  • $ mesafe - bu, tüm kayıtları daha az veya eşit bulmak istediğiniz mesafedir.
  • tablo - bu tablo… bunu tablo adınızla değiştirmek isteyeceksiniz.
  • enlem - bu, enleminizin alanıdır.
  • boylam - bu, boylamınızın alanıdır.

MySQL: Enlem ve Boylam Kullanarak Kilometre Olarak Mesafeyi Hesaplayarak Bir Aralık İçindeki Tüm Kayıtları Alma

Ve işte MySQL'de kilometre kullanan SQL sorgusu:

$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 özelleştirmeniz gerekecek:

  • $ boylam - bu, noktanın boylamını geçtiğim bir PHP değişkenidir.
  • $ latitude - bu, noktanın boylamını geçtiğim bir PHP değişkenidir.
  • $ mesafe - bu, tüm kayıtları daha az veya eşit bulmak istediğiniz mesafedir.
  • tablo - bu tablo… bunu tablo adınızla değiştirmek isteyeceksiniz.
  • enlem - bu, enleminizin alanıdır.
  • boylam - bu, boylamınızın alanıdır.

Bu kodu, Kuzey Amerika'da 1,000'den fazla lokasyona sahip bir perakende satış mağazası için kullandığımız kurumsal bir harita platformunda kullandım ve çok güzel çalıştı.

Microsoft SQL Server Coğrafi Mesafesi: STDistance

Microsoft SQL Server kullanıyorsanız, kendi işlevlerini sunarlar, STMesafe Coğrafya veri türünü kullanarak iki nokta arasındaki mesafeyi hesaplamak için.

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);  

Başkan Yardımcısı ve Mimarı Manash Sahoo'ya şapka ipucu Highbridge.

77 Yorumlar

  1. 1

    Paylaşım için çok teşekkür ederim. Bu kolay bir kopyala ve yapıştır işiydi ve harika çalışıyor. Bana çok zaman kazandırdın.
    C'ye geçiş yapan herkes için FYI:
    çift ​​derece2rad(çift derece) { dönüş derecesi*(3.14159265358979323846/180.0); }

  2. 2

    Çok güzel bir gönderi - çok iyi çalıştı - sadece enlemesine tutan masanın adını değiştirmek zorunda kaldım. Oldukça hızlı çalışıyor. Makul sayıda lat-long'um var (< 400) ama bunun güzel bir şekilde ölçekleneceğini düşünüyorum. Ayrıca güzel bir site – onu del.icio.us hesabıma yeni ekledim ve düzenli olarak kontrol edeceğim.

  3. 4
  4. 5

    Bütün gün mesafe hesaplamaları için aradım ve harversine algoritmasını buldum, sql deyimine nasıl koyacağınızı örnek verdiğiniz için teşekkürler. Teşekkürler ve selamlar, Daniel

  5. 8

    SQL'inizin sahip bir ifadeye ihtiyacı olduğunu düşünüyorum.
    WHERE mesafesi <= $distance yerine yapmanız gerekebilir
    HAVING mesafesini kullan <= $mesafe

    aksi halde bana bir sürü zaman ve enerji kazandırdığın için teşekkürler.

  6. 10
  7. 11
  8. 12

    Bu kodu paylaştığınız için çok teşekkürler. Bana çok fazla geliştirme süresi kazandırdı. Ayrıca, MySQL 5.x için bir HAVING ifadesinin gerekli olduğunu belirttiğiniz için okuyucularınıza teşekkür ederiz. Çok yararlı.

  9. 14
  10. 15

    Merhaba,

    Başka bir soru. NMEA dizileri için aşağıdaki gibi bir formül var mı?

    1342.7500,N,10052.2287,E

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

    Teşekkürler,
    Harry

  11. 16

    Ayrıca WHERE'ın benim için çalışmadığını da buldum. HAVING olarak değiştirildi ve her şey mükemmel çalışıyor. İlk başta yorumları okumadım ve iç içe bir seçim kullanarak yeniden yazdım. Her ikisi de gayet iyi çalışacak.

  12. 17
  13. 18

    İnanılmaz yardımcı oldunuz, çok teşekkürler! “NEREDE” yerine yeni “HAVING” ile ilgili bazı problemler yaşıyordum, ancak buradaki yorumları okuduğumda (dişlerimi hayal kırıklığı içinde yaklaşık yarım saat gıcırdattıktan sonra =P), güzel bir şekilde çalışmasını sağladım. teşekkür ederim ^_^

  14. 19
  15. 20

    Bunun gibi seçkin bir ifadenin hesaplama açısından çok yoğun ve dolayısıyla yavaş olacağını unutmayın. Bu sorguların birçoğuna sahipseniz, işleri oldukça hızlı bir şekilde çıkmaza sokabilir.

    Çok daha az yoğun bir yaklaşım, hesaplanmış bir mesafe ile tanımlanan bir KARE alanı kullanarak bir ilk (kaba) seçim yapmaktır, yani "enlem 1 ile enlem2 arasında ve boylam boylam1 ile boylam2 arasında olduğu tablo adından * seçin". lat1 = hedef enlem – enlem, enlem2 = hedef enlem + enlem, boylam ile benzer. latdiff ~= mesafe / 111 (km için) veya 69 derece enlem ~ 1 km olduğundan mil için mesafe/111 (dünya hafifçe oval olduğundan, ancak bu amaç için yeterlidir). londiff = mesafe / (abs(cos(deg2rad(latitude))*111)) — veya mil için 69 (değişiklikleri hesaba katmak için aslında biraz daha büyük bir kare alabilirsiniz). Ardından bunun sonucunu alın ve radyal seçime besleyin. Sınır dışı koordinatları hesaba katmayı unutmayın - yani, kabul edilebilir boylam aralığı -180 ila +180 ve kabul edilebilir enlem aralığı -90 ila +90 - latdiff veya londiff'inizin bu aralığın dışında olması durumunda . Chukotka'nın bir bölümü ile alaska'nın bir bölümüyle kesişmesine rağmen, yalnızca pasifik okyanusu boyunca kutuptan kutba uzanan bir çizgi üzerindeki hesaplamaları etkilediği için çoğu durumda bunun geçerli olmayabileceğini unutmayın.

    Bununla başardığımız şey, bu hesaplamayı yaptığınız puanların sayısında önemli bir azalmadır. Veritabanında kabaca eşit olarak dağıtılmış bir milyon küresel noktanız varsa ve 100 km içinde arama yapmak istiyorsanız, o zaman ilk (hızlı) aramanız 10000 km20'lik bir alandadır ve muhtemelen yaklaşık 500 sonuç verecektir (eşit dağılıma dayalı olarak). yaklaşık 20 milyon km² yüzey alanı), bu, bu sorgu için bir milyon kez yerine XNUMX kez karmaşık mesafe hesaplaması yaptığınız anlamına gelir.

    • 21

      Örnekteki küçük bir hata… bu, karemizin “yarıçapına” baktığımız için 50 km (100 değil) içinde olacaktır.

      • 22

        Fantastik tavsiye! Aslında, iç kareyi çeken bir işlev yazan ve ardından kalan noktaları dahil etmek ve hariç tutmak için çevre çevresinde 'kareler' oluşturan özyinelemeli bir işlev yazan bir geliştiriciyle çalıştım. Sonuç inanılmaz derecede hızlıydı - milyonlarca noktayı mikrosaniyeler içinde değerlendirebiliyordu.

        Yukarıdaki yaklaşımım kesinlikle 'kaba' ama yetenekli. Tekrar teşekkürler!

        • 23

          Doug

          Uzun bir noktanın bir çokgen içinde olup olmadığını değerlendirmek için mysql ve php kullanmaya çalışıyorum. Geliştirici arkadaşınızın bu görevin nasıl gerçekleştirileceğine dair herhangi bir örnek yayınlayıp yayınlamadığını biliyor musunuz? Veya bildiğiniz güzel örnekler var mı? Şimdiden teşekkürler.

  16. 24

    Herkese merhaba, bu benim test SQL ifadem:

    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

    ve Mysql bana mesafenin bir sütun olarak olmadığını söylüyor, order by kullanabilirim, WHERE olmadan yapabilirim ve işe yarıyor ama onunla değil…

    • 25

      “NEREDE mesafesini” “HAVING mesafesi” ile değiştirin.
      Bir cazibe gibi çalışıyor, teşekkürler, Douglas!

  17. 26

    Bu harika, ancak tıpkı kuşların uçması gibi. google maps API'sini bir şekilde buna dahil etmeye çalışmak harika olurdu (belki yollar vb.) Sadece farklı bir ulaşım şekli kullanarak bir fikir vermek için. Hâlâ PHP'de gezgin satıcı sorununa etkili bir çözüm sunabilecek benzetilmiş bir tavlama işlevi yapmadım. Ancak bunu yapmak için kodunuzun bir kısmını yeniden kullanabileceğimi düşünüyorum.

  18. 27
  19. 28

    İyi makale! İki nokta arasındaki mesafeyi nasıl hesaplayacağımı açıklayan birçok makale buldum ama gerçekten SQL parçacığını arıyordum.

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

    Sonunda sorunumu çözen bu sayfayı bulmak için 2 günlük araştırma. Görünüşe göre WolframAlpha'mı bozup matematiğimi tazelesem iyi olacak. WHERE ile HAVING arasındaki değişiklik, komut dosyamı çalışır durumda tutuyor. TEŞEKKÜR EDERİM

  25. 37
    • 38

      Teşekkürler Georgi. Bulunamayan 'mesafe' sütununu almaya devam ettim. NEREDE'yi HAVING olarak değiştirdiğimde, bir cazibe gibi çalıştı!

  26. 39

    Keşke bu konuda bulduğum ilk sayfa bu olsaydı. Birçok farklı komutu denedikten sonra, düzgün çalışan tek komut buydu ve kendi veritabanıma uyması için gereken minimum değişiklikle.
    Çok teşekkürler!

  27. 40

    Keşke bu konuda bulduğum ilk sayfa bu olsaydı. Birçok farklı komutu denedikten sonra, düzgün çalışan tek komut buydu ve kendi veritabanıma uyması için gereken minimum değişiklikle.
    Çok teşekkürler!

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

    Bu formülün işe yaradığını biliyorum ama dünyanın yarıçapının nerede hesaba katıldığını göremiyorum. Biri beni aydınlatabilir mi lütfen?

  34. 49
  35. 50

    Harika şeyler Douglas. İki noktanın Long/Lat/Rulmanı verilen kesişme noktasını almayı denediniz mi?

  36. 52

    Teşekkürler Douglas, SQL Sorgusu tam olarak ihtiyacım olan şeydi ve kendim yazmam gerektiğini düşündüm. Beni muhtemelen saatlerce enlem boylam öğrenme eğrisinden kurtardın!

  37. 53
  38. 55

    Bu harika makale için teşekkür ederiz! Sadece DB'mdeki kodu test ettim ve harika çalıştı! 

  39. 56
  40. 58

    bu faydalı makaleyi yayınladığınız için teşekkürler,  
    ama nedense sormak istiyorum
    mysql db içindeki kodlar ile kullanıcı tarafından php'ye eklenen kodlar arasındaki mesafe nasıl elde edilir?
    daha net tarif için:
    1. kullanıcı, db'den ve kullanıcının kendi kodlarından belirtilen verileri seçmek için [id] girmelidir
    2.php dosyası [id] kullanarak hedef verileri (kodları) alır ve ardından kullanıcı ile hedef nokta arasındaki mesafeyi hesaplar

    ya da sadece aşağıdaki koddan mesafe alabilir misiniz?

    $qry = “SELECT *,((acos(sin((“.$latitude.”*pi()/180)) * sin((`Latitude`*pi()/180))+cos((“. $enlem.”*pi()/180)) * cos((`Enlem`*pi()/180)) * cos(((“.$boylam.”- `Boylam`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) 'MyTable' DAN uzaklık olarak WHERE Distance >= “.$distance.” >>>>uzaklığı buradan “çıkarabilir miyim”?
    Tekrar teşekkürler,
    Timmy S

  41. 60

    tamam, denediğim her şey çalışmıyor. Demek istediğim, sahip olduklarım işe yarıyor ama mesafeler çok uzak.

    Herhangi biri bu kodda neyin yanlış olduğunu görebilir mi?

    if(isset($_POST['gönderildi'])){ $z = $_POST['zipcode']; $r = $_POST['yarıçap']; echo ““.$z için sonuçlar; $sql = mysql_query(“DISTINCT SEÇ m.zipcode, m.MktName,m.LocAddSt,m.LocAddCity,m.LocAddState,m.x1,m.y1,m.verified,z1.lat,z2.lon,z1. city,z1.state FROM mrk m, zip z1, zip z2 NEREDE m.zipcode = z1.zipcode AND 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 ) ) ) <= $r ") veya ölür (mysql_error()); while($row = mysql_fetch_array( $sql )) { $store1 = $satır['MktName']."”; $mağaza = $satır['LocAddSt'].””; $store .= $row['LocAddCity'].”, “.$row['LocAddState'].” “.$satır['posta kodu']; $enlem1 = $satır['enlem']; $boylam1 = $satır['boylam']; $enlem2 = $satır['y1']; $boylam2 = $satır['x1']; $şehir = $satır['şehir']; $durum = $satır['durum']; $dis = getnew($enlem1, $boylam1, $enlem2, $boylam2, $birim = 'Mi'); // $dis = mesafe($lat1, $lon1, $lat2, $lon2); $doğrulandı = $satır['doğrulandı']; if($verified == '1'){ echo “”; echo “”.$mağaza.””; yankı $dis . " mil uzakta"; Eko ""; } başka { echo “”.$mağaza.””; yankı $dis . " mil uzakta"; Eko ""; } }}

    benim function.php kodum
    function getnew($enlem1, $boylam1, $enlem2, $boylam2, $birim = 'Mi') { $teta = $boylam1 – $boylam2; $mesafe = (günah(derece2rad($enlem1)) * günah(derece2rad($enlem2))) + (cos(deg2rad($enlem1)) * cos(deg2rad($enlem2)) * cos(deg2rad($enlem)) ); $mesafe = acos($mesafe); $mesafe = rad2derece($mesafe); $mesafe = $mesafe * 60 * 1.1515; switch($birim) { case 'Mi': break; durum 'Km' : $mesafe = $mesafe * 1.609344; } dönüş (yuvarlak($mesafe,2)); }

    Şimdiden teşekkürler

  42. 61
  43. 62

    Hey Douglas, harika bir makale. Coğrafi kavramlar ve kod hakkındaki açıklamanızı gerçekten ilginç buldum. Tek önerim, gösterim kodunu boşluk bırakmak ve girintilemek olacaktır (örneğin, Stackoverflow gibi). Yerden tasarruf etmek istediğinizi anlıyorum, ancak geleneksel kod aralığı/girinti, bir programcı olarak okumamı ve incelememi çok daha kolay hale getirecektir. Her neyse, bu küçük bir şey. Harika çalışmaya devam edin.

  44. 64
  45. 65
  46. 66
  47. 67
  48. 68
  49. 69
  50. 70

    Seçimde ve nerede formülü iki kez kullanmak daha hızlı (mysql 5.9) görünüyor:
    $formül = “((acos(sin((“.$latitude.”*pi()/180)) * sin((`Enlem`*pi()/180))+cos((“.$latitude. ”*pi()/180)) * cos((`Enlem`*pi()/180)) * cos(((“.$boylam.”- `Boylam`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
    $sql = 'SEÇ *, '.$formül.' WHERE tablosundan uzaklık olarak '..$formula.' <= '.$mesafe;

  51. 71
  52. 72

    Bu makaleyi kestiğiniz için çok teşekkürler. çok yardımcı oldu.
    PHP ilk başta “Kişisel Ana Sayfa” adı verilen basit bir komut dosyası platformu olarak oluşturuldu. Günümüzde PHP (Hypertext Preprocessor'ın kısaltması), Microsoft'un Active Server Pages (ASP) teknolojisinin bir alternatifidir.

    PHP, dinamik web sayfaları oluşturmak için kullanılan açık kaynaklı bir sunucu tarafı dilidir. HTML içine gömülebilir. PHP genellikle Linux/UNIX web sunucularında bir MySQL veritabanı ile birlikte kullanılır. Muhtemelen en popüler betik dilidir.

  53. 73

    Yukarıdaki çözümün düzgün çalışmadığını buldum.
    Şu şekilde değiştirmem gerekiyor:

    $qqq = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $enlem . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $boylam . “- `uzun`)*pi()/180) )))*180/pi())*60*1.1515) `kayıttan` uzaklık olarak “;

  54. 75

    teşekkür ederim efendim mükemmel çalıştı .. ama ondalık nokta olmadan çıktı almak istersem bir sorum var ne yapabilirim ..?

    Şimdiden teşekkürler.

  55. 76

    Merhaba, lütfen bu konuda gerçekten yardımınıza ihtiyacım olacak.

    Web sunucuma bir alma isteğinde bulundum http://localhost:8000/users/findusers/53.47792/-2.23389/20/
    53.47792 = $enlem
    -2.23389 = $boylam
    ve 20 = almak istediğim mesafe

    Ancak formülünüzü kullanarak, db'mdeki tüm satırları alır

    $sonuçlar = DB::select( DB::raw(“SELECT *,((acos(sin((“.$latitude.”*pi()/180))) * sin((lat*pi()/180) ))+cos((“.$enlem.”*pi()/180)) * cos((lat*pi()/180)) * cos(((“.$boylam.”- lng)*pi( )/180)))*180/pi())*60*1.1515*1.609344) işaretçilerden uzaklık olarak mesafe >= “.$mesafe ));

    [{“id”:1,”name”:”Frankie Johnnie & Luigo Too”,”adres”:”939 W El Camino Real, Mountain View, CA”,”lat”:37.386337280273,”lng”:-122.08582305908, ”mesafe”:16079.294719663},{“id”:2”name”:”Amici's East Coast Pizzeria””adres”:”790 Castro St, Mountain View, CA”””lat”:37.387138366699,”lng”: -122.08323669434”mesafe”:16079.175940152},{“id”:3”ad”:”Kapp's Pizza Bar & Grill””adres”:”191 Castro St, Mountain View, CA”””,lat”:37.393886566162, ”lng”:-122.07891845703,”mesafe”:16078.381373826},{“id”:4”name”:”Round Table Pizza: Mountain View”,”adres”:”570 N Shoreline Blvd, Mountain View, CA”, ”lat”:37.402652740479,”lng”:-122.07935333252”mesafe”:16077.420540582},{“id”:5”name”:”Tony & Alba's Pizza & Pasta”,”adres”:”619 Escuela Ave, Dağ View, CA”””lat”:37.394012451172””lng”:-122.09552764893”,mesafe”:16078.563225154},{“id”:6”name”:”Oregano's Wood-Fired Pizza””,”adres”:”4546 El Camino Real, Los Altos, CA”,”lat”:37.401725769043”,lng”:-122.11464691162”,mesafe”:16077.937560795},{“ id”:7”name”:”Barlar ve ızgaralar”,”adres”:”24 Whiteley Street, Manchester”,”lat”:53.485118865967,”lng”:-2.1828699111938,”mesafe”:8038.7620112314}]

    Sadece 20 millik satırları almak istiyorum ama tüm satırları getiriyor. lütfen neyi yanlış yapıyorum

  56. 77

    Benzer bir sorgu arıyorum ama biraz hızlandı - kısacası bu, her koordinatın 2 mil içindeki tüm koordinatları gruplamak ve ardından her grupta kaç koordinatı saymak ve en fazla koordinata sahip yalnızca bir grup çıktısı almaktır - en fazla koordinata sahip gruplar arasında birden fazla grubunuz var – aynı en büyük sayıya sahip gruplardan rastgele grubu çıkarmanız yeterlidir –

Ne düşünüyorsunuz?

Bu site spam'i azaltmak için Akismet'i kullanıyor. Yorum verilerinizin nasıl işlendiğini öğrenin.