使用百度地图API进行数据清理

事情是这样的,我有一大堆用户的的个人数据,数据中包含用户的”住址“这个字段。住址可能来源于身份证上的地址,也有可能是手工录入的地址,比如地址是“南京金陵饭店”。为了对用户住址进行更精确的定位,需要将地址转换成更加规范的格式,形如(省,市,区,街道,街道号)这样的形式。“南京金陵饭店”就会被映射为(江苏省,南京市,鼓楼区,汉中路, 2号).

使用手工的方式来转换肯定是不现实的,一定需要借助于工具。开始考虑过通过关键字匹配的方式进行转换,比如把地址中包含“鼓楼区”的映射到(江苏省,南京市,鼓楼区,,)。 但这样有两个弱点:

  1. 覆盖率低,很多地址是XXX小区,或直接写成XXX街道XX号。
  2. 准确率低,只能精确到区县级别。

最后选择是用百度地图提供的API (http://lbsyun.baidu.com/ )来进行转换。百度地图提供了
a. 地址解析,将文本描述的地址转换成坐标。
b.逆地址解析, 将坐标转换陈格式化的地址。

基本思路是 输入文本->获取坐标->转换成格式化的文本。

但是现在的问题是API对调用次数有限制,未认证用户每天限6000次,大致算了下,差不多要10多天才算的完。我又不想去弄个认证,咋办呢?

百度地图API提供一个演示平台 http://lbsyun.baidu.com/jsdemo.htm#i7_1

使用百度地图API进行数据清理_第1张图片
image.png

支持通过编辑代码来执行自己的功能,而在这里执行的代码是 没有 API调用次数限制的。但是前端执行的代码,数据输出是一个大问题。内容不能直接输出成文件,更不能输出到数据库了。最常用的输出也就是输出到控制台上,但是对于大量数据来说,如何把console上的数据采集回来有是一个问题。 我们选择把数据存储到localstorage中去,这样既能保持数据的格式良好,又便于数据的收集。要做的事情也很简单

  1. 定义一个大的数组
  2. 通过setInterval的方式调用下面的函数,先进行地址转换得到坐标,再进行逆地址转换得到格式化的地址,最后存入localstorage。
function getLocation(address)
  {
    var currentLocation = address;
    myGeo.getPoint(currentLocation, function(point){
        if (point) {
          myGeo.getLocation(point, function(rs){

            if(rs && rs.addressComponents){
                var addComp = rs.addressComponents;
                var newAddress = addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber;
                localStorage.setItem(currentLocation, newAddress);
            }
        }); 
        }else{
            //alert("您选择地址没有解析到结果!");
        }
    }, "重庆市");
  }

问题

对转换结果进行分析,绝大部分转换还是很准确,但还存在如下问题:

  1. 有些地址本身并没有精确到街道号,但是转换出来的地址中竟然包含街道号。我猜想在进行地址->坐标的转换时,API会把这个地址映射到系统内部定义好的并和输入的地址尽可能近的坐标,但是系统内已定义的地址和输入的地址并不是完全一致。而在进行逆地址解析时返回的就是系统已定义的地址。
  2. 对错别字的容忍度较低。

你可能感兴趣的:(使用百度地图API进行数据清理)