我正在使用以下脚本,并且难以传入我使用用户位置创建的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);
});
答案 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.LatLng
和new 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中使用类似的工作。