事情是這樣的峻呕,我有一大堆用戶的的個人數(shù)據(jù)利职,數(shù)據(jù)中包含用戶的”住址“這個字段。住址可能來源于身份證上的地址瘦癌,也有可能是手工錄入的地址猪贪,比如地址是“南京金陵飯店”。為了對用戶住址進行更精確的定位讯私,需要將地址轉(zhuǎn)換成更加規(guī)范的格式热押,形如(省,市斤寇,區(qū)桶癣,街道,街道號)這樣的形式抡驼」砝“南京金陵飯店”就會被映射為(江蘇省,南京市致盟,鼓樓區(qū)碎税,漢中路, 2號).
使用手工的方式來轉(zhuǎn)換肯定是不現(xiàn)實的,一定需要借助于工具馏锡。開始考慮過通過關(guān)鍵字匹配的方式進行轉(zhuǎn)換雷蹂,比如把地址中包含“鼓樓區(qū)”的映射到(江蘇省,南京市杯道,鼓樓區(qū)匪煌,,)党巾。 但這樣有兩個弱點:
- 覆蓋率低萎庭,很多地址是XXX小區(qū),或直接寫成XXX街道XX號齿拂。
- 準確率低驳规,只能精確到區(qū)縣級別。
最后選擇是用百度地圖提供的API (http://lbsyun.baidu.com/ )來進行轉(zhuǎn)換署海。百度地圖提供了
a. 地址解析吗购,將文本描述的地址轉(zhuǎn)換成坐標医男。
b.逆地址解析, 將坐標轉(zhuǎn)換陳格式化的地址捻勉。
基本思路是 輸入文本->獲取坐標->轉(zhuǎn)換成格式化的文本镀梭。
但是現(xiàn)在的問題是API對調(diào)用次數(shù)有限制,未認證用戶每天限6000次踱启,大致算了下报账,差不多要10多天才算的完。我又不想去弄個認證禽捆,咋辦呢笙什?
百度地圖API提供一個演示平臺 http://lbsyun.baidu.com/jsdemo.htm#i7_1
支持通過編輯代碼來執(zhí)行自己的功能,而在這里執(zhí)行的代碼是 沒有 API調(diào)用次數(shù)限制的胚想。但是前端執(zhí)行的代碼琐凭,數(shù)據(jù)輸出是一個大問題。內(nèi)容不能直接輸出成文件浊服,更不能輸出到數(shù)據(jù)庫了统屈。最常用的輸出也就是輸出到控制臺上,但是對于大量數(shù)據(jù)來說牙躺,如何把console上的數(shù)據(jù)采集回來有是一個問題愁憔。 我們選擇把數(shù)據(jù)存儲到localstorage中去,這樣既能保持數(shù)據(jù)的格式良好孽拷,又便于數(shù)據(jù)的收集吨掌。要做的事情也很簡單
- 定義一個大的數(shù)組
- 通過setInterval的方式調(diào)用下面的函數(shù),先進行地址轉(zhuǎn)換得到坐標脓恕,再進行逆地址轉(zhuǎn)換得到格式化的地址膜宋,最后存入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("您選擇地址沒有解析到結(jié)果!");
}
}, "重慶市");
}
問題
對轉(zhuǎn)換結(jié)果進行分析炼幔,絕大部分轉(zhuǎn)換還是很準確秋茫,但還存在如下問題:
- 有些地址本身并沒有精確到街道號,但是轉(zhuǎn)換出來的地址中竟然包含街道號乃秀。我猜想在進行地址->坐標的轉(zhuǎn)換時肛著,API會把這個地址映射到系統(tǒng)內(nèi)部定義好的并和輸入的地址盡可能近的坐標,但是系統(tǒng)內(nèi)已定義的地址和輸入的地址并不是完全一致跺讯。而在進行逆地址解析時返回的就是系統(tǒng)已定義的地址枢贿。
- 對錯別字的容忍度較低。