Возникают трудности с отображением и центрированием карты по местоположению пользователя с помощью W3C GeoLocation API
Я использую следующий скрипт и испытываю трудности с передачей переменных lat и lon, которые я создал с учетом местоположения пользователя. Когда я удаляю переменные lat и lon, которые я создал и помещаю вручную в 0,0, он отлично работает для отладки... Карта должна отображаться в div с идентификатором map_canvas.
$(document).ready(function() {
navigator.geolocation.getCurrentPosition(handle_geolocation_query,handle_errors);
var lat = position.coords.latitude;
var lon = position.coords.longitude;
var latlng = new google.maps.LatLng(lat, lon);
var myOptions = {
zoom: 1,
center: latlng,
disableDefaultUI: true,
mapTypeId: google.maps.MapTypeId.TERRAIN
};
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions); map.setTilt(45);
});
2 ответа
Ваша проблема, вероятно, прямо здесь:
navigator.geolocation.getCurrentPosition(handle_geolocation_query, handle_errors);
Предположительно, handle_geolocation_query
выглядит примерно так:
var position;
function handle_geolocation_query(pos) {
position = pos;
}
Но navigator.geolocation.getCurrentPosition
это асинхронный вызов функции:
getCurrentPosition()
Метод принимает один, два или три аргумента. При вызове он должен немедленно вернуться и затем асинхронно попытаться получить текущее местоположение устройства. Если попытка успешна,successCallback
должен быть вызван [...]
Акцент мой.
Так что ваши handle_geolocation_query
обратный вызов будет вызван getCurrentPosition
когда у него есть позиция, а не когда вы звоните getCurrentPosition
, Итак, когда вы попадаете сюда:
var lat = position.coords.latitude;
var lon = position.coords.longitude;
Ваш position
не обязательно будет содержать что-нибудь полезное, и вы, вероятно, получите сообщение об ошибке position.coords
не определено или не объект или что-то подобное.
Вы должны переместить new google.maps.LatLng
а также new google.maps.Map
вещи внутрь handle_geolocation_query
обратный звонок, где у вас будет полезный position
значение.
http://j.maxmind.com/app/geoip.js
http://maps.google.com/maps/api/js?sensor=true
var ulat;
var ulon;
var map;
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(handle_geolocation_query,handle_errors);
}
else if (!navigator.geolocation)
{
max();
}
else
{
alert("Sorry user location can't be detected");
initialize();
}
//maxmind api for fallback
function max()
{
ulat=geoip_latitude();
ulon=geoip_longitude();
initialize();
}
function handle_errors(error)
{
switch(error.code)
{
case error.PERMISSION_DENIED: alert("user did not share geolocation data");
break;
case error.POSITION_UNAVAILABLE: alert("could not detect current position");
break;
case error.TIMEOUT: alert("retrieving position timed out");
break;
default: alert("unknown error");
break;
}
initialize();
}
function handle_geolocation_query(position){
ulat=position.coords.latitude;
ulon=position.coords.longitude;
/* alert('Lat: ' + position.coords.latitude +
' Lon: ' + position.coords.longitude); */
initialize();
}
function initialize(){
loc = new Array();
geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(ulat,ulon);
var myOptions = {
zoom: 3,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
}//end of initialize
Привет, геолокация по своей природе асинхронная, поэтому не используйте ее с функцией синхронизации, иначе вы можете получить нулевое значение для новой функции google.maps.LatLng (lat, lon). Попробуйте приведенный выше код в соответствии с вашими требованиями. Вы можете работать аналогичным образом в jquery.