Có lẽ là các mục x và y trong dữ liệu POINT của bạn trong geometry
của bạn cột theo độ vĩ độ và kinh độ.
Để thực hiện việc tra cứu này một cách hiệu quả trong MySQL, bạn sẽ cần một số thứ.
- Một bảng MyISAM (hoặc MySQL Phiên bản 5.7 trở lên và InnoDB hoặc MyISAM)
- Chứng chỉ KHÔNG ĐẦY ĐỦ về cột hình học của bạn
- Chỉ mục không gian
ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
- Mã để tạo bản trình bày dạng văn bản của hình chữ nhật bạn muốn tìm kiếm
- Sử dụng các hàm GeomFromText và MBRContains / MBRWithin trong câu lệnh SELECT của bạn.
Giả sử hộp vĩ độ / kinh độ của bạn là một hình chữ nhật có góc nghiêng một độ với tâm là Nhà thờ Winchester (51.0606, -1.3131) . Bạn cần một hộp giới hạn xung quanh điểm đó. Truy vấn MySQL này sẽ tạo ra một LINESTRING (văn bản) cho một dòng đi theo đường chéo qua hộp giới hạn đó.
SELECT
CONCAT('LINESTRING(',
latitude-0.5,' ',longitude-0.5,
',',
latitude+0.5 ,' ',longitude +0.5,
')') AS box
FROM (
SELECT 51.0606 AS latitude, -1.3131 AS longitude
) AS coord
Truy vấn giúp bạn có được điều này:
LINESTRING(50.5606 -1.8131,51.5606 -0.8131)
Bạn cũng có thể sử dụng xử lý chuỗi bằng ngôn ngữ máy chủ để tạo ra một loại chuỗi văn bản tương tự. Định dạng bạn cần là cái này.
LINESTRING(lat1 long1, lat2 long2)
Sau đó, bạn có thể sử dụng nó để tìm kiếm bảng không gian của mình như sau:
SELECT whatever, whatever
FROM flags
WHERE MBRContains(
GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
flags.coordinates)
Thao tác này sẽ khai thác chỉ mục không gian và tìm mọi hàng của flags
có tọa độ nằm trong hộp giới hạn của đường chéo đó.
Đây là một số tài liệu .
Nếu flags
của bạn bảng chứa ít hơn vài trăm nghìn hàng, bạn có thể thấy rằng một bảng thông thường (không phải bảng không gian) với các cột kinh độ và vĩ độ (kiểu dữ liệu FLOAT, được lập chỉ mục) cũng hoạt động tốt và dễ phát triển và gỡ lỗi hơn.
Tôi đã viết một bài hướng dẫn về kỹ thuật đó. http://www.plumislandmedia.net/mysql/haversine-mysql- địa điểm gần nhất /