zoukankan      html  css  js  c++  java
  • 通过IP地址进行精准定位

    可能会遇到这样的问题,服务器或者系统经常被扫描,通过IP地址我们只能查到某一个市级城市,如下图:

     

    当我们想具体到街道甚至门牌号,该怎么办???

    偶然间发现百度地图有高精度IP定位API的接口,通过该接口我们可以通过IP地址定位到具体的地理位置,甚至能精确到门牌号及周围的标志性建筑。该接口的说明地址为:lbsyun.baidu.com/index.php?title=webapi/high-acc-ip

    若想要使用该接口进行查询,必须先申请一个密钥(AK),如下图:

     

    申请过程就不进行说明了。API的接口参数说明和返回参数说明也不过多的介绍,大家可以看一看。因为我想返回基础定位结果+地址信息+POI信息,所以我将请求参数extensions的值设置为3。一次完整的http请求为:api.map.baidu.com/highacciploc/v1?qcip=183.55.116.90&qterm=pc&ak=“你的 密钥(AK)”&coord=bd09ll&extensions=3 。请求结果如下图:

     

    结果为json格式数据:

     

    我们需要的字段为:content字段里面的formatted_address。当然我们也可以将location里面的经度和纬度提取出来从而显示在地图上面。有的IP地址会返回pois数据,比如:183.55.116.95。返回参数如下:

     

    此时我们可以把pois字段也提取出来,值得注意的是pois为数组,我们可以遍历数组数据。

    通过上面的分析,用python简单的写了一个脚本,具体代码如下:

     1 # -*- coding:utf-8 -*-
     2 
     3 # author:allen权
     4 
     5 import sys
     6 
     7 import urllib2
     8 
     9 import json
    10 
    11 def get_ip_information(ip):
    12 
    13 url='http://api.map.baidu.com/highacciploc/v1?qcip='+ip+'&qterm=pc&ak='你的密钥(AK)'&coord=bd09ll&extensions=3'
    14 
    15 poiss=''
    16 
    17 request = urllib2.Request(url)
    18 
    19 page = urllib2.urlopen(request, timeout=10)
    20 
    21 data_json = page.read()
    22 
    23 data_dic = json.loads(data_json)
    24 
    25 if(data_dic.has_key(\\"content\\")):
    26 
    27 content=data_dic[\\"content\\"]
    28 
    29 address_component=content[\\"address_component\\"]
    30 
    31 formatted_address=content[\\"formatted_address\\"]
    32 
    33 print \\"该IP地址的具体位置为:\\"
    34 
    35 print address_component[\\"country\\"]
    36 
    37 print formatted_address
    38 
    39 if (content.has_key(\\"pois\\")):
    40 
    41 print \\"该IP地址附近POI信息如下:\\"
    42 
    43 pois = content[\\"pois\\"]
    44 
    45 for index in range(len(pois)):
    46 
    47 pois_name = pois[index][\\"name\\"]
    48 
    49 pois_address = pois[index][\\"address\\"]
    50 
    51 print pois_name, pois_address
    52 
    53 else:
    54 
    55 print 'IP地址定位失败!!!'
    56 
    57 if __name__ == '__main__':
    58 
    59 get_ip_information('183.55.116.95')

    大家把脚本上面的参数ak值改为自己的密钥即可。测试截图如下:

     

    再放一张自己IP的测试截图:

     

    确实精确到了路名,很准确,虽然没有pois的信息。

    最后声明一下,成功率:综合定位成功率 65% ,精度:90% 误差 80m 以内;95% 误差 350m。这是官方给出的数据,所说有一定的概率是查询失败的!!!!

  • 相关阅读:
    InterLockedIncrement and InterLockedDecrement函数原理
    矩阵文件书写的简洁代码
    注册自定义URL协议(zhuan)
    求整数的位数
    WinExec unicode 处理
    C++中如何获取对象的名字(变量名,注意不是类名)
    计算所与北大往事回顾
    不尚贤在人事管理中的作用
    寻找适合自己的无资金创业之路
    诺基亚:用薪酬激励员工
  • 原文地址:https://www.cnblogs.com/Shepherdzhao/p/7768597.html
Copyright © 2011-2022 走看看