można łatwo przechowywać lat/lon liczbę dziesiętną w unsigned polu całkowitą, zamiast dzieląc je na całkowitą i część dziesiętną i przechowywania tych oddzielnie jako nieco sugeruje tutaj używając następujący algorytm konwersji:
w zapamiętanej funkcji mysql
CREATE DEFINER=`r`@`l` FUNCTION `PositionSmallToFloat`(s INT)
RETURNS decimal(10,7)
DETERMINISTIC
RETURN if(((s > 0) && (s >> 31)) , (-(0x7FFFFFFF -
(s & 0x7FFFFFFF)))/600000, s/600000)
iz powrotem
CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7))
RETURNS int(10)
DETERMINISTIC
RETURN s * 600000
To musi być przechowywany w unsigned int (10), to działa w mysql jak i SQLite, który jest typeless.
Z doświadczenia wiem, że działa to bardzo szybko, jeśli wszystko, co musisz, to współrzędne sklepu i pobrać te, z których można zrobić matematykę.
php 2 Funkcje te wyglądają
function LatitudeSmallToFloat($LatitudeSmall){
if(($LatitudeSmall>0)&&($LatitudeSmall>>31))
$LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1;
return (float)$LatitudeSmall/(float)600000;
}
i z powrotem:
function LatitudeFloatToSmall($LatitudeFloat){
$Latitude=round((float)$LatitudeFloat*(float)600000);
if($Latitude<0) $Latitude+=0xFFFFFFFF;
return $Latitude;
}
ten część dodatkową zaletę, a także w okresie tworzenia na przykład Memcached unikalne klucze całkowitymi. (np. buforować wynik geokodowania). Mam nadzieję, że to doda wartości do dyskusji.
Innym zastosowaniem może być, gdy jesteś bez rozszerzeń GIS i po prostu chcesz zachować kilka milionów tych lat/lon parami, można użyć partycji na tych pól w mysql skorzystać z faktu, że są liczbami całkowitymi:
Create Table: CREATE TABLE `Locations` (
`lat` int(10) unsigned NOT NULL,
`lon` int(10) unsigned NOT NULL,
`location` text,
PRIMARY KEY (`lat`,`lon`) USING BTREE,
KEY `index_location` (`locationText`(30))
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY KEY()
PARTITIONS 100 */
W jaki sposób jest to duplikat pytania? On wyraźnie pyta o zwykłą wanilię bazy danych SQL, gdy inne pytanie (i tam też odpowiedzi) dyskutują o MySQL. – Atul
Atul ma rację, nie jest to to samo pytanie, ponieważ drugi określa, że obliczenia będą dokonywane na lat/lng. Właśnie zdałem sobie sprawę, że moja odpowiedź z drugiej najlepiej pasuje tutaj, więc proszę spojrzeć: http://stackoverflow.com/a/25120203/1226018 – Simon
Mam zamiar zadzwonić, lata później. Atul i Simon mają rację. To są funkcjonalnie różne pytania. Oznaczenie tego jako duplikatu może być równoznaczne z stwierdzeniem, że pytanie, jak utrwalić rekord w bazie danych przy użyciu C# i Pythona, jest duplikatami. –