Как maps.google.com так эффективно выбирает и отображает маркеры результатов поиска? - PullRequest
1 голос
/ 19 августа 2010

В последнее время я искал несколько способов отобразить большое количество маркеров на карте и подумал, что Google должен иметь очень эффективное решение этой проблемы (помимо огромных серверов!).Если вы наберете, скажем, «размещение» в строке поиска карты, на карте отобразится около 100 или около того точек (независимо от уровня масштабирования), и при увеличении определенного региона появится больше точек.Тем не менее, должно быть миллионы точек, которые попадают под поисковую метку «размещение», поэтому происходит значительный выбор маркеров.

Я предполагаю, что они должны использовать подход getBounds для фильтрации маркеров, когда пользователь увеличивает масштабв / перемещается, то, возможно, случайный выбор из этих маркеров.Тем не менее, это звучит потенциально неэффективно, так как вся база данных должна быть перелистана, чтобы выбрать только те точки, которые попадают в границы карты.Это просто огромная вычислительная мощность, которая делает Google Карты такими быстрыми (в большинстве случаев ...)?Или есть более эффективный способ выполнения запросов к базе данных такого типа, чем описанный выше подход?

Я создаю приложение Rails / Google Maps, которое я бы хотел масштабировать до более чеммиллион точек - я определенно не хочу отображать все точки одновременно, но я хотел бы разработать алгоритм быстрого поиска, который не обременителен для сервера, чтобы позволить (относительно небольшой) выбор точек отображаться накарта в любое время, аналогично тому, как это делает Google.Любые предложения будут наиболее ценными!

Ответы [ 3 ]

1 голос
/ 19 августа 2010

Вопрос можно разделить на 2 части:
1. Как выбрать точки для отображения.
2. Как быстро отобразить выбранные точки.

Выбор может быть сделан с использованием нескольких различных политик, например, в случае отелей, которые имеют пользовательские рейтинги, вы можете сначала выбрать те, которые имеют самый высокий рейтинг.Или, возможно, Google платят за расстановку приоритетов одних над другими.Но, скорее всего, это не сделано в режиме реального времени!(только догадываясь об этом)

Быстрое отображение достигается с помощью готовых пользовательских плиток.Маленькие красные точки - это не объекты-маркеры javascript, а пользовательские листы, например:

http://mt3.google.com/mapslt?lyrs=lmq:1000:hotel|cc:US|h:18b|s:115968771510351694523,m%40130&x=2&y=5&z=4&w=256&h=256&hl=en&style=18,28

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

0 голосов
/ 19 августа 2010

Вам нужен пространственный индекс для ваших данных. В SQL Server 2008 встроена эта функциональность. Если в вашей базе данных нет, то вам нужно сгенерировать «номер плитки» из ваших координат и индексировать по нему. Например, номер вашей плитки должен быть уникальным для каждой точки в пределах 1 км квадрата. Вы ищете по номеру плитки для плиток, отображаемых в данный момент в представлении, и у вас должен быть эффективный поиск.

0 голосов
/ 19 августа 2010

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

...