Bạn có thể dễ dàng lưu trữ một lat/lon số thập phân trong một trường unsigned integer, thay vì tách chúng trong một số nguyên và phần thập phân và lưu trữ những riêng biệt như phần nào gợi ý ở đây sử dụng các thuật toán chuyển đổi sau:
như một hàm mysql lưu trữ:
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)
và lưng
CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7))
RETURNS int(10)
DETERMINISTIC
RETURN s * 600000
Điều đó cần phải được lưu trữ trong một int unsigned (10), công trình này trong mysql cũng như trong sqlite đó là typeless.
thông qua trải nghiệm, tôi thấy rằng công cụ này hoạt động rất nhanh, nếu tất cả những gì bạn cần là lưu trữ tọa độ và truy xuất các tọa độ đó để thực hiện một số phép toán.
trong php những 2 chức năng giống như
function LatitudeSmallToFloat($LatitudeSmall){
if(($LatitudeSmall>0)&&($LatitudeSmall>>31))
$LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1;
return (float)$LatitudeSmall/(float)600000;
}
và ngược lại:
function LatitudeFloatToSmall($LatitudeFloat){
$Latitude=round((float)$LatitudeFloat*(float)600000);
if($Latitude<0) $Latitude+=0xFFFFFFFF;
return $Latitude;
}
này được một số lợi thế bổ sung cũng trong nhiệm kỳ của việc tạo ra ví dụ phím độc đáo memcached với số nguyên. (ví dụ: để cache kết quả mã địa lý). Hy vọng điều này sẽ làm tăng thêm giá trị cho cuộc thảo luận.
ứng dụng khác có thể là khi bạn đang không có phần mở rộng GIS và chỉ đơn giản là muốn giữ lại một vài triệu của những cặp lat/lon, bạn có thể sử dụng các phân vùng trên các lĩnh vực này trong mysql được hưởng lợi từ thực tế, họ là các số nguyên:
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 */
Câu hỏi trùng lặp này như thế nào? Ông rõ ràng yêu cầu cơ sở dữ liệu SQL vanilla trơn tru khi câu hỏi khác (và câu trả lời có quá) thảo luận về MySQL cụ thể. – Atul
Atul là đúng, nó không phải là cùng một câu hỏi cũng bởi vì một trong những khác xác định rằng các phép tính sẽ được thực hiện trên lat/lng. Tôi chỉ nhận ra rằng câu trả lời của tôi từ câu trả lời khác là phù hợp nhất ở đây, vì vậy hãy xem: http://stackoverflow.com/a/25120203/1226018 – Simon
Tôi sẽ kêu vang trong, năm sau đó. Atul và Simon đúng. Đây là những câu hỏi khác nhau về chức năng. Đánh dấu điều này là trùng lặp có thể tương đương với việc nói rằng yêu cầu làm thế nào để duy trì một bản ghi trong cơ sở dữ liệu bằng C# và Python là các bản sao. –