2012-01-13 28 views
2

如您所知,谷歌手机地图程序有能力找到用户的位置(我的位置服务)。 我想知道Google地图如何使用互联网手机,GPRS(非GPS)检测用户的位置? 是否可以使用PHP或其他基于Web的语言编写程序,以便在用户打开该页面时检测用户的位置? 我可以猜测Google不会使用用户IP来确定他们的位置,因为当我尝试使用我的移动互联网IP来猜测我的位置时,获得了错误的位置。如何使用GPRS检测移动位置?

回答

6

看看Google Geocoding API和W3 Geolocation API Specification。然后this可能有助于您找到答案。

+1

感谢您的回答。它也帮助我。你是一个拯救生命的人。 :) – 2012-01-16 12:07:03

+0

@ Sajib Mahmood:谢谢,但这些方法可以在简单的手机浏览器上工作吗? – 2012-01-16 21:31:31

+1

@ImanHejazi:Apple iPhone和Android手机拥有Google Maps JS API支持。我无法向您确认其他手机浏览器。 – 2012-01-17 06:54:26

3

在没有GPS定位的情况下,定位的常用方法是对服务小区ID或检测到的Wi-Fi MAC地址进行反向查找。存在一个基于服务器的数据库,它给出了所有已知蜂窝站点的地理位置 - 这些站点由它们的小区ID或更确切地说它们的小区全球ID(CGI)以及所有已知Wi-Fi AP的位置唯一标识。因此,通过了解CGI或MAC,可以通过在GPRS等蜂窝数据集中浸入数据库来确定一个人的近似(“粗略”)位置。这种商业服务如SkyHook(Apple曾经使用但不再使用)的工作方式。

通过使用其他输入,如信号强度或数字地图,可以使这种粗略的位置更加精确。

某些设备(如iPhone)将此数据库缓存在设备上,以便更快地进行粗分辨率定位。苹果在几个月前因此陷入困境,并改变了这种运作方式。

为了让网页知道设备的位置,设备必须调用适当的(设备特定的)定位API,然后将其提交给Web服务器,这显然需要一些设备端代码(不是只是一个浏览器)。

+0

谢谢,但你知道我怎么找到这个代码?我的手机操作系统是UIQ3,GoogleMaps的MyLocation功能正常工作。我如何编写程序来确定用户位置,如GoogleMaps?你有想法吗? – 2012-01-22 09:07:44

+0

这听起来像您的浏览器支持HTML5,它允许服务器请求浏览器的位置。 (浏览器本身包含访问特定于操作系统的位置API的功能。)您可以在此检查浏览器的HTML5支持:http://www.html5test.com。 – boettger1 2012-01-22 12:47:19

1

它的工作原理是这样的。根据Google地图浏览器(或使用谷歌地图代码的程序)是否支持并实施地理定位界面,Google地图会询问用户是否愿意分享他们的位置,您可以了解更多关于here的信息。如果用户同意分享他们的位置,则关于本地无线接入点的信息被传递,以便谷歌地图(或其他服务)可以估计用户的位置。可以在您的程序或网页中实现此功能。关于在程序中使用谷歌地图,我不知道很多,但对于网页,这里是一个用JavaScript编写的例子,它会做你正在寻找的东西。我相信你也可以在PHP中实现这一点。

<!DOCTYPE html> 
<html> 
<head> 
<title>Google Maps JavaScript API v3 Example: Map Geolocation</title> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
<meta charset="UTF-8"> 
<link href="http://code.google.com/apis/maps/documentation/javascript/examples/default.css" 
    rel="stylesheet" type="text/css"> 
<script type="text/javascript" 
    src="http://maps.googleapis.com/maps/api/js?sensor=true"></script> 

<script type="text/javascript"> 
    var map; 

    function initialize() { 
    var myOptions = { 
     zoom: 6, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    map = new google.maps.Map(document.getElementById('map_canvas'), 
     myOptions); 

    //this is the piece of code you are interested in!! 
    if(navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(function(position) { 
     var pos = new google.maps.LatLng(position.coords.latitude, 
             position.coords.longitude); 

     var infowindow = new google.maps.InfoWindow({ 
      map: map, 
      position: pos, 
      content: 'Location found using HTML5.' 
     }); 

     map.setCenter(pos); 
     }, function() { 
     handleNoGeolocation(true); 
     }); 
    } else { 
     handleNoGeolocation(false); 
    } 
    } 

    function handleNoGeolocation(errorFlag) { 
    if (errorFlag) { 
     var content = 'Error: The Geolocation service failed.'; 
    } else { 
     var content = 'Error: Your browser doesn\'t support geolocation.'; 
    } 

    var options = { 
     map: map, 
     position: new google.maps.LatLng(60, 105), 
     content: content 
    }; 

    var infowindow = new google.maps.InfoWindow(options); 
    map.setCenter(options.position); 
    } 

    google.maps.event.addDomListener(window, 'load', initialize); 
</script> 
</head> 
<body> 
<div id="map_canvas"></div> 
</body> 
</html> 

咨询谷歌地图API参考here看到在其中您可以使用此方式的数量。另外,不是源参考在“传感器=真”中结束。如果您正在使用地理位置,请务必在源中将此值设置为true。