PHP και SQL: Υπολογισμός ή ερώτηση Απόσταση μεγάλου κύκλου μεταξύ σημείων γεωγραφικού πλάτους και μήκους με τον τύπο Haversine

Haversine Formula - Υπολογίστε τη μεγάλη απόσταση του κύκλου με PHP ή MySQL

Αυτόν τον μήνα προγραμματίζω αρκετά για PHP και MySQL σε σχέση με το GIS Ψάχνοντας γύρω από το δίχτυ, πραγματικά δυσκολεύτηκα να βρω μερικά από τα Γεωγραφικοί υπολογισμοί για να βρω την απόσταση μεταξύ δύο τοποθεσιών, γι 'αυτό ήθελα να τις μοιραστώ εδώ.

Χάρτης πτήσης Ευρώπη με μεγάλη απόσταση κύκλου

Ο απλός τρόπος υπολογισμού μιας απόστασης μεταξύ δύο σημείων είναι η χρήση του Πυθαγόρειου τύπου για τον υπολογισμό της υποτελούς χρήσης ενός τριγώνου (A² + B² = C²). Αυτό είναι γνωστό ως Ευκλείδεια απόσταση.

Είναι μια ενδιαφέρουσα αρχή, αλλά δεν ισχύει για τη Γεωγραφία, καθώς η απόσταση μεταξύ των γραμμών γεωγραφικού πλάτους και μήκους είναι όχι ίση απόσταση χώρια. Καθώς πλησιάζετε στον ισημερινό, οι γραμμές του γεωγραφικού πλάτους απομακρύνονται περισσότερο. Εάν χρησιμοποιείτε κάποιο είδος απλής εξίσωσης τριγωνισμού, μπορεί να μετρήσει την απόσταση με ακρίβεια σε μια τοποθεσία και τρομερά λάθος στην άλλη, λόγω της καμπυλότητας της Γης.

Μεγάλη απόσταση κύκλου

Οι διαδρομές που διανύονται σε μεγάλες αποστάσεις γύρω από τη Γη είναι γνωστές ως Μεγάλη απόσταση κύκλου. Δηλαδή… η μικρότερη απόσταση μεταξύ δύο σημείων σε μια σφαίρα είναι διαφορετική από τα σημεία ενός επίπεδου χάρτη. Συνδυάστε το με το γεγονός ότι οι γραμμές γεωγραφικού πλάτους και μήκους δεν είναι ισοδύναμες… και έχετε έναν δύσκολο υπολογισμό.

Ακολουθεί μια φανταστική εξήγηση βίντεο για το πώς λειτουργούν οι Great Circles.

Η φόρμουλα Haversine

Η απόσταση που χρησιμοποιεί την καμπυλότητα της Γης ενσωματώνεται στο Haversine φόρμουλα, η οποία χρησιμοποιεί τριγωνομετρία για να επιτρέψει την καμπυλότητα της γης. Όταν βρίσκετε την απόσταση μεταξύ 2 θέσεων στη γη (καθώς το κοράκι πετά), μια ευθεία γραμμή είναι πραγματικά ένα τόξο.

Αυτό ισχύει για την αεροπορική πτήση - έχετε δει ποτέ τον πραγματικό χάρτη πτήσεων και έχετε παρατηρήσει ότι είναι αψιδωτές; Αυτό συμβαίνει επειδή είναι πιο σύντομο να πετάξετε σε μια καμάρα μεταξύ δύο σημείων παρά απευθείας στην τοποθεσία.

PHP: Υπολογίστε την απόσταση μεταξύ 2 σημείων γεωγραφικού πλάτους και μήκους

Τέλος πάντων, εδώ είναι ο τύπος PHP για τον υπολογισμό της απόστασης μεταξύ δύο σημείων (μαζί με τη μετατροπή μίλι έναντι χιλιομέτρου) που στρογγυλοποιείται σε δύο δεκαδικά ψηφία.

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

