Pergunta

Teoria

Eu tenho bastante abrangente lista de coordenadas (Latitude e Longitude de 7 casas decimais), o que eu quero adicionar continuamente.Para parar a duplicação de dados, para cada coordenada que está tentando ser digitados, quero verificar se o banco de dados para ver se a latitude e a longitude existir, na mesma linha.

Verifique se existem coordenadas

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

Migração

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

Quando o endereço do usuário é convertida, tenho notado que quando dd() a latitude variável, que sai como:

float(53.7960957) a partir do código dd($geocode->getLatitude());

Quando eu tentar adicioná-lo posteriormente para o banco de dados, removendo o dd(), o real decimal que é adicionado para o banco de dados é 53.7960968 - É completamente diferente de localização quando estamos falando de coordenadas!

Qual é o decimal mudando de ecoando na minha tela, para adicionar ao banco de dados?

Eu preciso convertê-lo para um float antes de adicionar?Como posso resolver isso?

Foi útil?

Solução

Atualização:

Eu não usei o MySQL em um tempo, então eu fiz um pouco mais de pesquisa.Parece que o decimal tipo tem a capacidade para ser mais preciso para até 65 dígitos.Desde que você só precisa de 7 dígitos passado decimal e 3 antes de decimal, você deve ter nenhum problema criando um esquema com decimal(10,7).

SQL Violino


Assumindo que você está usando MySQL, não há muito que você pode fazer.De acordo com a a documentação, float e double tipos são representações aproximadas:

O FLOAT e DOUBLE tipos de representar dados numéricos aproximados valores.O MySQL utiliza quatro bytes para single-valores de precisão e oito bytes para valores de dupla precisão.

Confira também esta SQL Violino, você vai ver que o MySQL 5.5.32 vai representar uma válvula de 53.7960957 como 53.796100616455 e um casal de 53.7960957 como 53.7960957.Você pode querer atualizar o esquema para usar duplos em vez disso, para ter um pouco mais de precisão.

Você também pode especificar a precisão de um float com o padrão de sintaxe (por isso não é recomendado, para a portabilidade para outros SQL padrões) usando float(m,d) onde m é o total de dígitos e d é o número de dígitos após a vírgula.Por exemplo, se você deseja permitir latitude/longitude (-180 a 180) com até 7 dígitos de precisão após a vírgula..você deve ser capaz de criar sua tabela, com float(10,7).Mas, como você vai ver, isso ainda não era tão precisa como a dupla foi.

Outras dicas

como o forewriter dizer ...o uso de DUPLO instad de FLUTUAR ...

você também pode usar 1E6 notação portanto, ele deve ser um número Inteiro para salvar é o MySQL.

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

esta é a maneira que eu estou usando para guardar geocoordinates

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top