Обновление приложения Maps JavaScript API с версии V2 до версии V3
Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Maps JavaScript API v2 больше не доступен с 26 мая 2021 года. В результате карты v2 вашего сайта перестанут работать и будут возвращать ошибки JavaScript. Чтобы продолжить использовать карты на вашем сайте, перейдите на Maps JavaScript API v3. Это руководство поможет вам в этом процессе.
Обзор
Процесс миграции для каждого приложения будет немного отличаться, однако есть некоторые шаги, общие для всех проектов:
- Получите новый ключ. Теперь Maps JavaScript API использует консоль Google Cloud для управления ключами. Если вы все еще используете ключ v2, обязательно получите новый ключ API перед началом миграции.
- Обновите свой API Bootstrap. Большинство приложений будут загружать Maps JavaScript API v3 с помощью следующего кода:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
- Обновите свой код. Объем требуемых изменений будет во многом зависеть от вашего приложения. Распространенные изменения включают:
- Всегда ссылайтесь на пространство имен google.maps. В v3 весь код Maps JavaScript API хранится в пространстве имен
google.maps.*
вместо глобального пространства имен. Большинство объектов также были переименованы в рамках этого процесса. Например, вместо GMap2
теперь вы будете загружать google.maps.Map
. - Удалите все ссылки на устаревшие методы. Ряд методов утилит общего назначения были удалены, такие как
GDownloadURL
и GLog
. Либо замените эту функциональность сторонними библиотеками утилит, либо удалите эти ссылки из вашего кода. - (Необязательно) Добавьте библиотеки в свой код. Многие функции были вынесены в служебные библиотеки, так что каждому приложению придется загружать только те части API, которые будут использоваться.
- (Необязательно) Настройте свой проект для использования v3 externs. v3 externs можно использовать для проверки кода с помощью Closure Compiler или для запуска автозаполнения в вашей IDE. Узнайте больше о Advanced Compilation и Externs .
- Тестируйте и повторяйте. На этом этапе вам все еще предстоит кое-какая работа, но хорошая новость в том, что вы будете на пути к своему новому приложению v3 maps!
Изменения в V3 Maps JavaScript API
Перед планированием миграции вам следует уделить время изучению различий между Maps JavaScript API v2 и Maps JavaScript API v3. Новейшая версия Maps JavaScript API была написана с нуля с упором на современные методы программирования JavaScript, более широкое использование библиотек и упрощенный API. В API было добавлено много новых функций, а несколько знакомых функций были изменены или даже удалены. В этом разделе рассматриваются некоторые ключевые различия между двумя выпусками.
Некоторые изменения в API v3 включают в себя:
- Оптимизированная основная библиотека. Многие из дополнительных функций были перемещены в библиотеки , что помогает сократить время загрузки и анализа для Core API, что позволяет вашей карте быстро загружаться на любом устройстве.
- Улучшена производительность ряда функций, таких как рендеринг полигонов и размещение маркеров.
- Новый подход к ограничениям использования на стороне клиента для лучшего учета общих адресов, используемых мобильными прокси-серверами и корпоративными брандмауэрами.
- Добавлена поддержка нескольких современных браузеров и мобильных браузеров. Поддержка Internet Explorer 6 удалена.
- Удалены многие универсальные вспомогательные классы (
GLog
или GDownloadUrl
). Сегодня существует множество отличных библиотек JavaScript, которые предоставляют схожую функциональность, например, Closure или jQuery . - Реализация просмотра улиц на HTML5, которая загружается на любом мобильном устройстве.
- Пользовательские панорамы Street View с вашими собственными фотографиями, позволяющие вам делиться панорамами горнолыжных склонов, домов на продажу или других интересных мест.
- Настройки стилизованных карт позволяют изменять отображение элементов на базовой карте в соответствии с вашим уникальным визуальным стилем.
- Поддержка нескольких новых сервисов, таких как ElevationService и Distance Matrix .
- Улучшенные службы маршрутов предоставляют альтернативные маршруты, оптимизацию маршрутов (приблизительные решения задачи коммивояжера ), велосипедные маршруты (со слоем велосипедистов ), транзитные маршруты и перетаскиваемые маршруты .
- Обновленный формат геокодирования, предоставляющий более точную информацию о типе , чем значение
accuracy
из Geocoding API v2. - Поддержка нескольких информационных окон на одной карте
Ваш новый ключ
Maps JavaScript API v3 использует новую систему ключей из v2. Возможно, вы уже используете ключ v3 в своем приложении, в этом случае никаких изменений не требуется. Чтобы проверить, проверьте URL-адрес, с которого вы загружаете Maps JavaScript API, на предмет его параметра key
. Если значение ключа начинается с «ABQIAA», вы используете ключ v2. Если у вас есть ключ v2, вы должны обновиться до ключа v3 в рамках миграции, что позволит:
Ключ передается при загрузке Maps JavaScript API v3. Подробнее о генерации ключей API .
Обратите внимание, что если вы являетесь клиентом Google Maps APIs for Work, вы можете использовать идентификатор клиента с параметром client
вместо параметра key
. Идентификаторы клиентов по-прежнему поддерживаются в Maps JavaScript API v3 и не требуют прохождения процесса обновления ключа.
Загрузить API
Первое изменение, которое вам нужно будет сделать в вашем коде, касается способа загрузки API. В v2 вы загружаете Maps JavaScript API через запрос к http://maps.google.com/maps
. Если вы загружаете Maps JavaScript API v3, вам нужно будет внести следующие изменения:
- Загрузите API с
//maps.googleapis.com/maps/api/js
- Удалить параметр
file
. - Обновите параметр
key
с помощью нового ключа v3. Клиенты Google Maps APIs for Work должны использовать параметр client
. - (Только для премиум-плана платформы Google Карт) Убедитесь, что параметр
client
указан так, как описано в Руководстве разработчика премиум-плана платформы Google Карт . - Удалите параметр
v
, чтобы запросить последнюю выпущенную версию, или измените его значение в соответствии со схемой управления версиями v3 . - (Необязательно) Замените параметр
hl
на language
и сохраните его значение. - (Необязательно) Добавьте параметр
libraries
для загрузки дополнительных библиотек .
В простейшем случае загрузчик v3 укажет только ваш параметр ключа API:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
В приведенном ниже примере запрашивается последняя версия Maps JavaScript API v2 на немецком языке:
<script src="//maps.google.com/maps?file=api&v=2.x&key=YOUR_API_KEY&hl=de"></script>
Приведенный ниже пример представляет собой эквивалентный запрос для v3.
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&language=de"></script>
Пространство имен google.maps
Вероятно, наиболее заметным изменением в Maps JavaScript API v3 является введение пространства имен google.maps
. API v2 по умолчанию помещает все объекты в глобальное пространство имен, что может привести к конфликтам имен. В v3 все объекты располагаются в пространстве имен google.maps
.
При миграции вашего приложения на v3 вам придется изменить свой код, чтобы использовать новое пространство имен. К сожалению, поиск "G" и замена на "google.maps." не будет работать полностью; но это хорошее практическое правило, которое можно применять при просмотре вашего кода. Ниже приведены некоторые примеры эквивалентных классов в v2 и v3.
v2 |
v3 |
GMap2 |
google.maps.Map |
GLatLng |
google.maps.LatLng |
GInfoWindow |
google.maps.InfoWindow |
GMapOptions |
google.map.MapOptions |
G_API_VERSION |
google.maps.version |
GPolyStyleOptions |
google.maps.PolygonOptions or
google.maps.PolylineOptions |
Удалить устаревший код
Maps JavaScript API v3 имеет параллели для большинства функций в v2; однако есть некоторые классы, которые больше не поддерживаются. В рамках миграции вам следует либо заменить эти классы сторонними библиотеками утилит, либо удалить эти ссылки из вашего кода. Существует множество отличных библиотек JavaScript, которые предоставляют схожие функции, например, Closure или jQuery .
Следующие классы не имеют аналогов в Maps JavaScript API v3:
GBounds | GLanguage |
GBrowserIsCompatible | GLayer |
GControl | GLog |
GControlAnchor | GMercatorProjection |
GControlImpl | GNavLabelControl |
GControlPosition | GObliqueMercator |
GCopyright | GOverlay |
GCopyrightCollection | GPhotoSpec |
GDownloadUrl | GPolyEditingOptions |
GDraggableObject | GScreenOverlay |
GDraggableObjectOptions | GStreetviewFeatures |
GFactualGeocodeCache | GStreetviewLocation |
GGeoAddressAccuracy | GStreetviewOverlay |
GGeocodeCache | GStreetviewUserPhotosOptions |
GGoogleBar | GTileLayerOptions |
GGoogleBarAdsOptions | GTileLayerOverlayOptions |
GGoogleBarLinkTarget | GTrafficOverlayOptions |
GGoogleBarListingTypes | GUnload |
GGoogleBarOptions | GXml |
GGoogleBarResultList | GXmlHttp |
GInfoWindowTab | GXslt |
GKeyboardHandler |
|
Сравнить код
Ниже приведено сравнение двух приложений, написанных с использованием API v2 и v3.
<!DOCTYPE html>
<html>
<head>
<script src="//maps.google.com/maps?file=api&v=2&key=YOUR_API_KEY"></script>
<style>
html, body, #map { height: 100%; margin: 0; }
</style>
<script>
function initialize() {
if (GBrowserIsCompatible()) {
var map = new GMap2(
document.getElementById('map'));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
map.setUIToDefault();
map.addOverlay(new GMarker(new GLatLng(37.4419, -122.1419)));
}
}
</script>
</head>
<body onload="initialize()" onunload="GUnload()">
<div id="map"></div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
<style>
html, body, #map { height: 100%; margin: 0; }
</style>
<script>
function initialize() {
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(37.4419, -122.1419),
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
position: new google.maps.LatLng(37.4419, -122.1419),
map: map
});
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>
Как вы можете видеть, между двумя приложениями есть несколько различий. Среди заметных изменений:
- Изменился адрес, с которого загружается API.
- Методы
GBrowserIsCompatible()
и GUnload()
больше не требуются в v3 и были удалены из API. - Объект
GMap2
заменен на google.maps.Map
как центральный объект в API. - Свойства теперь загружаются через классы Options. В приведенном выше примере мы задаем три свойства, необходимые для загрузки карты —
center
, zoom
и mapTypeId
— с помощью встроенного объекта MapOptions
. - Пользовательский интерфейс по умолчанию включен в v3. Вы можете отключить его, установив свойство
disableDefaultUI
в значение true в объекте MapOptions
.
Краткое содержание
На этом этапе вы уже познакомились с некоторыми ключевыми моментами, связанными с вашей миграцией с v2 на v3 Maps JavaScript API. Вам может понадобиться дополнительная информация, но она будет зависеть от вашего приложения. В следующих разделах мы включили инструкции по миграции для конкретных случаев, с которыми вы можете столкнуться. Кроме того, есть несколько ресурсов, которые могут оказаться полезными в процессе обновления.
Если у вас возникли какие-либо проблемы или вопросы по этому документу, воспользуйтесь ссылкой ОТПРАВИТЬ ОТЗЫВ в верхней части этой страницы.
В этом разделе представлено подробное сравнение самых популярных функций для v2 и v3 Maps JavaScript API. Каждый раздел справочника предназначен для индивидуального чтения. Мы рекомендуем вам не читать этот справочник целиком; вместо этого используйте этот материал для помощи в миграции в каждом конкретном случае.
- События - регистрация и обработка событий.
- Элементы управления — манипулирование навигационными элементами управления, отображаемыми на карте.
- Наложения — добавление и редактирование объектов на карте.
- Типы карт — фрагменты, из которых состоит базовая карта.
- Слои — добавление и редактирование контента как группы, например, слоев KML или трафика.
- Сервисы — работа с геокодированием Google, маршрутами или службами Street View.
События
Модель событий для Maps JavaScript API v3 аналогична той, что использовалась в v2, хотя многое изменилось внутри.
Новое мероприятие для поддержки MVC
API v3 добавляет новый тип событий для отражения изменений состояния MVC. Теперь есть два типа событий:
- Пользовательские события (например, события мыши "щелчок") передаются из DOM в Maps JavaScript API. Эти события являются отдельными и отличными от стандартных событий DOM.
- Уведомления об изменении состояния MVC отражают изменения в объектах API Карт и именуются с использованием соглашения
property _changed
.
Каждый объект API Карт экспортирует ряд именованных событий. Приложения, заинтересованные в определенных событиях, должны регистрировать прослушиватели событий для этих событий и выполнять код при получении этих событий. Этот механизм, управляемый событиями, одинаков в API JavaScript Карт v2 и v3, за исключением того, что пространство имен изменилось с GEvent
на google.maps.event
:
GEvent.addListener(map, 'click', function() {
alert('You clicked the map.');
});
google.maps.event.addListener(map, 'click', function() {
alert('You clicked the map.');
});
Удалить прослушиватели событий
Из соображений производительности лучше всего удалять прослушиватель событий, когда он больше не нужен. Удаление прослушивателя событий работает одинаково в v2 и v3:
- При создании прослушивателя событий возвращается непрозрачный объект ( GEventListener в v2, MapsEventListener в v3).
- Если вы хотите удалить прослушиватель событий, передайте этот объект методу
removeListener()
( GEvent.removeListener()
в v2 или google.maps.event.removeListener()
в v3), чтобы удалить прослушиватель событий.
Слушайте события DOM
Если вы хотите захватывать и реагировать на события DOM (Document Object Model), v3 предоставляет статический метод google.maps.event.addDomListener()
, эквивалентный методу GEvent.addDomListener()
в v2.
Используйте переданные аргументы в событиях
События пользовательского интерфейса часто передают аргумент события, к которому затем может получить доступ прослушиватель событий. Большинство аргументов событий в v3 были упрощены, чтобы быть более согласованными с объектами в API. (Подробности см. в Справочнике v3 .)
В прослушивателях событий v3 нет аргумента overlay
. Если вы регистрируете событие click
на карте v3, обратный вызов будет происходить только тогда, когда пользователь щелкнет по базовой карте. Вы можете зарегистрировать дополнительные обратные вызовы на кликабельных наложениях, если вам нужно реагировать на эти щелчки.
// Passes an overlay argument when clicking on a map
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
map.setUIToDefault();
GEvent.addListener(map,'click', function(overlay, latlng) {
if (latlng) {
var marker = new GMarker(latlng);
map.addOverlay(marker);
}
});
// Passes only an event argument
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
google.maps.event.addListener(map, 'click', function(event) {
var marker = new google.maps.Marker({
position: event.latLng,
map: map
});
});
Управление
Maps JavaScript API отображает элементы управления пользовательского интерфейса, которые позволяют пользователям взаимодействовать с вашей картой. Вы можете использовать API для настройки того, как эти элементы управления будут выглядеть.
Изменения в типах контроля
В API v3 были внесены некоторые изменения в типы элементов control
.
- API v3 поддерживает дополнительные типы карт, включая карты рельефа и возможность добавлять пользовательские типы карт.
- Иерархический элемент управления v2,
GHierarchicalMapTypeControl
, больше не доступен. Вы можете добиться похожего эффекта, используя элемент управления google.maps.MapTypeControlStyle.HORIZONTAL_BAR
. - Горизонтальная компоновка, предоставляемая
GMapTypeControl
в v2, недоступна в v3.
Добавить элементы управления на карту
С Maps JavaScript API v2 вы можете добавлять элементы управления на карту с помощью метода addControl()
вашего объекта карты. В v3 вместо прямого доступа к элементам управления или их изменения вы изменяете связанный объект MapOptions
. В примере ниже показано, как настроить карту для добавления следующих элементов управления:
- кнопки, позволяющие пользователю переключаться между доступными типами карт
- масштаб карты
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
// Add controls
map.addControl(new GMapTypeControl());
map.addControl(new GScaleControl());
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP,
// Add controls
mapTypeControl: true,
scaleControl: true
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
Расположение элементов управления на карте
Позиционирование элементов управления сильно изменилось в v3. В v2 метод addControl()
принимает необязательный второй параметр, который позволяет указать положение элемента управления относительно углов карты.
В v3 вы устанавливаете положение элемента управления через свойство position
опций элемента управления. Позиционирование этих элементов управления не является абсолютным; вместо этого API размещает элементы управления разумно, «обтекая» их вокруг существующих элементов карты в рамках заданных ограничений (таких как размер карты). Этот макет гарантирует, что элементы управления по умолчанию совместимы с вашими элементами управления. См. Позиционирование элементов управления в v3 для получения дополнительной информации.
Следующий код изменяет расположение элементов управления из приведенных выше примеров:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
// Add map type control
map.addControl(new GMapTypeControl(), new GControlPosition(
G_ANCHOR_TOP_LEFT, new GSize(10, 10)));
// Add scale
map.addControl(new GScaleControl(), new GControlPosition(
G_ANCHOR_BOTTOM_RIGHT, new GSize(20, 20)));
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP,
// Add map type control
mapTypeControl: true,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.TOP_LEFT
},
// Add scale
scaleControl: true,
scaleControlOptions: {
position: google.maps.ControlPosition.BOTTOM_RIGHT
}
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
Пользовательские элементы управления
Используйте API JavaScript Карт для создания пользовательских элементов управления навигацией. Чтобы настроить элементы управления с помощью API v2, вы должны создать подкласс класса GControl
и определить обработчики для методов initialize()
и getDefaultPosition()
. В v3 нет эквивалента классу GControl
. Вместо этого элементы управления представлены как элементы DOM. Чтобы добавить пользовательский элемент управления с помощью API v3, создайте структуру DOM для элемента управления в конструкторе как дочерний элемент Node
(например, элемент <div>
) и добавьте прослушиватели событий для обработки любых событий DOM. Поместите Node
в массив controls[ position ]
карты, чтобы добавить экземпляр пользовательского элемента управления на карту.
При наличии реализации класса HomeControl
, которая соответствует требованиям интерфейса, указанным выше (подробности см. в документации по пользовательским элементам управления ), следующие примеры кода показывают, как добавить пользовательский элемент управления на карту.
map.addControl(new HomeControl(),
GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 10)));
var homeControlDiv = document.createElement('DIV');
var homeControl = new HomeControl(homeControlDiv, map);
map.controls[google.maps.ControlPosition.TOP_RIGHT].push(
homeControlDiv);
Накладки
Наложения отображают объекты, которые вы «добавляете» на карту для обозначения точек, линий, областей или совокупностей объектов.
Добавить и удалить наложения
Типы объектов, представленных наложением, одинаковы в версиях 2 и 3, однако обрабатываются они по-разному.
Наложения в API v2 добавлялись и удалялись с карты с помощью методов addOverlay()
и removeOverlay()
объекта GMap2
. В v3 вы назначаете карту наложению с помощью свойства map
связанного класса параметров наложения. Вы также можете добавлять или удалять наложение напрямую, вызывая метод setMap()
объекта наложения и указывая нужную карту. Установите свойство map в null
, чтобы удалить наложение.
В v3 нет метода clearOverlays()
. Если вы хотите управлять набором наложений, вам следует создать массив для хранения наложений. Используя этот массив, вы можете затем вызвать setMap()
для каждого наложения в массиве (передавая null
, если вам нужно их удалить).
Перетаскиваемые маркеры
По умолчанию маркеры можно кликать, но нельзя перетаскивать. Следующие два примера добавляют перетаскиваемый маркер:
var myLatLng = new GLatLng(-25.363882, 131.044922);
var map = new GMap2(document.getElementById('map'));
map.setCenter(myLatLng, 4);
var marker = new GMarker(latLng, {
draggable: true
});
map.addOverlay(marker);
var myLatLng = new google.maps.LatLng(-25.363882, 131.044922);
var map = new google.maps.Map(
document.getElementById('map'), {
center: myLatLng,
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
position: myLatLng,
draggable: true,
map: map
});
Иконки
Вы можете определить пользовательский значок, который будет отображаться вместо маркера по умолчанию. Чтобы использовать пользовательское изображение в v2, вы можете создать экземпляр GIcon
из G_DEFAULT_ICON type
и изменить его. Если ваше изображение больше или меньше значка по умолчанию, вы должны указать его с помощью экземпляра GSize
. API v3 немного упрощает этот процесс. Просто установите свойство icon
маркера на URL вашего пользовательского изображения, и API автоматически изменит размер значка.
Maps JavaScript API также обеспечивает поддержку сложных иконок. Сложный значок может включать несколько плиток, сложные формы или указывать «порядок стека» того, как изображения должны отображаться относительно других наложений. Чтобы добавить фигуру к маркеру в v2, необходимо указать дополнительное свойство в каждом экземпляре GIcon
и передать его как параметр конструктору GMarker
. В v3 иконки, указанные таким образом, должны устанавливать свои свойства icon
для объекта типа Icon
. Тени маркеров не поддерживаются в v3.
В следующих примерах показан пляжный флаг на пляже Бонди в Австралии, при этом прозрачная часть значка неактивна:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
map.setUIToDefault();
var flagIcon = new GIcon(G_DEFAULT_ICON);
flagIcon.image = '/images/beachflag.png';
flagIcon.imageMap = [1, 1, 1, 20, 18, 20, 18 , 1];
var bbLatLng = new GLatLng(-33.890542, 151.274856);
map.addOverlay(new GMarker(bbLatLng, {
icon: flagIcon
}));
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var shape = {
coord: [1, 1, 1, 20, 18, 20, 18 , 1],
type: 'poly'
};
var bbLatLng = new google.maps.LatLng(-33.890542, 151.274856);
var bbMarker = new google.maps.Marker({
icon: '/images/beachflag.png'
shape: shape,
position: bbLatLng,
map: map
});
Полилинии
Полилиния состоит из массива LatLng
s, а также серии линейных сегментов, которые соединяют эти местоположения в упорядоченной последовательности. Создание и отображение объекта Polyline
в v3 похоже на использование объекта GPolyline
в v2. Следующие примеры рисуют полупрозрачную геодезическую полилинию шириной 3 пикселя от Цюриха до Сиднея через Сингапур:
var polyline = new GPolyline(
[
new GLatLng(47.3690239, 8.5380326),
new GLatLng(1.352083, 103.819836),
new GLatLng(-33.867139, 151.207114)
],
'#FF0000', 3, 0.5, {
geodesic: true
});
map.addOverlay(polyline);
var polyline = new google.maps.Polyline({
path: [
new google.maps.LatLng(47.3690239, 8.5380326),
new google.maps.LatLng(1.352083, 103.819836),
new google.maps.LatLng(-33.867139, 151.207114)
],
strokeColor: '#FF0000',
strokeOpacity: 0.5,
strokeWeight: 3,
geodesic: true
});
polyline.setMap(map);
Кодированные полилинии
В v3 нет поддержки для создания объектов Polyline
напрямую из закодированных полилиний . Вместо этого библиотека Geometry Library предоставляет методы для кодирования и декодирования полилиний. См. раздел Библиотеки в API Карт v3 для получения дополнительной информации о том, как загрузить эту библиотеку.
В приведенных ниже примерах рисуется одна и та же закодированная полилиния; код v3 использует метод decodePath()
из пространства имен google.maps.geometry.encoding
.
var polyline = new GPolyline.fromEncoded({
points: 'kwb`Huqbs@ztzwGgvpdQbw}uEoif`H',
levels: 'PPP',
zoomFactor: 2,
numLevels: 18,
color: '#ff0000',
opacity: 0.8,
weight: 3
});
map.addOverlay(polyline);
var polyline = new google.maps.Polyline({
path: google.maps.geometry.encoding.decodePath(
'kwb`Huqbs@ztzwGgvpdQbw}uEoif`H'),
strokeColor: '#FF0000',
strokeOpacity: 0.5,
strokeWeight: 3,
});
polyline.setMap(map);
Полигоны
Polygon определяет область внутри замкнутого контура. Подобно объекту Polyline
, объекты Polygon
состоят из ряда точек в упорядоченной последовательности. Класс Polygon
v3 во многом аналогичен классу GPolygon
v2, с тем заметным исключением, что вам больше не нужно повторять начальную вершину в конце пути, чтобы замкнуть контур. API v3 автоматически закроет все полигоны, рисуя линию, соединяющую последнюю координату с первой координатой. Следующие фрагменты кода создают полигон, представляющий Бермудский треугольник:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(24.886436, -70.268554), 5);
var bermudaTriangle = new GPolygon(
[
new GLatLng(25.774252, -80.190262),
new GLatLng(18.466465, -66.118292),
new GLatLng(32.321384, -64.75737),
new GLatLng(25.774252, -80.190262)
],
'#FF0000', 2, 0.8, '#FF0000', 0.35);
map.addOverlay(bermudaTriangle);
var map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(24.886436, -70.268554),
mapTypeId: google.maps.MapTypeId.TERRAIN,
zoom: 5
});
var bermudaTriangle = new google.maps.Polygon({
paths: [
new google.maps.LatLng(25.774252, -80.190262),
new google.maps.LatLng(18.466465, -66.118292),
new google.maps.LatLng(32.321384, -64.75737)
],
strokeColor: '#FF0000',
strokeWeight: 2,
strokeOpacity: 0.8,
fillColor: '#FF0000',
fillOpacity: 0.35
});
bermudaTriangle.setMap(map);
Формы, редактируемые пользователем
Полилинии и многоугольники можно сделать редактируемыми пользователем. Следующие фрагменты кода эквивалентны:
map.addOverlay(polyline);
polyline.enableEditing();
polyline.setMap(map);
polyline.setEditable(true);
Более расширенные возможности рисования см. в библиотеке рисования в документации v3.
Информация Окна
InfoWindow
отображает содержимое в плавающем окне над картой. Есть несколько ключевых различий между информационными окнами v2 и v3:
- API v2 поддерживает только
GInfoWindow
на карту, тогда как API v3 поддерживает несколько одновременных InfoWindow
на каждой карте. - Окно v3
InfoWindow
останется открытым при щелчке по карте. Окно v2 GInfoWindow
автоматически закрывается при щелчке по карте. Вы можете эмулировать поведение v2, добавив прослушиватель click
на объект Map
. - API v3 не обеспечивает встроенной поддержки вкладок
InfoWindow
.
Наземные наложения
Чтобы разместить изображение на карте, следует использовать объект GroundOverlay
. Конструктор для GroundOverlay
по сути одинаков в v2 и v3: он указывает URL изображения и границы изображения в качестве параметров.
В следующем примере старинная карта Ньюарка, штат Нью-Джерси, помещена на карту в качестве наложения:
var bounds = new GLatLngBounds(
new GLatLng(40.716216, -74.213393),
new GLatLng(40.765641, -74.139235));
var overlay = new GGroundOverlay(
'http://lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
bounds);
map.addOverlay(overlay);
var bounds = new google.maps.LatLngBounds(
new google.maps.LatLng(40.716216, -74.213393),
new google.maps.LatLng(40.765641, -74.139235));
var overlay = new google.maps.GroundOverlay(
'http://lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
bounds);
overlay.setMap(map);
Типы карт
Типы карт, доступные в v2 и v3, немного отличаются, но все основные типы карт доступны в обеих версиях API. По умолчанию v2 использует стандартные «нарисованные» плитки дорожной карты. Однако v3 требует указания определенного типа карты при создании объекта google.maps.Map
.
Распространенные типы карт
Четыре основных типа карт доступны как в v2, так и в v3:
-
MapTypeId.ROADMAP
(заменяет G_NORMAL_MAP
) отображает вид дорожной карты. -
MapTypeId.SATELLITE
(заменяет G_SATELLITE_MAP
) отображает спутниковые снимки Google Earth. -
MapTypeId.HYBRID
(заменяет G_HYBRID_MAP
) отображает смесь обычного и спутникового видов. -
MapTypeId.TERRAIN
(заменяет G_PHYSICAL_MAP
) отображает физическую карту на основе информации о рельефе местности.
Ниже приведен пример v2 и v3, устанавливающих карту в режим просмотра рельефа:
map.setMapType(G_PHYSICAL_MAP);
map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
Maps JavaScript API v3 также внес несколько изменений в менее распространенные типы карт:
- Плитки карт для небесных тел, отличных от Земли, не доступны как типы карт в API v3, но могут быть доступны как пользовательские типы карт. Для примера см. этот пример пользовательских типов карт .
- В v3 нет специального типа карты, который заменяет тип
G_SATELLITE_3D_MAP
из v2. Вместо этого вы можете интегрировать плагин Google Earth в ваши карты v3 с помощью этой библиотеки .
Максимальное увеличение изображения
Спутниковые снимки не всегда доступны при высоких уровнях масштабирования. Если вы хотите узнать максимальный доступный уровень масштабирования перед установкой уровня масштабирования, используйте класс google.maps.MaxZoomService
. Этот класс заменяет метод GMapType.getMaxZoomAtLatLng()
из v2.
var point = new GLatLng(
180 * Math.random() - 90, 360 * Math.random() - 180);
var map = new GMap2(document.getElementById("map"));
map.setUIToDefault();
map.setCenter(point);
map.setMapType(G_HYBRID_MAP);
map.getCurrentMapType().getMaxZoomAtLatLng(point,
function(response) {
if (response.status) {
map.setZoom(response.zoom);
} else {
alert("Error in Max Zoom Service.");
}
});
var myLatlng = new google.maps.LatLng(
180 * Math.random() - 90, 360 * Math.random() - 180);
var map = new google.maps.Map(
document.getElementById("map"),{
zoom: 0,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.HYBRID
});
var maxZoomService = new google.maps.MaxZoomService();
maxZoomService.getMaxZoomAtLatLng(
myLatlng,
function(response) {
if (response.status == google.maps.MaxZoomStatus.OK) {
map.setZoom(response.zoom);
} else {
alert("Error in Max Zoom Service.");
}
});
Аэрофотоснимки в перспективе
При включении аэрофотоснимков в версии 3 элементы управления аналогичны элементу управления GLargeZoomControl3D
версии 2 с дополнительным промежуточным элементом управления Rotate для поворота в поддерживаемых направлениях.
Вы можете отслеживать города, где доступны 45° изображения на карте поддерживаемых городов . Когда доступны 45° изображения, к кнопке Maps API Satellite добавляется подменю.
Слои
Слои — это объекты на карте, состоящие из одного или нескольких слоев. Они могут управляться как единое целое и, как правило, отражают наборы объектов.
Поддерживаемые слои
API v3 обеспечивает доступ к нескольким различным слоям. Эти слои пересекаются с классом v2 GLayer
в следующих областях:
- Объект
KmlLayer
отображает элементы KML и GeoRSS в наложениях v3, обеспечивая эквивалент слоя GeoXml
v2. - Объект
TrafficLayer
визуализирует слой, отображающий условия дорожного движения, аналогичный наложению GTrafficOverlay
v2.
Эти слои отличаются от v2. Различия описаны ниже. Их можно добавить на карту, вызвав setMap()
, передав ему объект Map
, на котором нужно отобразить слой.
Более подробная информация о поддерживаемых слоях доступна в документации по слоям .
Слои KML и GeoRSS
Maps JavaScript API поддерживает форматы данных KML и GeoRSS для отображения географической информации. Файлы KML или GeoRSS должны быть общедоступны, если вы хотите включить их в карту. В v3 эти форматы данных отображаются с использованием экземпляра KmlLayer
, который заменяет объект GGeoXml
из v2.
API v3 более гибок при рендеринге KML, позволяя вам подавлять InfoWindows и изменять реакцию на нажатие. Подробнее см. в документации по слоям v3 KML и GeoRSS .
При рендеринге KmlLayer
применяются ограничения по размеру и сложности; подробности см. в документации KmlLayer .
В следующих примерах сравнивается загрузка файла KML.
geoXml = new GGeoXml(
'https://googlearchive.github.io/js-v2-samples/ggeoxml/cta.kml');
map.addOverlay(geoXml);
var layer = new google.maps.KmlLayer(
'https://googlearchive.github.io/js-v2-samples/ggeoxml/cta.kml', {
preserveViewport: true
});
layer.setMap(map);
Уровень трафика
В v3 вы можете добавлять информацию о дорожном движении в реальном времени (где поддерживается) на свои карты с помощью объекта TrafficLayer
. Информация о дорожном движении предоставляется на момент запроса. В этих примерах показана информация о дорожном движении для Лос-Анджелеса:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(34.0492459, -118.241043), 13);
map.setUIToDefault();
var trafficOptions = {incidents:false};
trafficInfo = new GTrafficOverlay(trafficOptions);
map.addOverlay(trafficInfo);
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(34.0492459, -118.241043),
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 13
});
var trafficLayer = new google.maps.TrafficLayer();
trafficLayer.setMap(map);
В отличие от v2, в v3 нет опций для конструктора TrafficLayer
. Инциденты недоступны в v3.
Услуги
Геокодирование
Maps JavaScript API предоставляет объект geocoder
для динамического геокодирования адресов из пользовательского ввода. Если вы хотите геокодировать статические, известные адреса, см. документацию Geocoding API .
API геокодирования был значительно обновлен и улучшен, добавлены новые функции и изменен способ представления данных.
GClientGeocoder
в API v2 предоставляет два различных метода для прямого и обратного геокодирования, а также дополнительные методы для влияния на то, как выполняется геокодирование. Напротив, объект Geocoder
v3 предоставляет только метод geocode()
, который принимает литерал объекта, содержащий входные термины (в форме объекта Geocoding Requests ), и метод обратного вызова. В зависимости от того, содержит ли запрос текстовый атрибут address
или объект LatLng
, API Geocoding вернет ответ прямого или обратного геокодирования. Вы можете влиять на то, как выполняется геокодирование, передавая дополнительные поля в запрос геокодирования:
- Включение текстового
address
запускает прямое геокодирование, эквивалентное вызову метода getLatLng()
. - Включение объекта
latLng
запускает обратное геокодирование, эквивалентное вызову метода getLocations()
. - Включение атрибута
bounds
включает смещение области просмотра , что эквивалентно вызову метода setViewport()
. - Включение атрибута
region
включает смещение кода региона , что эквивалентно вызову метода setBaseCountryCode()
.
Ответы геокодирования в v3 сильно отличаются от ответов v2. API v3 заменяет вложенную структуру, которую использует v2, на более плоскую структуру, которую легче анализировать. Кроме того, ответы v3 более подробны: каждый результат имеет несколько компонентов адреса , которые помогают дать лучшее представление о разрешении каждого результата.
Следующий код берет текстовый адрес и показывает первый результат его геокодирования:
var geocoder = new GClientGeocoder();
var infoPanel;
var map;
var AccuracyDescription = [
'Unknown accuracy', 'country level accuracy',
'region level accuracy', 'sub-region level accuracy',
'town level accuracy', 'post code level accuracy',
'street level accuracy', 'intersection level accuracy',
'address level accuracy', 'premise level accuracy',
];
function geocode_result_handler(response) {
if (!response || response.Status.code != 200) {
alert('Geocoding failed. ' + response.Status.code);
} else {
var bounds = new GLatLngBounds(new GLatLng(
response.Placemark[0].ExtendedData.LatLonBox.south,
response.Placemark[0].ExtendedData.LatLonBox.west
), new GLatLng(
response.Placemark[0].ExtendedData.LatLonBox.north,
response.Placemark[0].ExtendedData.LatLonBox.east
));
map.setCenter(bounds.getCenter(),
map.getBoundsZoomLevel(bounds));
var latlng = new GLatLng(
response.Placemark[0].Point.coordinates[1],
response.Placemark[0].Point.coordinates[0]);
infoPanel.innerHTML += '<p>1st result is <em>' +
// No info about location type
response.Placemark[0].address +
'</em> of <em>' +
AccuracyDescription[response.Placemark[0].
AddressDetails.Accuracy] +
'</em> at <tt>' + latlng + '</tt></p>';
var marker_title = response.Placemark[0].address +
' at ' + latlng;
map.clearOverlays();
var marker = marker = new GMarker(
latlng,
{'title': marker_title}
);
map.addOverlay(marker);
}
}
function geocode_address() {
var address = document.getElementById('input-text').value;
infoPanel.innerHTML = '<p>Original address: ' + address + '</p>';
geocoder.getLocations(address, geocode_result_handler);
}
function initialize() {
map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(38, 15), 2);
map.setUIToDefault();
infoPanel = document.getElementById('info-panel');
}
var geocoder = new google.maps.Geocoder();
var infoPanel;
var map;
var marker;
function geocode_result_handler(result, status) {
if (status != google.maps.GeocoderStatus.OK) {
alert('Geocoding failed. ' + status);
} else {
map.fitBounds(result[0].geometry.viewport);
infoPanel.innerHTML += '<p>1st result for geocoding is <em>' +
result[0].geometry.location_type.toLowerCase() +
'</em> to <em>' +
result[0].formatted_address + '</em> of types <em>' +
result[0].types.join('</em>, <em>').replace(/_/, ' ') +
'</em> at <tt>' + result[0].geometry.location +
'</tt></p>';
var marker_title = result[0].formatted_address +
' at ' + latlng;
if (marker) {
marker.setPosition(result[0].geometry.location);
marker.setTitle(marker_title);
} else {
marker = new google.maps.Marker({
position: result[0].geometry.location,
title: marker_title,
map: map
});
}
}
}
function geocode_address() {
var address = document.getElementById('input-text').value;
infoPanel.innerHTML = '<p>Original address: ' + address + '</p>';
geocoder.geocode({'address': address}, geocode_result_handler);
}
function initialize() {
map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(38, 15),
zoom: 2,
mapTypeId: google.maps.MapTypeId.HYBRID
});
infoPanel = document.getElementById('info-panel');
}
Направления
Maps JavaScript API v3 заменяет класс GDirections
из v2 на класс DirectionsService
для расчета маршрутов.
Метод route()
в v3 заменяет методы load()
и loadFromWaypoints()
из API v2. Этот метод принимает один литерал объекта DirectionsRequest
, содержащий входные условия, и метод обратного вызова для выполнения при получении ответа. В этом литерале объекта могут быть указаны параметры, аналогично литералу объекта GDirectionsOptions
в v2.
В Maps JavaScript API v3 задача отправки запросов направления была отделена от задачи рендеринга запросов, которая теперь обрабатывается классом DirectionsRenderer
. Вы можете привязать объект DirectionsRenderer
к любой карте или объекту DirectionsResult
с помощью его методов setMap()
и setDirections()
. Поскольку рендерер является MVCObject
, он обнаружит любые изменения своих свойств и обновит карту при изменении связанных с ним направлений.
Следующий код демонстрирует, как запросить пешеходные маршруты к определенному месту с использованием пешеходных дорожек из адреса. Обратите внимание, что только v3 может предоставить пешеходные маршруты по пешеходной дорожке в Дублинском зоопарке.
var map;
var directions;
var directionsPanel;
function initialize() {
var origin = new google.maps.LatLng(53.348172, -6.297285);
var destination = new google.maps.LatLng(53.355502, -6.30557);
directionsPanel = document.getElementById("route");
map = new GMap2(document.getElementById('map'));
map.setCenter(origin, 10);
map.setUIToDefault();
directions = new GDirections(map, directionsPanel);
directions.loadFromWaypoints(
[origin, destination], {
travelMode: 'G_TRAVEL_MODE_WALKING',
});
}
var map;
var directionsRenderer;
var directionsService = new google.maps.DirectionsService();
function initialize() {
var origin = new google.maps.LatLng(53.348172, -6.297285);
var destination = new google.maps.LatLng(53.355502, -6.30557);
directionsRenderer = new google.maps.DirectionsRenderer();
map = new google.maps.Map(
document.getElementById('map'), {
center: origin,
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
directionsRenderer.setPanel(document.getElementById("route"));
directionsRenderer.setMap(map);
directionsService.route({
origin: origin,
destination: destination,
travelMode: google.maps.DirectionsTravelMode.WALKING
}, function(result, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsRenderer.setDirections(result);
}
});
}
Просмотр улиц
Google Street View обеспечивает интерактивные 360° виды из определенных мест в пределах своей зоны покрытия. API v3 поддерживает Street View изначально в браузере, в отличие от v2, которому требовался плагин Flash® для отображения изображений Street View.
Изображения Street View поддерживаются с помощью объекта StreetViewPanorama
в v3 или объекта GStreetviewPanorama
в v2. Эти классы имеют разные интерфейсы, но играют одну и ту же роль: связывают контейнер div
с изображениями Street View и позволяют указать местоположение и POV (точку обзора) панорамы Street View.
function initialize() {
var fenwayPark = new GLatLng(42.345573, -71.098326);
panoramaOptions = {
latlng: fenwayPark,
pov: {
heading: 35,
pitch: 5,
zoom: 1
}
};
var panorama = new GStreetviewPanorama(
document.getElementById('pano'),
panoramaOptions);
GEvent.addListener(myPano, "error", handleNoFlash);
}
function handleNoFlash(errorCode) {
if (errorCode == FLASH_UNAVAILABLE) {
alert('Error: Your browser does not support Flash');
return;
}
}
function initialize() {
var fenway = new google.maps.LatLng(42.345573, -71.098326);
var panoramaOptions = {
position: fenway,
pov: {
heading: 35,
pitch: 5,
zoom: 1
}
};
var panorama = new google.maps.StreetViewPanorama(
document.getElementById('pano'),
panoramaOptions);
}
Прямой доступ к данным Street View возможен через объект StreetViewService
в v3 или аналогичный объект GStreetviewClient
в v2. Оба предоставляют схожие интерфейсы для извлечения или проверки доступности данных Street View, а также позволяют выполнять поиск по местоположению или идентификатору панорамы.
В v3 Street View включен по умолчанию. Карта будет отображаться с элементом управления Street View Pegman, а API будет повторно использовать div карты для отображения панорам StreetView. Следующий код иллюстрирует, как эмулировать поведение v2, разделив панорамы Street View в отдельный div.
var marker;
var panoClient = new GStreetviewClient();
function initialize() {
if (GBrowserIsCompatible()) {
var myPano = new GStreetviewPanorama(
document.getElementById('pano'));
GEvent.addListener(myPano, 'error', handleNoFlash);
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(42.345573, -71.098326), 16);
map.setUIToDefault();
GEvent.addListener(map, 'click', function(overlay, latlng) {
if (marker) {
marker.setLatLng(latlng);
} else {
marker = new GMarker(latlng);
map.addOverlay(marker);
}
var nearestPano = panoClient.getNearestPanorama(
latlng, processSVData);
});
function processSVData(panoData) {
if (panoData.code != 200) {
alert("Panorama data not found for this location.");
}
var latlng = marker.getLatLng();
var dLat = latlng.latRadians()
- panoData.location.latlng.latRadians();
var dLon = latlng.lngRadians()
- panoData.location.latlng.lngRadians();
var y = Math.sin(dLon) * Math.cos(latlng.latRadians());
var x = Math.cos(panoData.location.latlng.latRadians()) *
Math.sin(latlng.latRadians()) -
Math.sin(panoData.location.latlng.latRadians()) *
Math.cos(latlng.latRadians()) * Math.cos(dLon);
var bearing = Math.atan2(y, x) * 180 / Math.PI;
myPano.setLocationAndPOV(panoData.location.latlng, {
yaw: bearing
});
}
function handleNoFlash(errorCode) {
if (errorCode == FLASH_UNAVAILABLE) {
alert('Error: Your browser does not support Flash');
return;
}
}
}
}
// Load the API with libraries=geometry
var map;
var marker;
var panorama;
var sv = new google.maps.StreetViewService();
function radians(degrees) { return Math.PI * degrees / 180.0 };
function initialize() {
panorama = new google.maps.StreetViewPanorama(
document.getElementById("pano"));
map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(42.345573, -71.098326),
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 16
});
google.maps.event.addListener(map, 'click', function(event) {
if (!marker) {
marker = new google.maps.Marker({
position: event.latLng,
map: map
});
} else {
marker.setPosition(event.latLng);
}
sv.getPanoramaByLocation(event.latLng, 50, processSVData);
});
}
function processSVData(panoData, status) {
if (status == google.maps.StreetViewStatus.OK) {
alert("Panorama data not found for this location.");
}
var bearing = google.maps.geometry.spherical.computeHeading(
panoData.location.latLng, marker.getPosition());
panorama.setPano(panoData.location.pano);
panorama.setPov({
heading: bearing,
pitch: 0,
zoom: 1
});
panorama.setVisible(true);
marker.setMap(panorama);
}