MySQL Lat / Lng Граница с равномерным распределением результатов - PullRequest
2 голосов
/ 27 июня 2010

В приложении карты я отображаю маркеры на карте на основе видимой области карты, используя запрос, подобный следующему.

SELECT * FROM (`properties`) 
WHERE `lat` > '-11.824448' AND `lat` < '84.124002' AND 
      `lng` > '-152.243398' AND `lng` < '-39.743398'   
LIMIT 20;

Из-за индекса на таблице это приводит к результатам, появляющимся обычнотой же широты и появляются на линии в углу карты.остальная часть карты пуста.

Учитывая, что я не могу отобразить все результаты на карте из-за нагрузки на сервер, пропускной способности и времени загрузки, есть ли способ вернуть результаты по всей области карты?

Я думаю, я мог бы сделать это, вычислив пропорциональное расстояние от x и сказав mysql, чтобы он возвращал результаты, если результат не находится на расстоянии x от другого.

Как это делают другие?

Ответы [ 2 ]

1 голос
/ 27 июня 2010

Если у вас будут тысячи свойств, вы можете рассмотреть возможность кластеризации ваших свойств в базе данных. То есть, определяя, на каком уровне масштабирования должно отображаться каждое свойство, вы можете кластеризовать точки, чтобы уменьшить отображаемую величину за раз.

Один из подходов может состоять в том, чтобы использовать другую таблицу, возможно, назвав ее properties_clusters, со следующими полями: lat, lng, number_of_points, zoom_level. Убедитесь, что поле zoom_level также содержит пригодный для использования индекс.

Всякий раз, когда вы вставляете или перемещаете свойство, вам также следует обновить таблицу properties_clusters. Возможно, вы захотите немного изучить возможные алгоритмы кластеризации, но если точность не так важна, вы, вероятно, могли бы найти простое решение, например, тесселяция мира по количеству плиток для каждого уровня масштабирования, а затем просто кластеризовать соответственно. .

Затем, когда изменяется видимая область или уровень масштабирования карты, вы можете запросить данные из таблицы properties_clusters, которая будет возвращать меньшее количество точек при уменьшении уровня масштабирования:

SELECT * FROM (`properties_clusters`) 
WHERE `lat` > '-11.824448' AND `lat` < '84.124002' AND 
      `lng` > '-152.243398' AND `lng` < '-39.743398' AND
      `zoom_level` = 5

Вы можете определить порог уровня масштабирования, из которого вы будете отображать результаты непосредственно из таблицы properties. Этот порог обычно устанавливается на уровне масштабирования, при котором можно взаимодействовать с маркерами на карте (нажимая на них и т. Д.).

0 голосов
/ 27 июня 2010

'ORDER BY RAND ()', кажется, выполняет достаточно хорошую работу, не становясь слишком сложным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...