Kiểu dữ liệu thập phân hoặc điểm để lưu trữ dữ liệu vị trí địa lý trong MySQL


8

Tôi muốn lưu trữ vị trí Geo cho mỗi Địa chỉ trong bảng "tblAddress" MySQL (Innodb) của tôi và tôi nghĩ rằng tôi có 2 Tùy chọn:

1) 2 columns for Each Address:
Latitude DECIMAL(10, 8), 
Longitude DECIMAL(11, 8)

2) One Column for Each Address:
GeoLocation POINT

Chương trình của tôi cần tìm tất cả Địa chỉ nằm dưới 1 Kilomet Bán kính từ Vị trí hiện tại (Máy khách di động).

Ngoài ra lệnh dưới đây không hoạt động đối với tôi, không chắc chắn những gì tôi cần phải có cho việc này.

CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation);

Vì vậy, cách tiếp cận được đề xuất để lưu trữ dữ liệu để tính toán và truy xuất nhanh hơn ở đây. Xin tư vấn.

Câu trả lời:


6

Bạn có thể sử dụng các phần mở rộng không gian của MySQL với GIS.

Trong một ví dụ mã từ Google hiển thị các điểm trên bản đồ, họ nêu:

Khi bạn tạo bảng MySQL, bạn muốn đặc biệt chú ý đến các thuộc tính lat và lng. Với khả năng thu phóng hiện tại của Google Maps, bạn chỉ cần 6 chữ số chính xác sau số thập phân.

Để giữ không gian lưu trữ cần thiết cho bảng của chúng tôi ở mức tối thiểu, bạn có thể chỉ định rằng các thuộc tính lat và lng có kích thước nổi (10,6). Điều đó sẽ cho phép các trường lưu trữ 6 chữ số sau số thập phân, cộng với tối đa 4 chữ số trước số thập phân, ví dụ: -123,456789 độ Tôi sẽ không lo lắng về sự khác biệt hiệu suất giữa các loại số. Chỉ số Decent sẽ có tác dụng lớn hơn nhiều.

Bạn cũng có thể thử DECIMALnhư @ gandaliter đề nghị.

DECIMALlà kiểu dữ liệu MySQL cho số học chính xác. Không giống như FLOATđộ chính xác của nó được cố định cho bất kỳ kích thước số nào, vì vậy bằng cách sử dụng nó thay vì FLOATbạn có thể tránh được các lỗi chính xác khi thực hiện một số tính toán. Nếu bạn chỉ lưu trữ và truy xuất các số mà không tính toán thì trong thực tế FLOAT sẽ an toàn, mặc dù không có hại gì khi sử dụng DECIMAL. Với tính toán FLOATvẫn chủ yếu là ok, nhưng để hoàn toàn chắc chắn về 8d.p. độ chính xác bạn nên sử dụng DECIMAL.

Vĩ độ dao động từ -90 đến +90 (độ), vì vậy DECIMAL(10,8)cũng ổn, nhưng kinh độ dao động từ -180 đến +180 (độ) nên bạn cần DECIMAL(11,8). Số đầu tiên là tổng số chữ số được lưu trữ và số thứ hai là số sau dấu thập phân. Tóm lại: lat DECIMAL(10,8) NOT NULL, lng DECIMAL(11,8) NOT NULL Điều này giải thích cách MySQL hoạt động với các kiểu dữ liệu dấu phẩy động.

Thông tin liên quan:


Cảm ơn bạn @oNare đã giải thích chi tiết và tài liệu tham khảo của bạn. Tôi đã thấy đề nghị của gandaliter trong câu hỏi ( stackoverflow.com/questions/12504208/ .). Tôi cũng đã thấy đề xuất của ypercube ở đây ( stackoverflow.com/questions/9560147/ mẹo ).
Bohhat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.