Возникают проблемы с отображением и центрированием карты в соответствии с местоположением пользователя с помощью W3C GeoLocation API - PullRequest
0 голосов
/ 28 июля 2011

Я использую следующий скрипт и испытываю трудности с передачей переменных 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 ]

1 голос
/ 02 августа 2011

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.

1 голос
/ 28 июля 2011

Ваша проблема, вероятно, именно здесь:

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.

...