SQL: Ανάκτηση όλων των εγγραφών εντός εύρους με τον υπολογισμό της απόστασης σε μίλια χρησιμοποιώντας γεωγραφικό πλάτος και μήκος

Είναι επίσης δυνατό να χρησιμοποιήσετε το SQL για να κάνετε έναν υπολογισμό για να βρείτε όλες τις εγγραφές σε μια συγκεκριμένη απόσταση. Σε αυτό το παράδειγμα, θα ρωτήσω τον MyTable στη MySQL για να βρω όλες τις εγγραφές που είναι μικρότερες ή ίσες με τη μεταβλητή $ απόσταση (σε μίλια) στην τοποθεσία μου σε $ γεωγραφικό πλάτος και $ γεωγραφικό μήκος:

Το ερώτημα για την ανάκτηση όλων των εγγραφών μέσα σε ένα συγκεκριμένο απόσταση υπολογίζοντας την απόσταση σε μίλια μεταξύ δύο σημείων γεωγραφικού πλάτους και μήκους είναι:

$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."

Θα πρέπει να το προσαρμόσετε:

  • $ γεωγραφικό μήκος - αυτή είναι μια μεταβλητή PHP όπου περνάω το μήκος του σημείου.
  • $ γεωγραφικό πλάτος - αυτή είναι μια μεταβλητή PHP όπου περνάω το μήκος του σημείου.
  • $ απόσταση - αυτή είναι η απόσταση στην οποία θέλετε να βρείτε όλες τις εγγραφές λιγότερο ή ίσες.
  • τραπέζι - αυτός είναι ο πίνακας… θα θελήσετε να το αντικαταστήσετε με το όνομα του πίνακα σας.
  • γεωγραφικό πλάτος - αυτό είναι το πεδίο του γεωγραφικού πλάτους σας.
  • γεωγραφικό μήκος - αυτό είναι το πεδίο του γεωγραφικού μήκους σας.

SQL: Ανάκτηση όλων των εγγραφών εντός εύρους με τον υπολογισμό της απόστασης σε χιλιόμετρα χρησιμοποιώντας γεωγραφικό πλάτος και μήκος

Και εδώ είναι το ερώτημα SQL χρησιμοποιώντας χιλιόμετρα στη MySQL:

$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."

Θα πρέπει να το προσαρμόσετε:

  • $ γεωγραφικό μήκος - αυτή είναι μια μεταβλητή PHP όπου περνάω το μήκος του σημείου.
  • $ γεωγραφικό πλάτος - αυτή είναι μια μεταβλητή PHP όπου περνάω το μήκος του σημείου.
  • $ απόσταση - αυτή είναι η απόσταση στην οποία θέλετε να βρείτε όλες τις εγγραφές λιγότερο ή ίσες.
  • τραπέζι - αυτός είναι ο πίνακας… θα θελήσετε να το αντικαταστήσετε με το όνομα του πίνακα σας.
  • γεωγραφικό πλάτος - αυτό είναι το πεδίο του γεωγραφικού πλάτους σας.
  • γεωγραφικό μήκος - αυτό είναι το πεδίο του γεωγραφικού μήκους σας.

Χρησιμοποίησα αυτόν τον κωδικό σε μια πλατφόρμα χαρτογράφησης επιχειρήσεων που χρησιμοποιήσαμε για ένα κατάστημα λιανικής με πάνω από 1,000 τοποθεσίες σε όλη τη Βόρεια Αμερική και λειτούργησε όμορφα.

