事情是這樣的,我有一大堆用戶的的個人數(shù)據(jù),數(shù)據(jù)中包含用戶的”住址“這個字段。住址可能來源于身份證上的地址,也有可能是手工錄入的地址,比如地址是“南京金陵飯店”。為了對用戶住址進行更精確的定位,需要將地址轉(zhuǎn)換成更加規(guī)范的格式,形如(省,市,區(qū),街道,街道號)這樣的形式?!澳暇┙鹆觑埖辍本蜁挥成錇椋ńK省,南京市,鼓樓區(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)已定義的地址。
- 對錯別字的容忍度較低。