Гибридная статическая/динамическая карта Google

Вы когда-нибудь замечали, что когда вы заходите на maps.google.com и выполняете поиск (скажем, автомойка), выдается много результатов (обозначенных маленькими кружками) и несколько заметных (обозначенных булавками обычного размера)?

Заметили, как быстро он это делает?

Из того, что я могу сказать из анализа этого в Firebug, большая часть этого создается на сервере и отправляется клиенту в виде статического изображения.

Тем не менее, он все еще динамичен. Вы по-прежнему можете увеличивать и уменьшать масштаб или щелкнуть результат и увидеть визуализированное динамическое информационное окно.

Google сделал карту быстрой и гладкой, используя статические изображения, но при этом сделав ее гибкой.

Есть ли способ сделать такую ​​«предварительную загрузку» с моей собственной картой Google (реализованной с помощью API Карт Google)?


person Jonathan    schedule 24.09.2009    source источник


Ответы (2)


Технология, которую использует maps.google.com, аналогична той, что используется в GLayer. Сервер динамически создает плитки и информацию о «горячих точках». Тайлы GLayer также создаются динамически (и, возможно, кэшируются), даже несмотря на то, что базовые данные довольно статичны. Со стороны клиента технология поиска точек идентична Википедии или Panoramio GLayer. Единственный новый трюк заключается в том, что информация о точках генерируется динамически на больших быстрых серверах Google.

API (пока) не предоставляет каких-либо инструментов для создания пользовательских GLayers. Если вы хотите сделать то же самое самостоятельно, используя свою собственную базу данных местоположений, вам нужно закодировать три шага:

  1. Создайте свой собственный тайловый сервер, который ищет в вашей базе данных элементы в области тайла и использует графическую библиотеку, такую ​​как gd или imagemagic, для размещения точек на тайле. Используйте эти плитки для создания GTileLayerOverlay на клиенте.

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

  3. Изменение курсора, когда мышь находится над точкой, является более сложной задачей. Что делает Google, так это возвращает список координат горячих точек для всех точек на каждой плитке. Всякий раз, когда мышь перемещается, API определяет, над какой плиткой находится указатель, и использует алгоритм дерева квадрантов, чтобы определить, находится ли указатель над горячей точкой, и при необходимости изменить курсор. Если у вас есть только небольшое количество горячих точек на плитку, то линейный поиск, вероятно, будет достаточно быстрым. Если у вас могут быть тысячи точек на плитку, вам, вероятно, потребуется написать собственный алгоритм дерева квадрантов. Код Google Quadtree скрыт, поэтому вы не можете его использовать.

Вот страница, где кто-то сделал все это. В этом случае горячие точки рассчитываются как круги путем сравнения расстояния от центральной точки, даже если точки квадратные. На maps.google.com горячие точки рассчитываются как прямоугольники с помощью GBounds.containsPoint(), несмотря на то, что точки круглые.

person Mike Williams    schedule 24.09.2009

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

Наш сайт не может использовать предварительную кластеризацию, потому что маркеры можно искать и фильтровать, но он по-прежнему довольно быстр, примерно до 20 000 маркеров. Все еще работаю над этим...

person Chris B    schedule 24.09.2009
comment
Эй Крис, звучит как удивительный сайт. У вас уже есть что-нибудь из этого в сети? Не могли бы вы прислать мне ссылку? - person Jonathan; 25.09.2009