zoukankan      html  css  js  c++  java
  • 百度地图ip定位,不算bug的bug

    做为一个入行不足两年的菜鸟,能在博客园写下第一篇博客,是需要多大的勇气啊。主要还是怕大神们喷啊。其次自己文笔实在太差了。 哈哈~还请各位大神,口下留情啊。

    首先说下我的需求:一个需要城市分站的手机站。 当用户访问时自动定位到用户所在的城市。因为之前做微信开发的时候,研究过一段时间的百度地图api,拿到这个需求后,第一时间想到的就是ip定位api. 先贴出百度官方的说明:

    IP定位 API是一个根据IP返回对应位置信息的http形式位置服务接口,支持多种语言调用,如C# 、C++、Java等,即通过发送http请求,返回json格式的位置数据(包括坐标值、省份、城市、百度城市代码等)。

    提供根据IP返回位置信息的功能,包括如下两种情况:

    1.获取指定IP的位置信息:指定IP值,返回该IP对应的位置信息;

    2.获取当前设备IP的地址信息:根据用户设备当前的IP返回位置信息;

     

    使用方法

     

    第一步,申请密钥(ak) ,作为访问服务的依据;

     

    第二步,拼写发送http请求的url,注意需使用第一步申请的ak;

     

    第三步,接收http请求返回的数据(json格式)。

     

    服务地址

     

    URL:http://api.map.baidu.com/location/ip

     

    接口参数

     

    参数含义格式说明
    ip ip地址 string 可选,ip不出现,或者出现且为空字符串的情况下,会使用当前访问者的IP地址作为定位参数
    ak 用户密钥 string 必选,在lbs云官网注册的access key,作为访问的依据
    sn 用户的权限签名 string 可选,若用户所用ak的校验方式为sn校验时该参数必须。(sn生成算法
    coor 输出的坐标格式 string 可选,coor不出现时,默认为百度墨卡托坐标;coor=bd09ll时,返回为百度经纬度坐标

     

     

     

     

     

    返回值说明

     

    返回结果(地址解析的结果)

     

    1. {  
    2.     address: "CN|北京|北京|None|CHINANET|1|None",   #地址  
    3.     content:       #详细内容  
    4.     {  
    5.     address: "北京市",   #简要地址  
    6.     address_detail:      #详细地址信息  
    7.     {  
    8.     city: "北京市",        #城市  
    9.     city_code: 131,       #百度城市代码  
    10.     district: "",           #区县  
    11.     province: "北京市",   #省份  
    12.     street: "",            #街道  
    13.     street_number: ""    #门址  
    14.     },  
    15.     point:               #百度经纬度坐标值  
    16.     {  
    17.     x: "116.39564504",  
    18.     y: "39.92998578"  
    19.     }  
    20.     },  
    21.     status: 0     #返回状态码  
    22. }   
    23.                   
    24.               

     

     

    我的实现流程是在页面加载的时候,模拟执行http请求,根据返回值,判断当前所在的城市。然后显示不同城市的数据。

       

    返回的结果如下:

    1 {"address":"CN|u6d59u6c5f|None|None|CHINANET|None|None","content":{"address_detail":{"province":"u6d59u6c5fu7701","city":"","district":"","street":"","street_number":"","city_code":29},"address":"u6d59u6c5fu7701","point":{"y":"3374952.26","x":"13353719.99"}},"status":0}
    View Code

    然后解析这段json,就可以获取到当前所在的城市,和当前的地理位置经纬度了。

    做到这里,没发现有什么端倪。 但当把程序发布后,部署到阿里云后,奇迹出现了,无论我用任何设备访问,获取的位置都是北京。思索很久,也不得所知,毕竟本地执行是正确的。后来无意中发现公司的阿里云的ip就是北京的,而获取到的ip就和阿里云的ip.当时的第一个想法就是百度的接口出现了bug,还蛮天真的给百度提交了bug反馈,希望他们能尽快修复,或者给我一个反馈。结果等了半个月,至今没任何信息。 唉,谁让咱太傻太天真了呢。

    后来仔细想想,问题应该就是接口获取到的是服务器端的位置。 因为代码最终是通过客户端发起的请求,然后服务器端在响应的时候运行的。换个思路来讲,如果要定位客户端的话,就必须在客户端执行,想到这里,也就想到了解决方案了,那就是通过js,在客户端获取到位置信息,然后再跳转到对应的城市分站。

     <script src="/js/jquery-1.4.4.js"></script>
        <script>
            $(function () {
                $.getJSON("http://api.map.baidu.com/location/ip?ak=此处是百度地图分配的ak&callback=?", function (data) {
                    alert(data.address);
                })
            })
        </script>
    View Code

    由于要客户端执行,要考虑跨域的问题,所以在地址的后面要加上&callback=?,这样就可以调用接口返回来的信息了。

    写完收工,大神请悠着点喷。欢迎指点。

    还有,大家觉得这个算是一个bug吗?

  • 相关阅读:
    [luoguP2770] 航空路线问题(最小费用最大流)
    javascript技巧大全套
    jLim
    自己封装的Ajax
    JavaScript函数调用规则
    JavaScript模板引擎使用
    JavaScript MD5
    JavaScript SHA-1
    JavaScript Map对象的实现
    javascript中的_return_false和return_true
  • 原文地址:https://www.cnblogs.com/zskbll/p/3710601.html
Copyright © 2011-2022 走看看