Vâng, có một cách tốt hơn. Bạn cần sử dụng một chỉ số không gian . Các chỉ mục này tổ chức siêu dữ liệu về hình học để lọc ra hình học ở rất xa, tiết kiệm rất nhiều chu kỳ CPU bằng cách tránh các tính toán mà bạn mô tả. Bạn không nên tự mình thực hiện vì tất cả các cơ sở dữ liệu quan hệ chính đều cung cấp loại hình và chỉ mục hình học không gian đi kèm với chúng.
Những gì bạn muốn xem xét là các truy vấn "trong khoảng cách" (truy vấn cho hình học trong một khoảng cách nhất định của một số hình học khác). Đây là những vấn đề rất chuẩn và rất nhiều đã được giải quyết và có thể có trong tất cả các cơ sở dữ liệu trên (và được tích hợp vào một số):
- PostGIS:
ST_DWithin
- Máy chủ SQL:
STDistance
(Không rõ rằng chỉ mục sử dụng trên phiên bản địa lý 3D của chức năng này được hỗ trợ)
- Oracle:
SDO_WITHIN_DISTANCE
(Điều này không nói rõ ràng rằng nó sẽ kích hoạt việc sử dụng chỉ mục. Tôi sẽ kiểm tra lại kế hoạch truy vấn. Bạn có thể cần phải áp dụng mộtSDO_FILTER
để có được nó để sử dụng chỉ mục.)
- MySQL: Vẫn đang tìm ra điều này.
Giải pháp cho việc kích hoạt sử dụng chỉ mục
Trong trường hợp xấu nhất khi bạn gặp sự cố khiến hệ thống sử dụng chỉ mục không gian với các truy vấn này, bạn có thể thêm bộ lọc bổ sung. Bạn sẽ tạo một hộp giới hạn hình vuông có cạnh dài 2 * (khoảng cách tìm kiếm) tập trung tại điểm tìm kiếm của bạn và so sánh các hộp giới hạn của hình học bảng với điều đó trước khi kiểm tra khoảng cách thực tế. Đó là những gì PostGIS ' ST_DWithin
ở trên thực hiện trong nội bộ.
Khoảng cách trong GIS
Trong khi các chỉ số không gian là tuyệt vời và hoàn toàn là giải pháp phù hợp cho vấn đề của bạn, việc tính toán khoảng cách có thể trở nên phức tạp về mặt logic. Cụ thể, bạn cần lo lắng về phép chiếu nào (về cơ bản là tất cả các tham số cho hệ tọa độ), dữ liệu của bạn được lưu trữ. Hầu hết các phép chiếu 2D (những thứ khác ngoài hệ tọa độ góc như các phép chiếu lat / long khác nhau) làm biến dạng đáng kể độ dài. Ví dụ: phép chiếu Web Mercator (được sử dụng bởi Google, Bing và mọi nhà cung cấp bản đồ cơ sở chính khác) mở rộng các khu vực và khoảng cách ngày càng tăng khi vị trí nằm xa xích đạo hơn . Tôi có thể sai vì tôi không được giáo dục chính thức về GIS, nhưng điều tốt nhất tôi từng thấy cho các phép chiếu 2D là một số cách cụ thể hứa hẹn khoảng cách chính xác từ mộtđiểm duy nhất, không đổi trên toàn thế giới. (Không, việc sử dụng một phép chiếu khác nhau cho mỗi truy vấn là không thực tế; điều đó sẽ khiến các chỉ mục của bạn trở nên vô dụng.)
Điểm mấu chốt là bạn cần đảm bảo rằng toán học của bạn là chính xác. Cách đơn giản nhất để làm như vậy từ góc độ phát triển là sử dụng các phép chiếu góc (Chúng thường được gọi là "địa lý") và các hàm hỗ trợ làm toán bằng mô hình hình cầu, nhưng các tính toán này đắt hơn một chút so với các đối tác 2D và một số DB có thể không hỗ trợ lập chỉ mục chúng. Tuy nhiên, nếu bạn có thể có được hiệu suất chấp nhận được bằng cách sử dụng chúng, thì đó có lẽ là cách tốt nhất. Một tùy chọn phổ biến khác là các phép chiếu khu vực (như các vùng UTM) có cả khoảng cách và các khu vực khá gần để sửa nếu dữ liệu của bạn bị giới hạn ở một phần cụ thể của thế giới. Những gì tốt nhất cho ứng dụng của bạn sẽ phụ thuộc vào yêu cầu cụ thể của bạn,
Điều này áp dụng ngay cả khi bạn không sử dụng các chỉ mục không gian tích hợp. Dữ liệu của bạn có một số phép chiếu bất kể bạn đang sử dụng hoặc sử dụng công nghệ hoặc kỹ thuật nào trong tương lai và hiện tại nó đã ảnh hưởng đến bất kỳ truy vấn và tính toán nào bạn đang thực hiện.