NaN bei Berechnung nach Serverumzug?

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

  • #16
    Key:1215, Wert: 118.08191921342, Breite: 53.53000, Laenge: 8.12580<br>
    Key:1216, Wert: 118.16759624081, Breite: 53.53000, Laenge: 8.12580<br>
    Key:1217, Wert: 118.32437878168, Breite: 53.52985, Laenge: 8.12707<br>
    Key:1218, Wert: NAN, Breite: 53.52967, Laenge: 8.12942<br>
    Key:1219, Wert: NAN, Breite: 53.52967, Laenge: 8.12942<br>

    Kommentar


    • #17
      kannst du mal echo [COLOR=#000000][COLOR=#0000cc]$dis; mit aufnehmen in die ausgaben?

      ist das Absicht, dass die Koords von Punkt 1218 die gleichen sind,wie die von 1219 ?

      und überhaupt .. scheinen deine Koordinaten öfter mal doppelt zu sein ... ist das auch Absicht?


      [/COLOR][/COLOR]
      Zuletzt geändert von eagle275; 03.09.2010, 11:53.
      [font=Verdana]
      Wer LESEN kann, ist klar im Vorteil!
      [/font]

      Kommentar


      • #18
        Key:1217, Wert: 118.32437878168, Breite: 53.52985, Laenge: 8.12707 . Dis: 0.15678254086481<br>
        Key:1218, Wert: NAN, Breite: 53.52967, Laenge: 8.12942 . Dis: NAN<br>
        Key:1219, Wert: NAN, Breite: 53.52967, Laenge: 8.12942 . Dis: NAN<br>

        Und ja, das mit den doppelten Koordinaten ist Absicht ;-)

        Kommentar


        • #19
          tja offensichtlich berechnet dort deine Winkelfunktion "UNSINN" ....

          dazu müsstest du nun wieder die einzelnen Bestandteile

          [COLOR=#000000][COLOR=#0000cc]$erste_breite_rad, [/COLOR][/COLOR][COLOR=#000000][COLOR=#0000cc]$erste_laenge_rad, [/COLOR][/COLOR][COLOR=#000000][COLOR=#0000cc]$zweite_breite_rad,[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000cc]$zweite_laenge_rad

          per echo ausgeben ....


          [/COLOR][/COLOR]
          [font=Verdana]
          Wer LESEN kann, ist klar im Vorteil!
          [/font]

          Kommentar


          • #20
            Zitat von Ghostrider28 Beitrag anzeigen
            Und ja, das mit den doppelten Koordinaten ist Absicht ;-)
            Die Entfernung zw. den Punkten ist dann 0 Meter und die Berechnung überflüssig. Du solltest solche Duplikate aus dem Array entfernen bevor du die fertige Klasse die Entfernung berechnen lässt.

            NaN entsteht vermutlich durch acos(>1). Rechne mal die Sinus-Cosinus-Kette für Extrema durch (kleine und große Entfernungen zweier Punkte).

            Kommentar


            • #21
              So, wieder zuhause.

              Ich rechne das jetzt mal durch, aber nach Nasengefühl wird es daran liegen.
              acos darf nur zwischen -1 und 1 liegen, wenn ich das vorhin auf der Arbeit richtig gelesen habe.

              Kommentar


              • #22
                PHP-Code:
                if (isset($koord[$key 1]))
                            {
                                
                $erste_breite $koord[$key][0]; // lat
                                
                $erste_laenge $koord[$key][1]; // lon
                                
                $erste_breite_rad deg2rad($erste_breite);
                                
                $erste_laenge_rad deg2rad($erste_laenge);

                                
                $zweite_breite $koord[$key 1][0]; // lat
                                
                $zweite_laenge $koord[$key 1][1]; // lon
                                
                $zweite_breite_rad deg2rad($zweite_breite);
                                
                $zweite_laenge_rad deg2rad($zweite_laenge);

                                
                $dis acos(
                                    (
                sin($erste_breite_rad) * sin($zweite_breite_rad)) +
                                    (
                cos($erste_breite_rad) * cos($zweite_breite_rad) *
                                        
                cos($zweite_laenge_rad $erste_laenge_rad))) * $welt;

                                
                $ent $ent $dis;
                            } 
                Werte/ Berechnungsgrundlage:
                Key:1217, Wert: 118.32437878168, Breite: 53.52985, Laenge: 8.12707 . Dis: 0.15678254086481<br>
                Key:1218, Wert: NAN, Breite: 53.52967, Laenge: 8.12942 . Dis: NAN<br>
                Key:1219, Wert: NAN, Breite: 53.52967, Laenge: 8.12942 . Dis: NAN<br>

                Berechnung:
                $erste_breite = $koord[$key][0]; // 53.52985
                $erste_laenge = $koord[$key][1]; // 8.12707
                $erste_breite_rad = deg2rad($erste_breite); //0.93427213059869
                $erste_laenge_rad = deg2rad($erste_laenge); //0.14184413004006

                $zweite_breite = $koord[$key + 1][0]; // 53.52967
                $zweite_laenge = $koord[$key + 1][1]; // 8.12942
                $zweite_breite_rad = deg2rad($zweite_breite); // 0.93426898900603
                $zweite_laenge_rad = deg2rad($zweite_laenge); // 0.14188514527748

                $dis = acos(
                (sin($erste_breite_rad) * sin($zweite_breite_rad)) +
                (cos($erste_breite_rad) * cos($zweite_breite_rad) *
                cos($zweite_laenge_rad - $erste_laenge_rad))) * $welt;

                $ent = $ent + $dis;

                $dis = acos(
                (sin(0.93427213059869) * (sin(0.93426898900603)) +
                (cos(0.93427213059869) * (cos(0.93426898900603)) *
                (cos(0.14188514527748 - 0.14184413004006))) * 6378.137

                = acos((0.80416664275182 * 0.80416477537289)) + ((0.59440391207096 * 0.59440643843205) * (0.99999999915888))
                = acos(0.64668248763089 + (0.35331751236418 * 0.99999999915888)) * 6378.137
                = acos(0.64668248763089 + 0.353317512067) * 6378.137
                Distanz zwischen den beiden oben genannten Punkten = [COLOR=Red]0.15678026508383[/COLOR]

                Kommentar


                • #23
                  Du hast da ein paar Klammern reingeschummelt.
                  Zitat von Ghostrider28 Beitrag anzeigen
                  $dis = acos(
                  (sin(0.93427213059869) * (sin(0.93426898900603)) +
                  (cos(0.93427213059869) * (cos(0.93426898900603)) *
                  (cos(0.14188514527748 - 0.14184413004006))) * 6378.137
                  Aber die Rechnung stimmt, zumindest vom Ergebnis her.
                  Vermutlich hast du das nicht auf der Maschine ausgerechnet, die NaN liefert.
                  Das bringt natürlich nichts. Mach das mal auf der richtigen Maschine.

                  Was liefert dort eigentlich ini_get('precision')? Hast du testweise mal die bc_* Funktionen verwendet? Ich tippe nämlich auf Floating Point Precision …

                  Kommentar


                  • #24
                    ini_get liefert 14.

                    Habe auch eben mal die Berechnung auf der selben Maschine ausgerechnet, auf der der Fehler auftritt.

                    Ergebnis ist aber auch 0.15678259847908.

                    Die bc Funktionen habe ich allerdings nicht verwendet.

                    Ich versuche nochmal eben eine Berechnung mit zwei gleichen Koordinaten, die beide bei $dis ein NaN Ergebnis liefern. Hier sollte ja ein Abstand von 0 herauskommen.

                    Mal schauen, was dabei herauskommt.

                    Kommentar


                    • #25
                      hast du mal getestet ob das direkte auslesen der entfernung mittels sql besser funktioniert ?

                      Kommentar


                      • #26
                        Hm, die Berechnung mit zwei identischen Koordinaten liefert ebenfalls ein richtiges Ergebnis, nämlich erwartungsgemäß 0.

                        Habe mir mal die Berechnung aus der Funktion rausgerupft und mal in einem einzelnen Script laufen lassen.

                        Ergebnis:

                        DB_ID: 37592 | Breite: 48.11765 | Länge: 11.64474 | dis: 0.0059959153415729
                        DB_ID: 37593 | Breite: 48.11760 | Länge: 11.64471 | dis: 0.0011124339636334
                        DB_ID: 37594 | Breite: 48.11759 | Länge: 11.64471 | dis: 0.0034201790343091
                        DB_ID: 37595 | Breite: 48.11756 | Länge: 11.64470 | dis: 0.0057608097402872
                        DB_ID: 37596 | Breite: 48.11751 | Länge: 11.64468 | dis: NAN
                        DB_ID: 37597 | Breite: 48.11751 | Länge: 11.64468 | dis: 0.0023435042521748
                        DB_ID: 37598 | Breite: 48.11753 | Länge: 11.64469 | dis: 0.0023473555353846
                        DB_ID: 37599 | Breite: 48.11755 | Länge: 11.64470 | dis: 0.0026780840776796
                        DB_ID: 37600 | Breite: 48.11757 | Länge: 11.64472 | dis: 0.0022248679272669

                        @Peacie

                        Nein, das habe ich noch nicht, liegt aber auch daran, dass ich gar nicht so richtig weiß, wie das funktioniert ;-)

                        Kommentar


                        • #27
                          wenn ichs noch richtig in erinnerung habe.. ( kann grad nicht auf meinem server suchen)

                          PHP-Code:
                          $entf="
                          DEGREES(ACOS(SIN(RADIANS(clat))*SIN(RADIANS("
                          .$ausgangs_lat."))
                          +COS(RADIANS(clat))*COS(RADIANS("
                          .$ausgangs_lat."))*COS(RADIANS(clon - ".$ausgangs_lng."))) * 60 * 1.85201) AS entfernung"
                          clat und clon sind durch deine felder in der db zu ersetzen
                          $ausgangs_lat und $ausgangs_lng ist der punkt, von dem du die entfernungen berechnen willst

                          rein sinngemäss:

                          Code:
                          select clat, clon, ".$entf." from tabelle
                          anschliessend kannst du noch dranhängen:
                          PHP-Code:
                          where ".$entf." <= maxentfernung order by ".$entf." 
                          so ca müsste es gewesen sein, hab das schon länger in der kiste liegen

                          der besseren lesbarkeit hab ich die originalformel grad nochmal ergoogelt:

                          PHP-Code:
                          SELECT
                                   
                          DEGREES(     
                                       
                          ACOS(        
                                          
                          SIN(RADIANSlatitude1 )) * SIN(RADIANSlatitude2 ))            
                                          +  
                          COS(RADIANSlatitude1 )) * COS(RADIANSlatitude2 ))
                                       * 
                          COS(RADIANSlongitude1 longitude2 ))        
                                          ) * 
                          60 1.1515     
                                  
                          )  
                              ) AS 
                          distance 

                          Kommentar


                          • #28
                            Uff, jetzt stehe ich ein wenig auf dem Schlauch.
                            Das werde ich mir morgen mal zu Gemüte führen, zu so später Stunde hat das irgendwie keinen Sinn mehr ;-)

                            //Edit

                            Ich habe mal ein wenig improvisiert.
                            Ich weiss, improvisieren hat nichts mit programmieren zu tun, aber wenigstens erhalte ich eine Entfernung. Das löst das Problem nicht, darum werde ich mich dann morgen kümmern müßen.

                            Meine Zwischenlösung:

                            PHP-Code:
                            <?php

                            include('../connect.php');
                            $welt 6378.137;
                            $statement "SELECT * FROM  `kd10001_on10001` WHERE  `field_1` = '354777030034305 ' order by `servertime` ASC";
                            $query mysql_query($statement);
                            $results mysql_num_rows($query);

                            while(
                            $row mysql_fetch_array($query ))
                                {
                                
                            $id[] = $row['id'];
                                
                            $koord_n[] = $row['field_3'];
                                
                            $koord_e[] = $row['field_4'];
                                }

                                          for(
                            $i=0;$i<$results 1;$i++)
                                          {
                                            
                            $erste_breite $koord_n[$i]; 
                                            
                            $erste_laenge $koord_e[$i]; 
                                            
                            $erste_breite_rad deg2rad($erste_breite); 
                                            
                            $erste_laenge_rad deg2rad($erste_laenge); 

                                            
                            $zweite_breite $koord_n[$i 1]; 
                                            
                            $zweite_laenge $koord_e[$i 1]; 
                                            
                                            
                                            
                            $zweite_breite_rad deg2rad($zweite_breite); 
                                            
                            $zweite_laenge_rad deg2rad($zweite_laenge); 
                                            
                                            
                            $dis acos(
                                                        (
                            sin($erste_breite_rad) * sin($zweite_breite_rad)) +
                                                        (
                            cos($erste_breite_rad) * cos($zweite_breite_rad) *
                                                        
                            cos($zweite_laenge_rad $erste_laenge_rad))) * $welt;
                                            echo 
                            "DB_ID: $id[$i] | Breite: $koord_n[$i] | Länge: $koord_e[$i] | dis: $dis <br>";
                                            if(!
                            is_nan($dis))
                                            {
                                            
                            //Gesamtentfernung in km, in diesem Falle ca. 125 km bei 8769 ermittelten Koordinaten
                                            
                            $entfernung += $dis;
                                            }
                                          }
                            ?>
                            Zuletzt geändert von Ghostrider28; 03.09.2010, 22:35.

                            Kommentar

                            Lädt...
                            X