Я не думаю, что на это есть однозначный ответ. Обычно это вопрос о том, как организовать ваши данные так, чтобы они использовали пространственную локальность, присущую вашей проблеме.
Первая идея, которая приходит мне в голову, - использовать сетку, назначить каждую точку квадрату и выбрать квадрат, в котором находится точка, и те, что вокруг него. Если мы говорим о бесконечных сетках, тогда используйте хеш-значение квадрата, это даст вам больше очков, чем необходимо (там, где у вас есть коллизии), но все равно уменьшит количество на кучу. Конечно, это не сразу применимо к полигонам, это просто мозговой штурм. Возможный подход, который может привести к слишком большому количеству коллизий, заключался бы в том, чтобы объединить все хешированные значения по ИЛИ и выбрать все записи, в которых хэши с AND с этим значением не равны нулю (не уверен, возможно ли это в MySQL), вы можете использовать большой количество бит хотя.
Проблема с этим подходом заключается в том, что если мы говорим о сферических координатах (широта, как правило, long), это сингулярности, поскольку «квадраты» сетки сужаются по мере приближения к полюсам. Самый простой способ - не ставить точки близко к полюсам ... :)
person
falstro
schedule
14.12.2009