77 Σχόλια

  1. 1

    Ευχαριστώ πολύ για την κοινή χρήση. Αυτή ήταν μια εύκολη εργασία αντιγραφής και επικόλλησης και λειτουργεί τέλεια. Με έχεις σώσει πολύ χρόνο.
    FYI για όποιον μεταφέρει στο C:
    διπλό deg2rad (διπλό deg) {return deg * (3.14159265358979323846 / 180.0); }

  2. 2

    Πολύ ωραίο κομμάτι απόσπασης - λειτούργησε πολύ ωραίο - Έπρεπε μόνο να αλλάξω το όνομα του τραπεζιού που κρατάει το lat-long. Λειτουργεί πολύ γρήγορα .. Έχω έναν αρκετά μικρό αριθμό lat-long (<400), αλλά νομίζω ότι αυτό θα κλιμακωθεί ωραία. Πολύ καλός ιστότοπος - μόλις τον πρόσθεσα στον λογαριασμό μου στο del.icio.us και θα ελέγχω ξανά τακτικά.

  3. 4
  4. 5

    Έψαξα όλη την ημέρα για υπολογισμούς απόστασης και βρήκα τον αλγόριθμο harversine, ευχαριστώ που δώσατε το παράδειγμα για το πώς να το βάλετε σε μια δήλωση sql. Ευχαριστώ και χαιρετά, Ντάνιελ

  5. 8

    Νομίζω ότι το SQL σας χρειάζεται δήλωση.
    αντί για WHERE απόσταση <= απόσταση $ που ίσως χρειαστεί
    χρησιμοποιήστε HAVING απόσταση <= $ απόσταση

    αλλιώς ευχαριστώ που με έσωσε ένα σωρό χρόνο και ενέργεια.

  6. 10
  7. 11
  8. 12

    Ευχαριστώ πολύ για την κοινή χρήση αυτού του κώδικα. Μου έσωσε πολύ χρόνο ανάπτυξης. Επίσης, ευχαριστούμε τους αναγνώστες σας που επεσήμαναν ότι είναι απαραίτητη μια δήλωση HAVING για το MySQL 5.x. Πολύ χρήσιμο.

  9. 14

    Η παραπάνω φόρμουλα με εξοικονομεί πολύ χρόνο. Ευχαριστώ πολύ.
    Πρέπει επίσης να κάνω εναλλαγή μεταξύ της μορφής NMEA και των βαθμών. Βρήκα έναν τύπο σε αυτήν τη διεύθυνση URL στο κάτω μέρος της σελίδας. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html

    Ξέρει κανείς πώς να το επαληθεύσει αυτό;

    Ευχαριστώ!
    Βασανίζω

  10. 15
  11. 16

    Βρήκα επίσης ότι ΔΕΝ λειτούργησε για μένα. Το άλλαξε σε HAVING και όλα λειτουργούν τέλεια. Στην αρχή δεν διάβασα τα σχόλια και τα ξαναγράψαμε χρησιμοποιώντας ένθετη επιλογή. Και τα δύο θα λειτουργούν καλά.

  12. 17
  13. 18

    Απίστευτα χρήσιμο, σας ευχαριστώ πολύ! Είχα κάποια προβλήματα με το νέο "HAVING", παρά το "WHERE", αλλά μόλις διάβασα τα σχόλια εδώ (μετά από περίπου μισή ώρα που αλέθω τα δόντια μου με απογοήτευση = P), το έκανα να λειτουργεί καλά. Ευχαριστώ ^ _ ^

  14. 19
  15. 20

    Λάβετε υπόψη ότι μια συγκεκριμένη δήλωση όπως αυτή θα είναι πολύ υπολογιστική και συνεπώς αργή. Εάν έχετε πολλά από αυτά τα ερωτήματα, μπορεί να εμποδίσει τα πράγματα αρκετά γρήγορα.

    Μια πολύ λιγότερο έντονη προσέγγιση είναι να εκτελέσετε μια πρώτη (ακατέργαστη) επιλογή χρησιμοποιώντας μια περιοχή SQUARE που ορίζεται από μια υπολογισμένη απόσταση, π.χ. lat1 = targetlatitude - latdiff, lat2 = targetlatitude + latdiff, παρόμοιο με το lon. latdiff ~ = απόσταση / 1 (για χιλιόμετρα), ή απόσταση / 2 για μίλια, αφού 1 βαθμός γεωγραφικού πλάτους είναι ~ 2 χιλιόμετρα (ελαφρά διακύμανση αφού η γη είναι ελαφρώς οβάλ, αλλά επαρκής για το σκοπό αυτό). londiff = απόσταση / (abs (cos (deg111rad (γεωγραφικό πλάτος)) * 69)) - ή 1 για μίλια (μπορείτε πραγματικά να πάρετε ένα ελαφρώς μεγαλύτερο τετράγωνο για να λάβετε υπόψη τις παραλλαγές). Στη συνέχεια, πάρτε το αποτέλεσμα και τροφοδοτήστε το στην ακτινική επιλογή. Απλά μην ξεχάσετε να λάβετε υπόψη τις εκτός συνόρων συντεταγμένες - δηλαδή το εύρος του αποδεκτού γεωγραφικού μήκους είναι -111 έως +2 και το εύρος του αποδεκτού πλάτους είναι -111 έως +69 - σε περίπτωση που ο latdiff ή ο londiff σας εκτελείται εκτός αυτού του εύρους . Σημειώστε ότι στις περισσότερες περιπτώσεις αυτό μπορεί να μην ισχύει, καθώς επηρεάζει μόνο τους υπολογισμούς πάνω από μια γραμμή μέσω του Ειρηνικού Ωκεανού από πόλο σε πόλο, αν και τέμνει μέρος του chukotka και μέρος της Αλάσκας.

    Αυτό που επιτυγχάνουμε με αυτό είναι μια σημαντική μείωση του αριθμού των βαθμών έναντι των οποίων κάνετε αυτόν τον υπολογισμό. Εάν έχετε ένα εκατομμύριο παγκόσμια σημεία στη βάση δεδομένων, κατανεμημένα σχεδόν ομοιόμορφα και θέλετε να πραγματοποιήσετε αναζήτηση εντός 100 χιλιομέτρων, τότε η πρώτη (γρήγορη) αναζήτηση έχει έκταση 10000 τετραγωνικά χιλιόμετρα και πιθανότατα θα αποφέρει περίπου 20 αποτελέσματα (με βάση την ομοιόμορφη κατανομή σε ένα εμβαδόν περίπου 500M sq km), που σημαίνει ότι εκτελείτε τον περίπλοκο υπολογισμό απόστασης 20 φορές για αυτό το ερώτημα αντί για ένα εκατομμύριο φορές.

    • 21

      Μικρό λάθος στο παράδειγμα… αυτό θα ήταν σε απόσταση 50 χλμ (όχι 100), αφού κοιτάζουμε την «ακτίνα» της… πλατείας μας.

      • 22

        Φανταστική συμβουλή! Δούλευα στην πραγματικότητα με έναν προγραμματιστή που έγραψε μια συνάρτηση που τράβηξε το εσωτερικό τετράγωνο και στη συνέχεια μια αναδρομική συνάρτηση που έκανε «τετράγωνα» γύρω από την περίμετρο να συμπεριλάβει και να αποκλείσει τα υπόλοιπα σημεία. Το αποτέλεσμα ήταν ένα απίστευτα γρήγορο αποτέλεσμα - μπορούσε να αξιολογήσει εκατομμύρια βαθμούς σε μικροδευτερόλεπτα.

        Η προσέγγισή μου παραπάνω είναι σίγουρα «ακατέργαστη» αλλά ικανή. Ευχαριστώ και πάλι!

        • 23

          Ντουγκ,

          Προσπάθησα να χρησιμοποιήσω το mysql και το php για να αξιολογήσω εάν ένα μεγάλο μήκος βρίσκεται εντός ενός πολυγώνου. Γνωρίζετε εάν ο φίλος του προγραμματιστή δημοσίευσε παραδείγματα σχετικά με τον τρόπο εκτέλεσης αυτής της εργασίας. Ή γνωρίζετε καλά παραδείγματα. Ευχαριστώ εκ των προτέρων.

  16. 24

    Γεια σε όλους, αυτή είναι η δοκιμαστική μου δήλωση SQL:

    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

    και ο Mysql μου λέει ότι η απόσταση, δεν υπάρχει ως στήλη, μπορώ να χρησιμοποιήσω την παραγγελία, μπορώ να το κάνω χωρίς ΠΟΥ, και λειτουργεί, αλλά όχι με αυτό ...

  17. 26

    Αυτό είναι υπέροχο, ωστόσο είναι ακριβώς όπως πετούν τα πουλιά. Θα ήταν υπέροχο να δοκιμάσετε και να ενσωματώσετε το API χαρτών google σε αυτό με κάποιο τρόπο (ίσως χρησιμοποιώντας δρόμους κ.λπ.) Απλώς για να δώσετε μια ιδέα χρησιμοποιώντας μια διαφορετική μορφή μεταφοράς. Δεν έχω ακόμη κάνει μια προσομοιωμένη λειτουργία ανόπτησης στην PHP που θα μπορούσε να προσφέρει μια αποτελεσματική λύση στο πρόβλημα του ταξιδιώτη πωλητή. Πιστεύω όμως ότι ενδέχεται να μπορέσω να επαναχρησιμοποιήσω μέρος του κωδικού σας για να το κάνω.

  18. 27
  19. 28

    Καλό άρθρο! Βρήκα πολλά άρθρα που περιγράφουν πώς να υπολογίσω την απόσταση μεταξύ δύο σημείων, αλλά πραγματικά έψαχνα για το απόσπασμα SQL.

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

    2 ημέρες έρευνας για να βρω επιτέλους αυτή τη σελίδα που λύνει το πρόβλημά μου. Φαίνεται ότι αποβάλλω καλύτερα το WolframAlpha μου και συνεχίζω τα μαθηματικά μου. Η αλλαγή από WHERE σε HAVING έχει το σενάριό μου σε κατάσταση λειτουργίας. ΣΑΣ ΕΥΧΑΡΙΣΤΩ

  25. 37
    • 38

      Ευχαριστώ Georgi. Έβγαλα τη στήλη «απόσταση» που δεν βρέθηκε. Μόλις αλλάξω το ΠΟΥ ΕΧΕΙ ΕΧΕΙ λειτουργεί σαν γοητεία!

  26. 39

    Μακάρι να ήταν αυτή η πρώτη σελίδα που βρήκα σε αυτό. Μετά από να δοκιμάσω πολλές διαφορετικές εντολές, αυτή ήταν η μόνη που μπορούσε να λειτουργήσει σωστά και με ελάχιστες αλλαγές που απαιτούνται για να χωρέσει στη δική μου βάση δεδομένων.
    Thanks a lot!

  27. 40

    Μακάρι να ήταν αυτή η πρώτη σελίδα που βρήκα σε αυτό. Μετά από να δοκιμάσω πολλές διαφορετικές εντολές, αυτή ήταν η μόνη που μπορούσε να λειτουργήσει σωστά και με ελάχιστες αλλαγές που απαιτούνται για να χωρέσει στη δική μου βάση δεδομένων.
    Thanks a lot!

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

    Γνωρίζω ότι αυτός ο τύπος λειτουργεί, αλλά δεν μπορώ να δω πού λαμβάνεται υπόψη η ακτίνα της γης. Μπορεί κάποιος να με διαφωτίσει, σε παρακαλώ;

  34. 49
  35. 50
  36. 52

    Σας ευχαριστώ Ντάγκλας, το ερώτημα SQL είναι ακριβώς αυτό που χρειαζόμουν και σκέφτηκα ότι θα έπρεπε να το γράψω μόνος μου. Με έχετε σώσει από πιθανές ώρες καμπύλης εκμάθησης γεωγραφικού μήκους γεωγραφικού πλάτους!

  37. 53
  38. 55
  39. 56

    Ντάγκλας, σας ευχαριστώ για αυτόν τον καταπληκτικό κωδικό. Έφτασα στο μυαλό μου πώς να το κάνω αυτό στην πύλη κοινότητας GPS. Με έσωσες ώρες.

  40. 58

    ευχαριστώ που δημοσιεύσατε αυτό το χρήσιμο άρθρο,  
    αλλά για κάποιο λόγο θα ήθελα να ρωτήσω
    πώς να αποκτήσετε την απόσταση μεταξύ των συνόρων στο mysql db και των συνόρων που έχουν εισαχθεί στο php από τον χρήστη;
    για πιο σαφή περιγραφή:
    1. ο χρήστης πρέπει να εισαγάγει [id] για την επιλογή συγκεκριμένων δεδομένων από το db και τα ίδια τα καλώδια του χρήστη
    2. το αρχείο php λαμβάνει τα δεδομένα προορισμού (coords) χρησιμοποιώντας το [id] και μετά υπολογίζει την απόσταση μεταξύ του χρήστη και του σημείου στόχου

    ή μπορεί απλώς να πάρει απόσταση από τον παρακάτω κώδικα;

    $ qry = “SELECT *, (((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((« Latitude »* pi () / 180)) + cos ((“. $ latitude. "* pi () / 180)) * cos ((" Latitude "* pi () / 180)) * cos (((". $ γεωγραφικό μήκος. "-" Γεωγραφικό μήκος ") * pi () / 180) )) * 180 / pi ()) * 60 * 1.1515 * 1.609344) ως απόσταση ΑΠΟ «MyTable» WHERE απόσταση> = ". $ Απόσταση." >>>> Μπορώ να "βγάλω" την απόσταση από εδώ;
    ευχαριστώ και πάλι,
    Τιμ Σ

  41. 60

    εντάξει, ό, τι έχω δοκιμάσει δεν λειτουργεί. Εννοώ, αυτό που έχω δουλέψει, αλλά οι αποστάσεις είναι πολύ μακριά.

    Θα μπορούσε κάποιος να δει τι συμβαίνει με αυτόν τον κώδικα;

    if (isset ($ _ POST ['υποβάλλεται'])) {$ z = $ _POST ['zipcode']; $ r = $ _POST ['ακτίνα']; echo "Αποτελέσματα για". $ z; $ sql = mysql_query ("SELECT DISTINCT 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 WHERE m.zipcode = z1.zipcode AND z2.zipcode = $ z AND (3963 * acos (περικοπή (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 ") ή die (mysql_error ()); while ($ row = mysql_fetch_array ($ sql)) {$ store1 = $ row ['MktName']. ""; $ store = $ row ['LocAddSt']. ""; $ store. = $ row ['LocAddCity']. ",". $ row ['LocAddState']. " $. Σειρά ['zipcode']; $ latitude1 = $ σειρά ['lat']; $ longitude1 = $ σειρά ['lon']; $ latitude2 = $ σειρά ['y1']; $ longitude2 = $ σειρά ['x1']; $ city = $ row ['πόλη']; $ state = $ σειρά ['κατάσταση']; $ dis = getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi'); // $ dis = απόσταση ($ lat1, $ lon1, $ lat2, $ lon2); $ verified = $ row ['επαληθευμένο']; if ($ verified == '1') {echo ""; echo "". $ store. ""; ηχώ $ dis. " μίλια μακριά"; ηχώ ""; } αλλιώς {echo "". $ store. ""; ηχώ $ dis. " μίλια μακριά"; ηχώ ""; }}}

    ο κωδικός functions.php μου
    συνάρτηση getnew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'Mi') {$ theta = $ longitude1 - $ longitude2; $ απόσταση = (sin (deg2rad ($ latitude1)) * sin (deg2rad ($ latitude2))) + (cos (deg2rad ($ latitude1)) * cos (deg2rad ($ latitude2)) * cos (deg2rad ($ theta)) ); $ απόσταση = acos ($ απόσταση); $ απόσταση = rad2deg ($ απόσταση); $ απόσταση = $ απόσταση * 60 * 1.1515; διακόπτης ($ unit) {case "Mi": break; υπόθεση «Km»: απόσταση $ = απόσταση $ 1.609344; } επιστροφή (γύρος (απόσταση $, 2)); }

    Σας ευχαριστώ εκ των προτέρων

  42. 61
  43. 62

    Γεια Ντάγκλας, υπέροχο άρθρο. Βρήκα την εξήγησή σας για τις γεωγραφικές έννοιες και τον κώδικα πολύ ενδιαφέρουσα. Η μόνη πρότασή μου θα ήταν το διάστημα και η εσοχή του κώδικα για εμφάνιση (όπως το Stackoverflow, για παράδειγμα). Κατανοώ ότι θέλετε να εξοικονομήσετε χώρο, αλλά το συμβατικό διάστημα / εσοχή κώδικα θα το έκανε πολύ πιο εύκολο για μένα, ως προγραμματιστής, να διαβάσω και να διαχωρίσω. Εν πάση περιπτώσει, αυτό είναι ένα μικρό πράγμα. Συνεχίστε την καλή δουλειά.

  44. 64
  45. 65

    Εδώ χρησιμοποιώντας με τη λειτουργία παίρνουμε έναν τύπο απόστασης .. ενώ χρησιμοποιούμε το ερώτημα που έρχεται άλλος τύπος απόστασης

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

    φαίνεται πιο γρήγορο (mysql 5.9) να χρησιμοποιήσετε διπλάσιο τον τύπο στην επιλογή και πού:
    $ formula = “(((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((« Latitude` * pi () / 180)) + cos ((“. $ γεωγραφικό πλάτος). "* Pi () / 180)) * cos ((" Latitude "* pi () / 180)) * cos (((". $ Γεωγραφικό μήκος. "-" Γεωγραφικό μήκος ") * pi () / 180))))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) ";
    $ sql = 'SELECT *,'. $ τύπος. ' ως απόσταση ΑΠΟ ΤΟΝ πίνακα ΠΟΥ ".. τύπος $." <= '. $ απόσταση;

  51. 71
  52. 72

    Ευχαριστώ πολύ για τη διάτμηση αυτού του άρθρου. Είναι πολύ χρήσιμο.
    Το PHP δημιουργήθηκε αρχικά ως μια απλή πλατφόρμα scripting που ονομάζεται «Προσωπική αρχική σελίδα». Σήμερα η PHP (η συντόμευση για τον υπερπροεπεξεργαστή υπερκειμένου) είναι μια εναλλακτική λύση της τεχνολογίας Active Server Pages (ASP) της Microsoft.

    Η PHP είναι μια γλώσσα διακομιστή ανοιχτού κώδικα που χρησιμοποιείται για τη δημιουργία δυναμικών ιστοσελίδων. Μπορεί να ενσωματωθεί σε HTML. Η PHP χρησιμοποιείται συνήθως σε συνδυασμό με μια βάση δεδομένων MySQL σε διακομιστές ιστού Linux / UNIX. Είναι πιθανώς η πιο δημοφιλής γλώσσα σεναρίου.

  53. 73

    Βρήκα ότι η παραπάνω λύση δεν λειτουργεί σωστά.
    Πρέπει να αλλάξω σε:

    $ qqq = "SELECT *, (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((` latt` * pi () / 180)) + cos ((". $ latitude. "* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos (((". $ longitude." - "longt`) * pi () / 180) )) * 180 / pi ()) * 60 * 1.1515) ως απόσταση ΑΠΟ «εγγραφή» «;

  54. 75
  55. 76

    Γεια σας, σε παρακαλώ, θα χρειαστεί πραγματικά τη βοήθειά σου σε αυτό.

    Έκανα αίτημα λήψης στον διακομιστή ιστού μου http://localhost:8000/users/findusers/53.47792/-2.23389/20/
    53.47792 = γεωγραφικό πλάτος
    -2.23389 = γεωγραφικό μήκος
    και 20 = η απόσταση που θέλω να ανακτήσω

    Ωστόσο, χρησιμοποιώντας τον τύπο σας, ανακτά όλες τις σειρές στο db μου

    $ αποτελέσματα = DB :: select (DB :: raw ("SELECT *, (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((lat * pi () / 180 )) + cos ((". $ latitude." * pi () / 180)) * cos ((lat * pi () / 180)) * cos (((". $ γεωγραφικό μήκος." - lng) * pi ( ) / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) ως απόσταση ΑΠΟ δείκτες ΕΧΟΥΝ απόσταση> = ". $ Απόσταση));

    [{"Id": 1, "name": "Frankie Johnnie & Luigo Too", "address": "939 W El Camino Real, Mountain View, CA", "lat": 37.386337280273, "lng": - 122.08582305908, "Απόσταση": 16079.294719663}, {"id": 2, "name": "Amici's East Coast Pizzeria", "address": "790 Castro St, Mountain View, CA", "lat": 37.387138366699, "lng": -122.08323669434, "απόσταση": 16079.175940152}, {"id": 3, "name": "Kapp's Pizza Bar & Grill", "address": "191 Castro St, Mountain View, CA", "lat": 37.393886566162, "Lng": - 122.07891845703, "απόσταση": 16078.381373826}, {"id": 4, "name": "Round Table Pizza: Mountain View", "address": "570 N Shoreline Blvd, Mountain View, CA", "Lat": 37.402652740479, "lng": - 122.07935333252, "απόσταση": 16077.420540582}, {"id": 5, "name": "Tony & Alba's Pizza & Pasta", "address": "619 Escuela Ave, Mountain Προβολή, CA "," lat ": 37.394012451172," lng ": - 122.09552764893," απόσταση ": 16078.563225154}, {" id ": 6," name ":" Oregano's Wood-Fired Pizza "," address ":" 4546 El Camino Real, Los Altos, CA "," lat ": 37.401725769043," lng ": - 122.11464691162," απόσταση ": 16077.937560795}, {" id ": 7," name ":" The bar and grills "," address ":" 24 Whiteley Street, Manchester "," lat ": 53.485118865967," lng ": - 2.1828699111938," απόσταση ": 8038.7620112314}]

    Θέλω να ανακτήσω μόνο σειρές με 20 μίλια, αλλά φέρνει όλες τις σειρές. Παρακαλώ τι κάνω λάθος

  56. 77

    I'mάχνω για ένα παρόμοιο ερώτημα, αλλά εντατικοποιήθηκε λίγο - με λίγα λόγια αυτό είναι να ομαδοποιήσουμε όλες τις συντεταγμένες σε απόσταση 2 μιλίων από κάθε συντεταγμένη και στη συνέχεια να μετρήσουμε πόσες συντεταγμένες σε κάθε ομάδα και να βγάλουμε μόνο μία ομάδα που έχει τις περισσότερες συντεταγμένες - ακόμα κι αν έχετε περισσότερες από μία ομάδες μεταξύ ομάδων που έχουν τον μεγαλύτερο αριθμό συντεταγμένων - απλώς εξάγετε την τυχαία ομάδα από τις ομάδες με τον ίδιο μεγαλύτερο αριθμό -

Ποια είναι η γνώμη σας;

Αυτός ο ιστότοπος χρησιμοποιεί το Akismet για να μειώσει το spam. Μάθετε πώς επεξεργάζονται τα δεδομένα των σχολίων σας.