`
wbj0110
  • 浏览: 1550996 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

基于ip的手机地理定位

阅读更多

现在lbs服务比较火,基本上都需要定位用户的地理信息,用户地理信息一般是通过gps来定位实现的,那么假如

用户的gps坏了,或者没有开启,那么怎么获得用户的地理信息的呢?替代的办法就是可以获得手机真实ip信息来大致获取手机用户的

大概位置,虽然不是很精确,但是在精确度不高的情况下可以临时代替一下,本文就是实现如何通过ip来定位用户的。这里主要使用获得pc端模拟手机端原理

使用工具:

地图:谷歌地图Google Maps JavaScript API V3 

 

首先介绍一下谷歌地图定位地理信息的原理:根据经纬度查询出用户的地理信息,====gps可以获得经纬度。

 也可以使用谷歌的共享地理位置信息 ,例如火狐的有http://www.mozilla.com/zh-CN/firefox/geolocation/可以体验一下共享地理信息,不过那个技术是基于w3c标准的,目前ie还不是支持。

 

 本文要实现的:根据ip 查询获得ip的地理信息 和在地图中的显示
 
 设计思想:获得ip信息--->查询到ip地理位置(如杭州 北京等,这个有两种方法一种是使用ip数据库,另外一种是门户网站接口)

 ----->根据获得的地理信息,谷歌把他转化为经纬度---->经纬度定位

本次修改增加了弹出信息窗口和 事件监听方法(监听经纬值)还是 在地图中显示图像功能

 

1:获得用户ip信息

这里推荐使用腾讯的ip开放接口,地理信息比较全,获得ip信息的更详细介绍

这个带有查询ip功能的方法,手机获得手机端ip信息传到这个方法,获取到地理位置

 

  1. //根据腾讯接口查询ip地址  
  2. function getIPLoc($queryIP){  
  3.   
  4.   
  5. $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;  
  6.   
  7.   
  8. $ch = curl_init($url);  
  9.   
  10.   
  11. curl_setopt($ch,CURLOPT_ENCODING ,'gb2312');  
  12.   
  13.   
  14. curl_setopt($ch, CURLOPT_TIMEOUT, 10);  
  15.   
  16.   
  17. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回  
  18.   
  19.   
  20. $result = curl_exec($ch);  
  21.   
  22.   
  23. $result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码  
  24.   
  25.   
  26.    curl_close($ch);  
  27.   
  28.   
  29. preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);  
  30. $loc = $ipArray[1];  
  31. return $loc;  
  32. }  

 

这是直接获得pc端的方法,至于手机端如何获得用户ip,网上找一下方法有很多
  1. //方法2 直接获得客户端ip地址  
  2. function getIpPlace(){  
  3.  $ip=file_get_contents("http://fw.qq.com/ipaddress");  
  4.  $ip=str_replace('"',' ',$ip);  
  5.  $ip2=explode("(",$ip);  
  6.  $a=substr($ip2[1],0,-2);  
  7.  $b=explode(",",$a);  
  8.  return $b;  
  9. }  
2:调用谷歌地图
 
引入地图
  1. <script type="text/javascript" src="http://ditu.google.com/maps/api/js?sensor=true"></script>    

设置谷歌地图的参数  

 

zoom是地图显示的缩放级数,center是地图的中心位置,maptypeid是地图的类型,address主要获取查询到的地理信息,

gecode主要是谷歌地图吧地理信息转化为经度纬度值,title主要是点击时候的名称,icon主要是锚点的背景图像,没有的话就是是默认值

 

 

  1. <script language="javascript">    
  2.  var geocoder;    
  3.   var map;    
  4.   function initialize() {    
  5.     geocoder = new google.maps.Geocoder();    
  6.     var latlng = new google.maps.LatLng(39.9493, 116.3975);    
  7.     var myOptions = {    
  8.       zoom: 15,    
  9.       center: latlng,    
  10.       mapTypeId: google.maps.MapTypeId.ROADMAP    
  11.     }    
  12.     var address = document.getElementById("address").value;   
  13. var img='http://avatar.csdn.net/B/9/A/1_youacai.jpg';   
  14.     if (geocoder) {    
  15.       geocoder.geocode( { 'address': address}, function(results, status) {    
  16.         if (status == google.maps.GeocoderStatus.OK) {   
  17.           map.setCenter(results[0].geometry.location);    
  18.           var marker = new google.maps.Marker({    
  19.               map: map,     
  20.               position: results[0].geometry.location,    
  21.  title:'位置',  
  22. icon:img  
  23.         
  24.           });    
  25.         }     
  26.       });    
  27.     }    
  28.     map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);    
  29.   }   

 

弹出信息窗口

content是提示信息,它支持自定义的DOM样式,监听事件了有演示

open是打开窗口,相应的close是关闭窗口

 

  1.  /*弹出信息窗口*/  
  2.   function getInfor(map,marker,address,ln){  
  3. var infowindow = new google.maps.InfoWindow({  
  4. content: address+"\n"+ln  
  5. });  
  6. infowindow.open(map,marker);    
  7.   }  

 

 

监听事件

主要是监听鼠标对地图的操作,跟js很相似

本文演示的是点击的事件,

pixeloffset是指窗口相对应焦点的位置偏移量

google.maps.event.addListener(marker, 'click', function(event)监听点击事件,焦点是marker也就是背景图像的地方,

alert弹出对应焦点的经纬信息

 

  1.   /*监听事件 经纬值*/  
  2.   function addListener(marker){  
  3. var infowindow = new google.maps.InfoWindow({  
  4.       content:'<div  style="color:#F00"><a href="http://blog.csdn.net/youacai">php淮北<img src="http://avatar.csdn.net/B/9/A/1_youacai.jpg" width="30" height="30" alt="tt"></a> 点点试试哦</div>',  
  5. pixelOffset:({width:50, height:120})  
  6.   });  
  7. google.maps.event.addListener(marker, 'click', function(event) {  
  8.         alert("你选择的经度是:"+event.latLng.lat()+"   纬度是:"+event.latLng.lat());  
  9. infowindow.open(map,marker);  
  10.     });  
  11. }  

 

 

 

放置谷歌地图的容器

 

  1. <div id="map_canvas" style="width: 320px; height: 480px;"></div>  

 

 

3:附带一个查询天气的接口

 

  1. /*获得天气预报信息*/  
  2.  <br/>  
  3.   <iframe src="http://weather.265.com/weather.htm" width="168" height="54" frameborder="no" border="0" marginwidth="0&quoat; marginheight="0" scrolling="no"></iframe>  

 

 

  1. <pre name="code" class="php"><?php  
  2. //根据腾讯接口查询ip地址  
  3. function getIPLoc($queryIP){  
  4.   
  5.   
  6. $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;  
  7.   
  8.   
  9. $ch = curl_init($url);  
  10.   
  11.   
  12. curl_setopt($ch,CURLOPT_ENCODING ,'gb2312');  
  13.   
  14.   
  15. curl_setopt($ch, CURLOPT_TIMEOUT, 10);  
  16.   
  17.   
  18. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回  
  19.   
  20.   
  21. $result = curl_exec($ch);  
  22.   
  23.   
  24. $result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码  
  25.   
  26.   
  27.    curl_close($ch);  
  28.   
  29.   
  30. preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);  
  31. $loc = $ipArray[1];  
  32. return $loc;  
  33. }  
  34.   
  35.   
  36. //方法2 直接获得客户端ip地址  
  37. function getIpPlace(){  
  38.  $ip=file_get_contents("http://fw.qq.com/ipaddress");  
  39.  $ip=str_replace('"',' ',$ip);  
  40.  $ip2=explode("(",$ip);  
  41.  $a=substr($ip2[1],0,-2);  
  42.  $b=explode(",",$a);  
  43.  return $b;  
  44. }  
  45. $ip=getIpPlace();  
  46. $address =!empty($ip['3'])? iconv('gbk','utf-8',$ip['3']):'';  
  47.   
  48. //获得提交的ip信息  
  49. if($_POST){  
  50.     $ip = trim($_POST['ip']);  
  51.     $loc = trim(getIPLoc($ip));  
  52.     $locip = trim($_POST['ip']);  
  53. }else{  
  54.     $ip=getIpPlace();  
  55.     $loc =!empty($ip['3'])? iconv('gbk','utf-8',$ip['3']):'';  
  56.     $locip = iconv('gbk','utf-8',$ip['0']);  
  57. }  
  58.   
  59.   
  60. ?>  
  61. <!--调用谷歌地图js,zoom缩放倍数,center中心,mapTypeId地图类型-->    
  62. <script type="text/javascript" src="http://ditu.google.com/maps/api/js?sensor=true"></script>    
  63. <script language="javascript">    
  64.  var geocoder;    
  65.   var map;    
  66.   function initialize() {    
  67.     geocoder = new google.maps.Geocoder();    
  68.     var latlng = new google.maps.LatLng(39.9493, 116.3975);    
  69.     var myOptions = {    
  70.       zoom: 15,    
  71.       center: latlng,    
  72.       mapTypeId: google.maps.MapTypeId.ROADMAP    
  73.     }    
  74.     var address = document.getElementById("address").value;   
  75. <span style="white-space:pre">  </span>var img='http://avatar.csdn.net/B/9/A/1_youacai.jpg';  
  76. <span style="white-space:pre">  </span>  
  77.     if (geocoder) {    
  78.       geocoder.geocode( { 'address': address}, function(results, status) {    
  79.         if (status == google.maps.GeocoderStatus.OK) {   
  80.           map.setCenter(results[0].geometry.location);    
  81.           var marker = new google.maps.Marker({    
  82.               map: map,     
  83.               position: results[0].geometry.location,    
  84. <span style="white-space:pre">          </span>  title:'位置',  
  85. <span style="white-space:pre">          </span>  icon:img  
  86.         
  87.           });   
  88. <span style="white-space:pre">      </span>   getInfor(map,marker,address,results[0].geometry.location);  
  89. <span style="white-space:pre">      </span>   addListener(marker)  
  90.         }     
  91.       });    
  92.     }    
  93.     map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);    
  94.   }   
  95.      
  96.   /*弹出信息窗口*/  
  97.   function getInfor(map,marker,address,ln){  
  98.   <span style="white-space:pre">       </span>var infowindow = new google.maps.InfoWindow({  
  99.         <span style="white-space:pre">  </span>content: address+"\n"+ln  
  100.    <span style="white-space:pre">     </span> });  
  101. <span style="white-space:pre">      </span>infowindow.open(map,marker);  
  102. <span style="white-space:pre">      </span>  
  103.   }  
  104.   /*监听事件 经纬值*/  
  105.   function addListener(marker){  
  106. <span style="white-space:pre">  </span>  var infowindow = new google.maps.InfoWindow({  
  107.         <span style="white-space:pre">  </span>content:'<div  style="color:#F00"><a href="http://blog.csdn.net/youacai">php淮北<img src="http://avatar.csdn.net/B/9/A/1_youacai.jpg" width="30" height="30" alt="tt"></a> 点点试试哦</div>',  
  108. <span style="white-space:pre">          </span>pixelOffset:({width:50, height:120})  
  109.    <span style="white-space:pre">     </span> });  
  110. <span style="white-space:pre">  </span>  <span style="white-space:pre">    </span>google.maps.event.addListener(marker, 'click', function(event) {  
  111.         alert("你选择的经度是:"+event.latLng.lat()+"   纬度是:"+event.latLng.lat());  
  112. <span style="white-space:pre">  </span>   <span style="white-space:pre">       </span>infowindow.open(map,marker);  
  113.     <span style="white-space:pre">        </span>});  
  114. <span style="white-space:pre">  </span>  }  
  115.     
  116.   </script>  </pre><pre name="code" class="php"><body onload="initialize()">  
  117.  <div id="map_canvas" style="width: 320px; height: 480px;"></div>  
  118.   <div>  
  119.   <form method="post" action="">  
  120. 输出ip地址:<input type="text" name="ip"  value=<?php echo $locip;?>>  
  121. <input type="submit" value="提交">  
  122.   
  123.   
  124. </form>  
  125.   位置: <input type="text" id="address" size="40" value=<?php echo $loc;?> >  
  126.   </div>  
  127. /*获得天气预报信息*/  
  128.  <br/>  
  129.   <iframe src="http://weather.265.com/weather.htm" width="168" height="54" frameborder="no" border="0" marginwidth="0&quoat; marginheight="0" scrolling="no"></iframe>  
  130. </body></pre><br>  
  131. <br>  
  132. <pre></pre>  
  133. <p><img src="http://hi.csdn.net/attachment/201107/26/0_1311670654lAwz.gif" alt=""><img src="http://hi.csdn.net/attachment/201107/26/0_1311671145nMMo.gif" alt=""></p>  
  134. <p></p>  
  135. <p></p>  
  136. <p></p>  
  137. <p>上面是查询前后的截图 </p>  
  138. <pre></pre>  
  139. <pre></pre>  
  140. <pre></pre>  
  141. <pre></pre>  
分享到:
评论

相关推荐

    基于网络路径测量的IP地理定位技术

    介绍了IP定位技术的基本概念和相关应用,研讨了现有的IP地理定位技术,并提出了一种基于网络路径测量的IP地理定位方法,该方法通过测量测量观测点到目标IP的路径和时延,变换测量数据包的大小推断路径距离,结合路径之间...

    PHP版基于GeoIP2实现根据ip获取地理位置

    PHP版基于GeoIP2实现根据ip获取地理位置 laravel php版本大于7.2

    基于地标校准的IP地理定位方法

    针对现有的IP地理定位方法不考虑地标误差的问题,提出了一种新的利用地标标定的地理定位方法。 首先,通过指定偏差,将可靠性低的地标的位置视为可能的区域。 然后对目标IP进行地理定位可以转换为约束优化问题; ...

    基于地标性校准的IP地理位置定位方法

    基于地标性校准的IP地理位置定位方法

    基于ASP的通过ip获取所在地理位置.zip

    基于ASP的通过ip获取所在地理位置.zip

    基于路由特征的城市级地理位置

    针对传统的基于时延测量的IP地理定位方法难以解决的问题 具有弱连接性的网络(例如中国的互联网),在本文中,我们利用其分层拓扑结构并提出了一种 路由功能的城市级地理定位方法以已知地理位置的IP作为参考节点, ...

    JAVA IP地址查询地理位置

    通过IP地址查询所在省市,基于qqwry.dat(可通过百度下载最新qqwry.dat文件来更新)。 代码已经简化过,直接调用静态方法即可返回地区信息(传入IP为参数)。 使用时只需要把唯一工具类:IpLocationTool.java(无...

    ip2geo-bigquery:加载Maxmind ip2geo以在BigQuery中允许基于IP的地理位置

    使用Google BigQuery的基于IP的地理位置 创建一个BigQuery表,以允许您查找国家/地区的IP地址。 这项工作也可以轻松扩展以利用城市数据。 该存储库基于的博客文章并允许您使用。 这些数据库。 将我们要使用的数据...

    基于富连接子网的IP地理定位方法

    最后,通过修改过程来估计目标主机的位置现有的基础上选定的地标和探测主机基于延迟的IP地理定位技术。 覆盖中国30个省和3个主要ISP的实验表明,该方法可以找到相应的富连接子网络,并在实际的较差连接网络中显着...

    ip-geolocation-api:基于ip的地理位置探测器

    前端向导-IP地址跟踪器欢迎! :waving_hand: 感谢您检查此前端...:warning: :要通过IPify使用IP地理位置API,您需要注册一个免费帐户。 您无需添加任何卡的详细信息即可完成此过程,这是一个非常快速的过程。 这将为

    微秒级别的IP地址定位库:ip2region

    精准定位:基于丰富的IP地址数据库,ip2region提供了精准的地理位置信息,帮助开发者更好地理解和分析用户行为。 多语言支持:ip2region支持多种主流编程语言的xdb数据生成和查询客户端实现,方便开发者在不同平台上...

    PW-ServiceIPGeolocation:ProcessWire 基于 IP 的地理定位模块

    由 Ryan Cramer 开发的 ProcessWire CMF/CMS 的 IP 地理定位模块。 使用地理定位服务查找给定 IP 地址的地理定位信息。 您需要在 db-ip.com 上注册并在模块的配置页面中插入您的服务 API 密钥才能使其工作。 ...

    基于IP的终端设备与IP-PBX

    另外,IP专用线路或IP中继线还能够用IP-PBX在不同地理位置的内部互连。IP专用线路的使用可以带来两大好处:一是使得公司总部的高级呼叫控制能力对于远程部门的员工同样可用;二是允许员工在不同的地理位置上进行IP...

    Java获取用户访问IP及地理位置的方法详解

    主要介绍了Java获取用户访问IP及地理位置的方法,结合实例形式详细分析了Java基于百度地图开放平台获取用户访问IP及地理位置相关操作技巧,需要的朋友可以参考下

    Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】

    主要介绍了Python2.7基于淘宝接口获取IP地址所在地理位置的方法,涉及Python调用淘宝IP库接口进行IP查询的简单操作技巧,需要的朋友可以参考下

    搭建一个基于TCP的服务器,该服务器向用户提供以下功能:1. 地理位置编码解码 2.域名到IP的解析

    一个典型的执行流程如下:启动服务器,启动客户端,用户在客户端上选择要进行地理位置编码或者域名到IP的解析 发送相应的请求到服务器 服务器根据客户端提交的请求,返回相应的数据 一个是程序的源代码 另一个是...

    基于路径特征实现区域级IP地理定位

    针对这一问题,本文提出了一种新的地理定位方法, 并且根据提取大量地标时所有可能区域的路径特征,该方法可以估计目标IP的区域。 实验结果表明,所提出的方法可以使定位区域具有较高的精度。 准确性。

    发现路由器作为精确IP地理位置的辅助地标

    大多数地理定位方法都是基于线性假设,即网络延迟和地理距离之间的相关性较大。 本文提出了一种轻量级的地理定位方法来准确确定Internet主机的位置。 这种方法利用了相对延迟测量和通用路由器。 我们研究了小区域的...

    基于JavaScript定位当前的地理位置

    本文实例为大家分享了js定位当前地理位置的具体代码,供大家参考,具体内容如下 &lt;!DOCTYPE html&gt; &lt;html lang=en&gt; &lt;head&gt; &lt;meta charset=UTF-8&gt; &lt;meta name=viewport content=width=...

    GeoLite2-City20201006 全球国家IP定位离线库 (mmdb)

    提供web服务、基于订阅的可下载数据库和免费的可下载数据库,MaxMind GeoIP2产品为内容个性化、欺诈检测、广告定位、流量分析、遵从性、地理定位、地理防护和数字版权管理等广泛应用程序识别互联网用户的位置和其他...

Global site tag (gtag.js) - Google Analytics