Я читал 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);
});
}
Вы можете получить доступ к этому образцу приложения в прямом эфире здесь .