Я читал HTML5 Head First, и в этой книге я прочитал о поддержке геолокации в HTML5 , а также ознакомился с примером, которым они поделились об использовании Карт Google с API геолокации HTML5. Это был интересный пример, и я пошел дальше и улучшил пример, чтобы показать некоторые закуски вокруг определенного места. Для этого я использовал библиотеку Places, которая поставляется с Google Maps API.
В этом посте я расскажу:
- Начало работы с API геолокации HTML5
- Интеграция карты Google для отображения текущего местоположения
- Улучшение примера, чтобы показать близлежащие места на карте Google
Начало работы с API геолокации HTML5
Geolocation API позволяет браузеру определять местоположение пользователя, используя различные механизмы, такие как IP-адрес пользователя, местоположение GPS и сотовые сети, в зависимости от используемого пользователем устройства. Местоположение идентифицируется как пара значений широты и долготы. Давайте создадим простую HTML-страницу и файл JavaScript, чтобы получить местоположение пользователя:
<html> <head> <meta charset="utf-8"> <title>Where am I?</title> <script src="myLoc.js"></script> </head> <body> <!-- The location will be updated in the below div --> <div id="location"> Your location will go here. </div> </body> </html>
И код JavaScript, который обновляет приведенный выше HTML с указанием местоположения пользователя:
//myLoc.js window.onload = getMyLocation; function getMyLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(displayLocation); } else { alert("Oops, no geolocation support"); } } //This function is inokved asynchronously by the HTML5 geolocation API. function displayLocation(position) { //The latitude and longitude values obtained from HTML 5 API. var latitude = position.coords.latitude; var longitude = position.coords.longitude; //Setting the latitude and longitude values in the div. var div = document.getElementById("location"); div.innerHTML = "You are at Latitude: " + latitude + ", Longitude: " + longitude; }
В приведенной выше коде JavaScript, в navigator
объекте geolocation
недвижимость используется для получения местоположения пользователя. Если браузер поддерживает API геолокации HTML5, он запросит у пользователя подтверждение доступа к его местоположению. После определения местоположения он асинхронно вызывает обратный вызов, displayLocation
зарегистрированный в API геолокации. Обратный вызов не делает ничего особенного, кроме обновления HTML значениями широты и долготы.
Интеграция Google Maps для отображения текущего местоположения
Чтобы интегрировать карту Google, нужно начать с документа « Приступая к работе» для API Google Maps, в котором показано, как получить ключ API Google, а также с некоторыми примерами, чтобы начать использовать API Карт Google. Чтобы отметить текущее местоположение на карте Google, нужно сделать следующее:
- Создайте объект LatLng, используя значения широты и долготы, полученные из API геолокации.
//Creating a new object for using latitude and longitude values with Google map. var latLng = new google.maps.LatLng(latitude, longitude);
- Создайте объект MapOptions .
//Setting up the map options like zoom level, map type. var mapOptions = { center: latLng, zoom: 18, mapTypeId: google.maps.MapTypeId.ROADMAP };
- Создайте объект Map и передайте элемент HTML (в нашем случае,
div
тег) для встраивания карты и объекта MapOptions, созданных на шаге выше.//Creating the Map instance and assigning the HTML div element to render it in. var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
- Создайте объект MarkerOptions, указывающий местоположение, которое будет отмечено на карте.
var markerOptions = { position: latLng, map: map, animation: google.maps.Animation.DROP, clickable: true }
- Создайте объект Marker и предоставьте ему объект MarkerOptions и объект Map, созданные на предыдущих этапах. Этот объект Marker использует объект MarkerOptions, чтобы получить информацию о местоположении, а затем объект Map, чтобы отметить местоположение.
//Setting up the marker object to mark the location on the map canvas. var marker = new google.maps.Marker(markerOptions);
- Кроме того, давайте добавим окно заметки, которое покажет что-то о месте, когда пользователь нажимает на это место. Это достигается путем создания объекта InfoWindowOptions и использования его для создания объекта InfoWindow. Это окно заметок должно открываться, когда пользователь нажимает на маркер, что можно сделать, добавив прослушиватель
click
событий для события.var infoWindowOptions = { content: content, position: latLng }; var infoWindow = new google.maps.InfoWindow(infoWindowOptions); google.maps.event.addListener(marker, "click", function() { infoWindow.open(map); });
Полный код, который показывает местоположение на карте Google, приведен ниже:
<!-- index.html --> <html> <head> <meta charset="utf-8"> <title>Where am I?</title> <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=true"></script> <script src="myLoc.js"></script> <style type="text/css"> html { height: 100% } body { height: 100%; margin: 0; padding: 0 } #map-canvas { height: 100% } </style> </head> <body> <div id="location"> Your location will go here. </div> <div id="map-canvas"> Google Map will go here!. </div> </body> </html>
Код JavaScript:
//myLoc.js window.onload = getMyLocation; //Note that map has been globally declared. var map; function getMyLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(displayLocation); } else { alert("Oops, no geolocation support"); } } //This function is inokved asynchronously by the HTML5 geolocation API. function displayLocation(position) { //The latitude and longitude values obtained from HTML 5 API. var latitude = position.coords.latitude; var longitude = position.coords.longitude; //Creating a new object for using latitude and longitude values with Google map. var latLng = new google.maps.LatLng(latitude, longitude); showMap(latLng); createMarker(latLng); //Also setting the latitude and longitude values in another div. var div = document.getElementById("location"); div.innerHTML = "You are at Latitude: " + latitude + ", Longitude: " + longitude; } function showMap(latLng) { //Setting up the map options like zoom level, map type. var mapOptions = { center: latLng, zoom: 18, mapTypeId: google.maps.MapTypeId.ROADMAP }; //Creating the Map instance and assigning the HTML div element to render it in. map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions); } function createMarker(latLng) { //Setting up the marker object to mark the location on the map canvas. var markerOptions = { position: latLng, map: map, animation: google.maps.Animation.DROP, clickable: true } var marker = new google.maps.Marker(markerOptions); var content = "You are here: " + latLng.lat() + ", " + latLng.lng(); addInfoWindow(marker, latLng, content); } function addInfoWindow(marker, latLng, content) { var infoWindowOptions = { content: content, position: latLng }; var infoWindow = new google.maps.InfoWindow(infoWindowOptions); google.maps.event.addListener(marker, "click", function() { infoWindow.open(map); }); }
Улучшение примера для отображения близлежащих мест на картах Google
Теперь давайте воспользуемся библиотекой Places и отметим ближайшие закусочные на карте. Это включает в себя следующие шаги:
- Создайте экземпляр PlacesService, используя ранее созданный объект Map.
var nearByService = new google.maps.places.PlacesService(map);
- Создайте объект PlacesSearchRequest для хранения информации, связанной с поиском мест.
var request = { location: latLng, radius: 1000, types: ['food', 'bakery', 'cafe', 'grocery_or_supermarket', 'meal_delivery','restaurant', 'meal_takeaway', 'shopping_mall'] };
- Создайте метод обратного вызова, который будет вызываться при получении результата Places. Этот метод обратного вызова будет предоставлен с результатами и статусом результата.
function handleNearBySearchResults(results, status) { if (status == google.maps.places.PlacesServiceStatus.OK) { for (var i = 0; i < results.length; i++) { var place = results[i]; createMarker(place.geometry.location, place); } } }
- Зарегистрируйте обратный вызов с помощью объекта PlacesService, а также предоставьте объект PlacesSearchRequest, созданный выше.
nearByService.nearbySearch(request, handleNearBySearchResults);
Давайте посмотрим на полный код, который идентифицирует местоположение, помечает его на Google Maps, а также отмечает близлежащие закусочные на карте.
HTML-код для этого:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Where am I?</title> <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=true&libraries=places,weather"></script> <script src="myLoc.js"></script> <style type="text/css"> html { height: 100% } body { height: 100%; margin: 0; padding: 0 } #map-canvas { height: 100% } </style> </head> <body> <div id="location"> Your location will go here. </div> <div id="map-canvas"> Google Map will go here!. </div> </body> </html>
Код JavaScript для этого:
window.onload = getMyLocation; var map; function getMyLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(displayLocation); } else { alert("Oops, no geolocation support"); } } //This function is inokved asynchronously by the HTML5 geolocation API. function displayLocation(position) { //The latitude and longitude values obtained from HTML 5 API. var latitude = position.coords.latitude; var longitude = position.coords.longitude; //Creating a new object for using latitude and longitude values with Google map. var latLng = new google.maps.LatLng(latitude, longitude); showMap(latLng); addNearByPlaces(latLng); createMarker(latLng); //Also setting the latitude and longitude values in another div. var div = document.getElementById("location"); div.innerHTML = "You are at Latitude: " + latitude + ", Longitude: " + longitude; } function showMap(latLng) { //Setting up the map options like zoom level, map type. var mapOptions = { center: latLng, zoom: 18, mapTypeId: google.maps.MapTypeId.ROADMAP }; //Creating the Map instance and assigning the HTML div element to render it in. map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions); } function addNearByPlaces(latLng) { var nearByService = new google.maps.places.PlacesService(map); var request = { location: latLng, radius: 1000, types: ['food', 'bakery', 'cafe', 'grocery_or_supermarket', 'meal_delivery','restaurant', 'meal_takeaway', 'shopping_mall'] }; nearByService.nearbySearch(request, handleNearBySearchResults); } function handleNearBySearchResults(results, status) { if (status == google.maps.places.PlacesServiceStatus.OK) { for (var i = 0; i < results.length; i++) { var place = results[i]; createMarker(place.geometry.location, place); } } } function createMarker(latLng, placeResult) { var markerOptions = { position: latLng, map: map, animation: google.maps.Animation.DROP, clickable: true } //Setting up the marker object to mark the location on the map canvas. var marker = new google.maps.Marker(markerOptions); if (placeResult) { var content = placeResult.name+"<br/>"+placeResult.vicinity+"<br/>"+placeResult.types; addInfoWindow(marker, latLng, content); } else { var content = "You are here: " + latLng.lat() + ", " + latLng.lng(); addInfoWindow(marker, latLng, content); } } function addInfoWindow(marker, latLng, content) { var infoWindowOptions = { content: content, position: latLng }; var infoWindow = new google.maps.InfoWindow(infoWindowOptions); google.maps.event.addListener(marker, "click", function() { infoWindow.open(map); }); }
Вы можете получить доступ к этому образцу приложения в прямом эфире здесь .