Domanda

Teoria

Ho un elenco di coordinate piuttosto completo (latitudine e longitudine a 7 punti decimali), che voglio aggiungere continuamente a. Per interrompere la duplicazione dei dati, per ogni coordinata che sta tentando di essere inserita, voglio controllare il database per vedere se esistono la latitudine e longitudine, sulla stessa riga.

Controllare se le coordinate esistono

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

Migrazione

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

Quando l'indirizzo dell'utente viene convertito, ho notato che quando dd() la variabile latitudine, si esce come:

float(53.7960957) dal codice dd($geocode->getLatitude());

Quando provo ad aggiungerlo in seguito al database, rimuovendo il dd(), il decimale effettivo che è aggiunto nel database è 53.7960968 - una posizione completamente diversa quando stiamo parlando delle coordinate!

Perché il decimale è il cambiamento da echeggi sullo schermo, per aggiungere al database?

Devo convertirlo in un galleggiante prima di aggiungere? Come posso risolvere questo?

È stato utile?

Soluzione

Aggiornamento:

Non ho usato MySQL in un po ', quindi ho fatto qualche più ricerca. Sembra che il decimal Type ha La capacità di essere precisa per un massimo di 65 cifre. Poiché hai solo bisogno di 7 cifre superato il decimale e 3 prima del decimale, non dovresti avere problemi a creare uno schema con decimal(10,7).

SQL Fiddle


.

Supponendo che tu stia usando mysql, non c'è molto che puoi fare. Secondo La documentazione , float e tipi generacodictagcode Le rappresentazioni approssimative sono:

.

Il galleggiante e i doppi tipi rappresentano i valori di dati numerici approssimativi. MySQL utilizza quattro byte per valori di precisione singola e otto byte per valori di doppia precisione.

Dai un'occhiata a questo SQL Fiddle , vedrai che MySQL 5.5.32 Rappresenterà un galleggiante di double come 53.7960957 e un doppio 53.796100616455 come 53.7960957. Potresti voler aggiornare il tuo schema per utilizzare i doppi invece, per leggermente più precisione.

È inoltre possibile specificare la precisione di un galleggiante con sintassi non standard (quindi non è raccomandato, per la portabilità ad altri standard SQL) utilizzando 53.7960957 in cui float(m,d) è la cifra totale e m è il numero di cifre dopo il decimale. Ad esempio, se si desidera consentire i valori di latitudine / longitudine (da -180 a 180) con fino a 7 cifre di precisione dopo il decimale ... dovresti essere in grado di creare la tabella con d. Ma, Come vedrai , questo non era ancora preciso come il doppio.

Altri suggerimenti

Come dice il Forewriter ... usa il doppio instad di float ...

Potresti anche usare la notazione 1E6 in modo da essere un intero salvare è MySQL.

53.7960957 * 1E6 = 537960957
537960957 / 1E6 = 53.7960957
.

Questo è il modo in cui sto usando per salvare geocoordinati

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top