(я создал прототип, используя Long / Lat для нахождения строк в радиусе, но теперь отказался от этого в пользу системы GridRef, доступной в Великобритании)
В качестве первого шага не используйте условие WHERE на основе вычисляемого поля (например, фактическое расстояние на основе заданной координаты и координаты строки).
Вместо этого попробуйте это:
- Представьте себе круг, где радиус = максимальное расстояние
- Нарисуйте рамку вокруг нее, используя кривые линии долготы.
- Найти предметы в этом ящике.
На практике это означает:
- определите, сколько градусов долготы соответствует вашему максимальному расстоянию на данной широте
- определите, сколько градусов широты представляет ваше максимальное расстояние на данной долготе (этот множитель будет фиксированным при использовании модели сферической земли).
- ВЫБРАТЬ * ОТ мест ГДЕ long> $ westside AND long <$ eastside AND lat <$ northside and lat> $ southside
Это означает, что вы делаете очень простые вычисления, чтобы получить неопределенное подмножество, покрывающее область примерно на 30% больше, чем ваш фактический круг. Если вы также хотите добавить текстовый поиск, либо ВЫБЕРИТЕ ОТ (подзапрос), либо добавьте текстовое предложение ПОСЛЕ простого сравнения выше, так как текстовый поиск требует больших вычислительных ресурсов.