Frage

Theorie

Ich habe eine recht umfangreiche Koordinatenliste (Breiten- und Längengrad auf 7 Dezimalstellen genau), die ich ständig ergänzen möchte.Um die Datenduplizierung zu verhindern, möchte ich für jede einzugebende Koordinate in der Datenbank prüfen, ob Breiten- und Längengrad in derselben Zeile vorhanden sind.

Überprüfen Sie, ob Koordinaten vorhanden sind

 $coordinate = DB::table('coordinates')
            ->where('lat', '=', $geocode->getLatitude())
            ->where('lng', '=', $geocode->getLongitude())
            ->count();

Migration

Schema::create('coordinates', function(Blueprint $table)
        {
            $table->increments('id');
            $table->float('lat', 10, 7);
            $table->float('lng', 10, 7);
            $table->timestamps();
        });

Wenn die Adresse des Benutzers konvertiert wird, ist mir das aufgefallen dd() die Breitengradvariable, es ergibt sich als:

float(53.7960957) aus dem Code dd($geocode->getLatitude());

Wenn ich versuche, es später zur Datenbank hinzuzufügen, indem ich das entferne dd(), die tatsächliche Dezimalzahl, die der Datenbank hinzugefügt wird, ist 53.7960968 - Ein völlig anderer Ort, wenn es um Koordinaten geht!

Warum ändert sich die Dezimalzahl vom Echo auf meinem Bildschirm zum Hinzufügen zur Datenbank?

Muss ich es vor dem Hinzufügen in einen Float umwandeln?Wie kann ich das beheben?

War es hilfreich?

Lösung

Aktualisieren:

Ich habe MySQL schon eine Weile nicht mehr verwendet, also habe ich noch etwas recherchiert.Es sieht so aus decimal Typ hat die Fähigkeit, bis zu 65 Ziffern genau zu sein.Da Sie nur 7 Nachkommastellen und 3 vor der Dezimalstelle benötigen, sollten Sie kein Problem damit haben, ein Schema zu erstellen decimal(10,7).

SQL-Geige


Vorausgesetzt, Sie verwenden MySQL, können Sie nicht viel tun.Entsprechend die Dokumentation, float Und double Typen sind ungefähre Darstellungen:

Die Typen FLOAT und DOUBLE stellen ungefähre numerische Datenwerte dar.MySQL verwendet vier Bytes für Werte mit einfacher Genauigkeit und acht Bytes für Werte mit doppelter Genauigkeit.

Schauen Sie sich auch das an SQL-Geige, werden Sie sehen, dass MySQL 5.5.32 einen Float von darstellt 53.7960957 als 53.796100616455 und ein Doppeltes davon 53.7960957 als 53.7960957.Möglicherweise möchten Sie Ihr Schema aktualisieren, um stattdessen Doubles zu verwenden, um etwas mehr Präzision zu erzielen.

Sie können auch die Genauigkeit eines Floats mit nicht standardmäßiger Syntax angeben (daher wird dies aus Gründen der Portabilität auf andere SQL-Standards nicht empfohlen), indem Sie verwenden float(m,d) Wo m ist die Gesamtzahl der Ziffern und d ist die Anzahl der Nachkommastellen.Wenn Sie beispielsweise Breiten-/Längengrade (-180 bis 180) mit einer Genauigkeit von bis zu 7 Nachkommastellen zulassen möchten, sollten Sie Ihre Tabelle damit erstellen können float(10,7).Aber, wie Sie sehen werden, das war immer noch nicht so präzise wie double.

Andere Tipps

Wie der Vorwriter sagt, ... verwenden Sie doppeltes Instad von Float ...

Sie könnten auch 1E6-Notation verwenden, sodass eine ganze Zahl ist, um zu speichern ist MySQL.

generasacodicetagpre.

Dies ist der Weg, den ich verwende, um Geocoordinate zu speichern

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top