摘要:
很多用戶一直無法區分地址解析geocoder和智能搜索localsearch的使用場景。該文章用一個詳盡的示例,充分展示了這兩個類,共5種方法的使用場景。並在文章末尾貼出全部源代碼。
工具如下圖:

小貼士:
如果你手里有一大批從第三方獲取的地址信息(並且只有地址信息),建議您采取如下步驟:
第一、使用百度地圖API的地址解析接口,將地址解析為經緯度point數據,並存儲在數據庫中,方便以后查詢和使用;
第二、如果有些地址解析失敗了,請使用坐標拾取工具,人工地找到經緯度point信息,並同樣儲存起來。(坐標拾取工具,請點擊這里。)
記住,只有經緯度point信息,能讓你打點的位置萬無一失!
解說:
什么是地址解析?
地址解析,即Geocoder類,是根據一個地址得到對應的經緯度point。注:地址需要詳細到街道,例如“北京市海淀區中關村南大街”。
地址解析類有兩個方法,一是getPoint,通過詳細到街道的地址,得出一個經緯度。
地址解析的格式如下:省+城市+區縣+街道 (可以不用門牌號)
地址解析成功的例子:北京市 北京市 海淀區 中關村南大街 27號
這是地址解析一定會失敗的例子:南京路工行(1、根本沒有指定城市,區縣。中國有很多城市有南京路,不清楚到底是那一條南京路。2、南京路上可能有不止一個工行,比如銀行,ATM,辦事處等。)
另外一個是getLocation,又稱反地址解析。它利用經緯度point,得出一個詳細的地址。

什么是智能搜索?
智能搜索,即localsearch類,可以根據任意關鍵詞查詢到對應的POI信息。
關鍵詞可以是“上海市麥當勞”“重慶市解放碑”,當沒有城市信息時,默認在當前城市進行搜索。
Localsearch類會根據關鍵詞的內容,智能地搜索POI的title和content信息。比如,搜索“家樂福”時,也能搜索到家樂福附近的面館,停車場等信息。
智能搜索有三種方法,分別是:search、searchInBounds和searchNearby。利用此三種方法可以搜索到百度地圖數據庫中所有POI信息。

展現結果:
1、地址解析geocoder類
getPoint方法

getLocation方法

2、智能搜索localsearch類
search方法

searchInbounds方法

searchNearby方法

清除上地圖所有覆蓋物,map.clearOverlays();
清除檢索結果,myLocalsearch.clearResults();

秘籍:
搜索“肯德基”“招商銀行”這樣的關鍵詞時,使用智能搜索localsearch。
搜索詳細到街道的地址時,如“北京市海淀區中關村南大街27號”,使用地址解析geocoder。
全部源代碼:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>地址解析和智能搜索</title>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.2"></script>
</head>
<body>
<h2>1、地址解析Geocoder</h2>
<input style="width:300px;" type="text" value="上海市浦東新區花木路" id="address_1" /><input value="地址解析" type="button" onclick="fun_geocoder_getPoint();" />(getPoint:需要輸入詳細到街道的地址)</br>
<span style="display:inline-block;line-height:20px;width:300px;font-size:14px;border-bottom:1px solid #ccc;" type="text" id="address_2"></span><input value="反地址解析" type="button" onclick="fun_geocoder_getLocation();" />(getLocation:點擊反地址解析后,點擊地圖返回地址。)</br>
<h2>2、智能搜索Localsearch</h2>
<input style="width:300px;" type="text" value="冀興駕校" id="keyword_1" /><input value="智能搜索" type="button" onclick="fun_search();" />(search:在指定城市或全國內搜索關鍵詞。)</br>
<input style="width:300px;" type="text" value="肯德基" id="keyword_2" /><input value="視野內搜索" type="button" onclick="fun_searchInBounds();" />(searchInBound:在可視范圍內搜索關鍵詞內容)</br>
<input style="width:100px;" type="text" value="銀行" id="keyword_3_keywords" /><input style="width:75px;" type="text" value="116.381452" id="keyword_3_center_x" /><input style="width:75px;" type="text" value="39.914446" id="keyword_3_center_y" /><input style="width:50px;" type="text" value="500" id="keyword_3_radius" /><input value="周邊搜索" type="button" onclick="fun_searchNearby();" />(searchNearby:中心點為字符串時,將自動忽略半徑)</br>
<div style="clear:both;margin:10px 0 0;"></div>
<div style="width:520px;height:340px;border:1px solid gray;float:left;" id="container"></div>
<div style="width:300px;height:340px;float:left;" id="results"></div>
<div style="clear:both;"></div>
<input type="button" onclick="map.clearOverlays();myLocalsearch.clearResults();" style="margin:10px 0 0;height:50px;width:100px;" value="洗刷地圖" /> (清除地圖上的覆蓋物和檢索結果)
</body>
</html>
<script type="text/javascript">
//以下兩句話用來創建地圖
var map = new BMap.Map("container"); //創建地圖容器
map.centerAndZoom("北京市",12); //初始化地圖。設置中心點和地圖級別
//添加魚骨控件
map.addControl(new BMap.NavigationControl());
//獲取各個id的value
/*
var value_address_1 = document.getElementById("address_1").value;
var value_keyword_1 = document.getElementById("keyword_1").value;
var value_keyword_2 = document.getElementById("keyword_2").value;
var value_keyword_3_keywords = document.getElementById("keyword_3_keywords").value;
var value_keyword_3_center_x = document.getElementById("keyword_3_center_x").value;
var value_keyword_3_center_y = document.getElementById("keyword_3_center_y").value;
var value_keyword_3_radius = document.getElementById("keyword_3_radius").value;
*/
//創建地址解析的實例
var myGeo = new BMap.Geocoder();
//地址解析的函數
function fun_geocoder_getPoint(){
var value_address_1 = document.getElementById("address_1").value;
myGeo.getPoint(value_address_1, function(point){
if (point) {
map.centerAndZoom(point, 15);
map.addOverlay(new BMap.Marker(point));
}
}, "全國");
}
//反地址解析的函數
function fun_geocoder_getLocation(){
map.addEventListener("click", function(e){
var pt = e.point;
myGeo.getLocation(pt, function(rs){
var addComp = rs.addressComponents;
document.getElementById("address_2").innerHTML = addComp.province + addComp.city + addComp.district + addComp.street + addComp.streetNumber;
});
});
}
//智能搜索Localsearch類
var options = {renderOptions: {map: map, panel: "results"}};
var myLocalsearch = new BMap.LocalSearch(map,options);
//模糊查詢search方法
function fun_search(){
var value_keyword_1 = document.getElementById("keyword_1").value;
myLocalsearch.search(value_keyword_1);
}
//視野內搜索searchInBounds方法
function fun_searchInBounds(){
var value_keyword_2 = document.getElementById("keyword_2").value;
myLocalsearch.searchInBounds(value_keyword_2, map.getBounds());
}
//周邊搜索fun_searchNearby方法
function fun_searchNearby(){
var value_keyword_3_keywords = document.getElementById("keyword_3_keywords").value;
var value_keyword_3_center_x = document.getElementById("keyword_3_center_x").value;
var value_keyword_3_center_y = document.getElementById("keyword_3_center_y").value;
var value_keyword_3_radius = document.getElementById("keyword_3_radius").value;
myLocalsearch.searchNearby(value_keyword_3_keywords,new BMap.Point(value_keyword_3_center_x,value_keyword_3_center_y),value_keyword_3_radius);
}
</script>
