Ankündigung

Einklappen
Keine Ankündigung bisher.

Auswertung der minimalsten Differenz zwischen zwei Werten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Auswertung der minimalsten Differenz zwischen zwei Werten

    Hallo,

    ich habe ein Datenbank, welche Koordinaten (Längen- und Breitengrade) enthält sowie die dazugehörigen Postleitzahlen.

    ich möchte nun, wenn ich per Standortabfrage die Koordinaten erhalte, diese der Postleitzahl zuordnen, welche den Koordinaten jeweils am nächsten kommt.

    Um zu einem Ergebnis zu kommen, müsste man eine Abfrage machen, welche jeweils die geringste Differenz jeweils zwischen den Längen- und Breitengraden ermittelt.

    Ich habe trotz Recherchen bei Google hier nicht weiterführendes gefunden aus einer Funktion DATEDIFF, welche ja nur Für Datumsangeben gedacht ist.

    Daher meine erste Frage: Ist ein Lösungsweg auf dem beschriebenen Weg mit MySQL überhaupt möglich ?

    Gruss von Markus


  • #2
    MOD: Verschoben von Server, Hosting, ...
    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      https://ourcodeworld.com/articles/re...with-php-mysql

      Kommentar


      • #4
        Gruselig. Warum wird da mit SIN() und COS() herumgerechnet?

        https://tighten.co/blog/a-mysql-dist...uld-know-about

        Kommentar


        • #5
          Zitat von Jeff-Glenn-Fox Beitrag anzeigen

          Daher meine erste Frage: Ist ein Lösungsweg auf dem beschriebenen Weg mit MySQL überhaupt möglich ?

          Gruss von Markus
          PostgreSQL & PostGIS. Das hat u.a. auch eine indexbasierte Umkreissuche.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Zitat von hellbringer Beitrag anzeigen

            Gruselig. Warum wird da mit SIN() und COS() herumgerechnet?
            Wahrscheinlich weil´s funktioniert. Dein Link gefällt mir auch besser.

            Kommentar


            • #7
              Zitat von akretschmer Beitrag anzeigen

              PostgreSQL & PostGIS. Das hat u.a. auch eine indexbasierte Umkreissuche.
              Danke für den Hinweis, aber ich muss hier noch aus anderen Gründen bei MySQL (innoDB) bleiben.

              Gruss von Markus

              Kommentar


              • #8


                https://tighten.co/blog/a-mysql-dist...uld-know-about

                Vielen Dank, da wär ich jetzt ganz ehrlich so ohne weitere nicht drauf gekommen.

                Gruss von Markus

                Kommentar


                • #9
                  Ich habe mir den Code jetzt nochmal kurz genauer angeschaut und es ist ja erstmal von der Sache her eine Umkreisberechnung. Wenn ich den Code so anpasse, müsste es für meine Zwecke passen:


                  $query = <<<EOF
                  SELECT * FROM (
                  SELECT *,
                  (
                  (
                  (
                  acos(
                  sin(( $lat * pi() / 180))
                  *
                  sin(( `lat` * pi() / 180)) + cos(( $lat * pi() /180 ))
                  *
                  cos(( `lat` * pi() / 180)) * cos((( $lon - `lng`) * pi()/180)))
                  ) * 180/pi()
                  ) * 60 * 1.1515 * 1.609344
                  )
                  as distance FROM `markers`
                  ) markers
                  WHERE distance <= $distance

                  ORDER BY distance
                  LIMIT 1;


                  EOF;

                  Ich müsste mir dann nur nochmal Gedanken machen, wie ich den Radius sinnvoll festlege.

                  Gruss von Markus

                  Kommentar


                  • #10
                    Du musst das nicht selber berechnen. MySQL kann das bereits. Siehe meinen geposteten Link.

                    Kommentar


                    • #11
                      Sorry, hatte ich in der Eile überlesen und schaue ich mir gleich an.

                      Danke und Gruss

                      von Markus

                      Kommentar


                      • #12
                        Zitat von hellbringer Beitrag anzeigen

                        Gruselig. Warum wird da mit SIN() und COS() herumgerechnet?

                        https://tighten.co/blog/a-mysql-dist...uld-know-about
                        Und wie willst du bzw. wie soll SQL das berechnen ohne Pythagoras oder hier, weil schon alles in Grad gegeben ist, sin und cos? Und dann ist es auch noch Sphärische Trigonometrie - gut, das könnte man vernachlässigen. Außerdem ist die Erde sowieso eine Scheibe, das mit Kugel und so kommt nur von irgendwelchen imperalistischen Verschwörern, wenn sie Geld für Mondlandungen brauchen, die hinterher sowieso nicht stattfinden...

                        Kommentar


                        • #13
                          So,
                          habe mal beide Varianten getestet:

                          hellbringer , vielen Dank, mit dieser Funktion hatte ich mich bisher noch nicht befasst.

                          Schema:
                          Code:
                          CREATE TABLE `markers` (
                            `lat` decimal(10,8) NOT NULL,
                            `lng` decimal(11,8) NOT NULL,
                            `city` varchar(255) CHARACTER SET utf8 NOT NULL
                          ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
                          
                          INSERT INTO markers VALUES (50.9356030,6.9484202,'Köln');
                          INSERT INTO markers VALUES (53.5102762,10.0147483,'Hamburg');
                          INSERT INTO markers VALUES (48.1370817,11.5725166,'München');
                          INSERT INTO markers VALUES (52.5189105,13.3945709,'Berlin');
                          Query 1:
                          Code:
                          #ich sitze in Hannover
                          SET @lat = 52.3711004;
                          SET @lng = 9.7262850;
                           SELECT distance, city FROM (
                              SELECT *,
                                  (
                                      (
                                          (
                                              acos(
                                                  sin(( @lat * 0.017453293))
                                                  *
                                                  sin(( `lat` * 0.017453293)) + cos(( @lat * 0.017453293 ))
                                                  *
                                                  cos(( `lat` * 0.017453293)) * cos((( @lng - `lng`) * 0.017453293)))
                                          ) * 57.29577951
                                      ) * 111.189577
                                  )
                              as distance FROM `markers`
                          ) myTable
                          order by distance ASC;
                          Ergebnis:
                          Code:
                          distance city
                          128.1305200973667 Hamburg
                          249.12473648747095 Berlin
                          249.36301691244563 Köln
                          488.6895440354186 München
                          Die Ergebnisse weichen etwas ab weil ich pi/180 mal kurz in eine Konstante packte...
                          Query 2:
                          Code:
                          #ich sitze in Hannover
                          SET @lat = 52.3711004;
                          SET @lng = 9.7262850;
                           SELECT distance, city FROM (
                              SELECT *,
                                  ST_Distance_Sphere(
                              point(@lng, @lat),
                              point(lng, lat)
                          ) * 0.001
                              as distance FROM `markers`
                          ) myTable
                          order by distance ASC;
                          Ergebnis:
                          Code:
                          distance city
                          128.1363998242669    Hamburg
                          249.1361764008499    Berlin
                          249.37446425293942    Köln
                          488.71196995369706    München

                          Kommentar


                          • #14
                            Zitat von Alf2016 Beitrag anzeigen
                            Und wie willst du bzw. wie soll SQL das berechnen ohne Pythagoras oder hier, weil schon alles in Grad gegeben ist, sin und cos? Und dann ist es auch noch Sphärische Trigonometrie - gut, das könnte man vernachlässigen. Außerdem ist die Erde sowieso eine Scheibe, das mit Kugel und so kommt nur von irgendwelchen imperalistischen Verschwörern, wenn sie Geld für Mondlandungen brauchen, die hinterher sowieso nicht stattfinden...
                            Klick einfach auf den Link, bevor du antwortest. Danke.

                            Kommentar


                            • #15
                              Ich habe mir das angeschaut:

                              ST_Distance_Sphere

                              vereinfach Einiges abwer gibt es leider erst ab MySQL Version 5.7.5, welche mir hierfür nicht zur Verfügung steht. Habe ich aber im Gedächnis gespeichert.

                              Gruss von Markus




                              Kommentar

                              Lädt...
                              X