Cách tốt nhất để xử lý các tìm kiếm vùng lân cận là bắt đầu với một số loại ước lượng hình chữ nhật có giới hạn, sau đó đi từ đó đến khoảng cách vòng tròn lớn thực tế giữa mọi người.
Miễn là vĩ độ của bạn không quá gần các cực, thì một phép gần đúng cẩu thả nhưng khả thi cho khoảng cách giữa hai điểm là thế này (trong SQLish):
GREATEST(ABS(lat1-lat2),ABS(long1-long2))
Nếu bạn muốn chính xác hơn và bạn biết rằng bạn chỉ quan tâm đến những người ở bên trong, hãy nói rằng, cách nhau 10 km, bạn có thể sử dụng tìm kiếm hình chữ nhật có giới hạn như thế này.
WHERE latitude_from_table
BETWEEN latpoint - (10.0 / 111.045)
AND latpoint + (10.0 / 111.045)
AND longitude_from_table
BETWEEN longpoint - (10.0 / (111.045 * COS(RADIANS(latpoint))))
AND longpoint + (10.0 / (111.045 * COS(RADIANS(latpoint))))
Điều này hoạt động vì có 111,045 km ở một độ vĩ độ. Các thuật ngữ cosin trong giới hạn kinh độ giải thích cho thực tế là các đường vĩ độ gần nhau hơn khi bạn đến gần các cực. Điều này cho phép bạn khai thác các chỉ mục MySQL trên các cột latitude_from_table và longitude_from_table.
Khi bạn đã có khoảng cách hộp giới hạn, bạn có thể áp dụng công thức khoảng cách vòng tròn tuyệt vời. Đây là thông tin cơ bản về điều đó. http://www.plumislandmedia.net/mysql/haversine-mysql- địa điểm gần nhất /
Đối với loại ứng dụng bạn đang xem xét, dấu chấm động IEEE-488 32-bit rất chính xác cho tọa độ của bạn. Nếu các điểm bạn đang xem thực sự gần nhau (dưới một km hoặc lâu hơn), bạn muốn sử dụng công thức Vincenty (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) thay vì cái gọi là công thức hasrsine phổ biến hơn ( http://www.plumislandmedia.net/mysql/stored- Chức năng-haversine-distance-computation/ ).
Nếu số lượng người của bạn vượt quá 300K, bạn có thể muốn xem xét sử dụng lược đồ lập chỉ mục không gian địa lý MySQL. Nó chỉ hoạt động với bảng MyISAM, nhưng nó rất nhanh chóng thực hiện tìm kiếm hình chữ nhật giới hạn. Xem tại đây. http://www.plumislandmedia.net/mysql/haversine-mysql- địa điểm gần nhất /