Sie können ein leicht speichern lat/lon Dezimalzahl in einem unsigned Integer-Feld, anstatt sie nach oben in einer ganzen Zahl und Dezimalteil Aufspalten und diejenigen separat als etwas hier vorgeschlagene Speicherung mit der folgenden Umrechnungsalgorithmus:
als mysql Funktion gespeichert:
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)
und
CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7))
RETURNS int(10)
DETERMINISTIC
RETURN s * 600000
zurück, die in einem unsigned int (10) gespeichert werden muss, funktioniert dies in MySQL sowie in SQLite, die typenlos ist.
durch Erfahrung, finde ich, dass dies wirklich schnell funktioniert, wenn alles, was Sie brauchen, um Koordinaten zu speichern und abrufen, um etwas Mathe mit zu tun.
in PHP diese zwei Funktionen aussehen
function LatitudeSmallToFloat($LatitudeSmall){
if(($LatitudeSmall>0)&&($LatitudeSmall>>31))
$LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1;
return (float)$LatitudeSmall/(float)600000;
}
und wieder zurück:
function LatitudeFloatToSmall($LatitudeFloat){
$Latitude=round((float)$LatitudeFloat*(float)600000);
if($Latitude<0) $Latitude+=0xFFFFFFFF;
return $Latitude;
}
Dieser einige Vorteile hat in der Bezeichnung der Erstellung von beispielsweise Memcached eindeutige Schlüssel mit ganzen Zahlen als auch hinzugefügt. (zB um ein Geocode-Ergebnis zwischenzuspeichern). Ich hoffe, dass dies der Diskussion einen Mehrwert verleiht.
Eine weitere Anwendung könnte, wenn Sie ohne GIS-Erweiterungen sind und nur ein paar Millionen dieser lat/lon-Paare halten möchten, können Sie Partitionen auf diesen Feldern in MySQL verwenden können, aus der Tatsache, dass sie ganze Zahlen sind zu profitieren:
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 */
Wie ist das eine doppelte Frage? Er fragt eindeutig nach der SQL-Datenbank, wenn die andere Frage (und die Antworten dort auch) speziell auf MySQL eingehen. – Atul
Atul hat recht, es ist nicht die gleiche Frage auch, weil der andere angibt, dass Berechnungen auf lat/lng gemacht werden. Ich habe gerade gemerkt, dass meine Antwort von der anderen hier am besten geeignet ist, also schaut bitte nach: http://StackOverflow.com/a/25120203/1226018 – Simon
Ich werde Jahre später mitspielen. Atul und Simon haben Recht. Dies sind funktional verschiedene Fragen. Wenn Sie dies als Duplikat markieren, entspricht das der Aussage, dass die Frage, wie Sie einen Datensatz in einer Datenbank mit C# und Python persistieren, Duplikate sind. –