Jaki typ danych MySQL powinien być używany dla szerokości / długości geograficznej z 8 miejscami po przecinku?

Pracuję z danymi mapy, a Latitude/Longitude rozciąga się do 8 miejsc po przecinku. Na przykład:

Latitude 40.71727401
Longitude -74.00898606

Widziałem w dokumencie Google który wykorzystuje:

lat FLOAT( 10, 6 ) NOT NULL,  
lng FLOAT( 10, 6 ) NOT NULL

Jednak ich miejsca po przecinku wynoszą tylko 6.
Czy powinienem użyć FLOAT(10, 8) czy jest inna metoda do rozważenia przechowywania tych danych, aby były precyzyjne. Będzie on używany przy obliczeniach map. Dzięki!

Author: pnuts, 2012-09-20

6 answers

DECIMAL to typ danych MySQL do dokładnej arytmetyki. W przeciwieństwie do FLOAT jego precyzja jest stała dla dowolnego rozmiaru liczby, więc używając go zamiast FLOAT możesz uniknąć błędów precyzji podczas wykonywania niektórych obliczeń. Gdybyś tylko przechowywał i pobierał liczby bez kalkulacji, to w praktyce FLOAT byłby bezpieczny, chociaż nie ma nic złego w używaniu dziesiętnych. Z obliczeniami FLOAT jest nadal w większości ok, ale aby być absolutnie pewnym 8D. P. precyzji należy użyć Dziesiętne.

Szerokości geograficzne wahają się od -90 do +90 (stopni), więc DECIMAL(10, 8) jest w porządku, ale długości geograficzne wahają się od -180 do +180 (stopni), więc potrzebujesz DECIMAL(11, 8). Pierwsza liczba jest całkowitą liczbą zapisanych cyfr, a druga jest liczbą po przecinku.

W skrócie: lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL

Ten wyjaśnia, jak MySQL działa z zmiennoprzecinkowymi typami danych.

 439
Author: gandaliter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-19 23:46:43

Dodatkowo zobaczysz, że float wartości są zaokrąglone.

// e.g: given values 41.0473112,29.0077011

float(11,7) | decimal(11,7)
---------------------------
41.0473099  | 41.0473112
29.0077019  | 29.0077011

 11
Author: K-Gun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-24 19:01:06

Możesz ustawić swój typ danych jako signed integer. Podczas przechowywania współrzędnych do SQL można ustawić jako lat*10000000 i długie * 10000000. A po wybraniu z odległością / promieniem podzielisz współrzędne magazynu na 10000000. Testowałem go z 300 tysiącami wierszy, Czas odpowiedzi na zapytanie jest dobry. ( Procesor 2 x 2,67 GHz, 2 GB RAM, MySQL 5.5.49)

 5
Author: Oğuzhan KURNUÇ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 23:59:40

Najlepszym sposobem w moim przypadku było zapisanie współrzędnych jako podwójnych.

lat DOUBLE NOT NULL,  
lng DOUBLE NOT NULL

Zapisze całą wartość bez zaokrąglania.

Jeśli chcesz zaokrąglać wartość, radzę ci, aby zabieg ten odbywał się u źródła danych, na przykład w interfejsie użytkownika.

 1
Author: tioperez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-15 07:18:53

Używanie migrate ruby on rails

class CreateNeighborhoods < ActiveRecord::Migration[5.0]
  def change
    create_table :neighborhoods do |t|
      t.string :name
      t.decimal :latitude, precision: 15, scale: 13
      t.decimal :longitude, precision: 15, scale: 13
      t.references :country, foreign_key: true
      t.references :state, foreign_key: true
      t.references :city, foreign_key: true

      t.timestamps
    end
  end
end
 0
Author: gilcierweb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-02 18:20:25

Nie używaj float... Okrąża twoje współrzędne, powodując dziwne zdarzenia.

Użyj dziesiętnego

 0
Author: Sam Sabey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-27 01:13:18