使用W3C GeoLocation API难以使用用户的位置显示和居中地图

时间:2011-07-28 06:48:47

标签: jquery geolocation google-maps-api-3 geoapi

我正在使用以下脚本,并且难以传入我使用用户位置创建的lat和lon变量。当我删除我创建的lat和lon变量并手动输入0,0时,它可以正常调试...地图应该显示在id为map_canvas的div中。

$(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 个答案:

答案 0 :(得分:1)

你的问题可能就在这里:

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.LatLngnew google.maps.Map内容移至handle_geolocation_query回调中,您将获得有用的position值。

答案 1 :(得分:1)

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

嗨,地理定位本质上是异步的,因此不要将它与synchronus函数一起使用,否则u可能会为新的google.maps.LatLng(lat,lon)函数获取null值。根据你的要求尝试上面的代码。你可以在jquery中使用类似的工作。