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!
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.
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
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)
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.
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
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
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