其他文章:
安卓百度離線地圖的下載以及使用
安卓百度地圖(一)定位功能的實(shí)現(xiàn)枝恋、周邊POI的檢索
安卓百度地圖(二)地圖顯示以及離線地圖的下載使用
安卓百度地圖(三)繪制點(diǎn)创倔、線等圖層信息
安卓百度地圖(五)百度地圖路線規(guī)劃
安卓百度地圖(六)鷹眼軌跡的上傳,歷史軌跡的顯示
安卓百度地圖(七)地理圍欄的建立與使用
本文就百度地圖的城市焚碌,周邊畦攘,區(qū)域POI檢索,進(jìn)行整理
一 POI檢索簡介
POI(Point of Interest)十电,中文可以翻譯為“興趣點(diǎn)”念搬。在地理信息系統(tǒng)中,一個(gè)POI可以是一棟房子摆出、一個(gè)商鋪朗徊、一個(gè)郵筒、一個(gè)公交站等偎漫。
百度地圖SDK提供三種類型的POI檢索:城市內(nèi)檢索爷恳、周邊檢索和區(qū)域檢索(即矩形范圍檢索)。下面將以POI城市內(nèi)檢索象踊、周邊檢索 和 區(qū)域檢索為例温亲,向大家介紹如何使用檢索服務(wù)。
二 POI檢索
2.1 創(chuàng)建POI檢索實(shí)例
mPoiSearch = PoiSearch.newInstance();
2.2 設(shè)置POI檢索監(jiān)聽者
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
2.3 創(chuàng)建POI檢索監(jiān)聽
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
public void onGetPoiResult(PoiResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(PoiActivity.this, "未搜索到POI數(shù)據(jù)", Toast.LENGTH_SHORT).show();
}
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
//獲取POI檢索結(jié)果
Toast.makeText(PoiActivity.this, "已搜索到POI數(shù)據(jù)", Toast.LENGTH_SHORT).show();
}
if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {
// 當(dāng)輸入關(guān)鍵字在本市沒有找到杯矩,但在其他城市找到時(shí)栈虚,返回包含該關(guān)鍵字信息的城市列表
String strInfo = "在";
for (CityInfo cityInfo : result.getSuggestCityList()) {
strInfo += cityInfo.city;
strInfo += ",";
}
strInfo += "找到結(jié)果";
Toast.makeText(PoiActivity.this, strInfo, Toast.LENGTH_LONG).show();
}
}
2.4發(fā)起檢索請求
2.4.1 城市內(nèi)檢索
輸入城市名(city),以及物品(name),和頁碼(num)發(fā)起檢索史隆。
mPoiSearch.searchInCity((new PoiCitySearchOption())
.city(city)
.keyword(name)
.pageNum(num));
2.4.2 周邊檢索
周邊搜索是一個(gè)圓形范圍魂务,適用于以某個(gè)位置為中心點(diǎn),輸入圓心(center)泌射、自定義檢索半徑值(radius)和頁碼(num)發(fā)起檢索粘姜。
mPoiSearch.searchNearby(new PoiNearbySearchOption()
.keyword("餐廳")
.sortType(PoiSortType.distance_from_near_to_far)
.location(center)
.radius(radius)
.pageNum(num));
2.4.2 區(qū)域檢索(即矩形范圍檢索)
POI區(qū)域檢索以“用戶指定的左下角和右上角坐標(biāo)的長方形區(qū)域”為檢索范圍的poi檢索。
LatLng southwest = new LatLng( 39.92235, 116.380338 );
LatLng northeast = new LatLng( 39.947246, 116.414977);
LatLngBounds searchbound = new LatLngBounds.Builder()
.include(southwest)
.include(northeast)
.build();
mPoiSearch.searchInBound(new PoiBoundSearchOption()
.bound(searchbound)
.keyword("餐廳"));
2.5 熱詞建議檢索
2.5.1 創(chuàng)建在線建議查詢實(shí)例
mSuggestionSearch = SuggestionSearch.newInstance();
2.5.2 創(chuàng)建在線建議查詢監(jiān)聽者
OnGetSuggestionResultListener listener = new OnGetSuggestionResultListener() {
public void onGetSuggestionResult(SuggestionResult res) {
if (res == null || res.getAllSuggestions() == null) {
return;
//未找到相關(guān)結(jié)果
}
//獲取在線建議檢索結(jié)果
}
};
2.5.3 設(shè)置在線建議查詢監(jiān)聽者
mSuggestionSearch.setOnGetSuggestionResultListener(listener);
2.5.4 發(fā)起在線建議查詢
// 使用建議搜索服務(wù)獲取建議列表熔酷,結(jié)果在onSuggestionResult()中更新
mSuggestionSearch.requestSuggestion((new SuggestionSearchOption())
.keyword(“百度”)
.city(“北京”));
2.5.5 釋放在線建議查詢實(shí)例孤紧;
mSuggestionSearch.destroy();
2.6 釋放POI檢索實(shí)例;
mPoiSearch.destroy();
2.7 注意事項(xiàng)
- 在傳入city檢索無結(jié)果時(shí)拒秘,會擴(kuò)大檢索范圍号显,在全國進(jìn)行檢索臭猜。如有檢索結(jié)果,不會直接返回押蚤,但會提示哪些城市有結(jié)果获讳。
- 在傳入city檢索時(shí),返回的結(jié)果太多活喊,涉及多個(gè)城市丐膝,可以將擴(kuò)大檢索的城市l(wèi)ist羅列,讓用戶點(diǎn)擊選擇钾菊,再針對選定城市進(jìn)行二次檢索(如果只有一個(gè)城市帅矗,后端直接進(jìn)行二次檢索)∩诽蹋可以調(diào)用的接口在PoiResult類中:
public List<CityInfo> getSuggestCityList() //返回城市列表頁的結(jié)果數(shù)
三 公交線路查詢
3.1 線路名稱查詢
輸入公交線路的名稱贸营,POI檢索返回的POI結(jié)果中懂缕,epoitype字段表示POI類型涛舍,epoitype字段值為2表示公交路線拂共,4表示地鐵路線,把這兩種類型的POI的uid傳給公交信息檢索接口料饥,可以得到該P(yáng)OI所代表的路線的詳細(xì)信息(如:該公交線有多少個(gè)站點(diǎn)蒲犬,每個(gè)站點(diǎn)的名稱,位置岸啡、參考票價(jià)和上下線行信息)原叮。
3.1.1 發(fā)起POI檢索,獲取相應(yīng)線路的UID巡蘸;
//以城市內(nèi)檢索為例奋隶,詳細(xì)方法請參考POI檢索部分的相關(guān)介紹
mSearch.searchInCity((new PoiCitySearchOption())
.city(“北京”)
.keyword(“302”);
3.1.2 在POI檢索結(jié)果中判斷該P(yáng)OI類型是否為公交信息
public void onGetPoiResult(PoiResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
return;
}
//遍歷所有POI,找到類型為公交線路的POI
for (PoiInfo poi : result.getAllPoi()) {
if (poi.type == PoiInfo.POITYPE.BUS_LINE ||poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
//說明該條POI為公交信息悦荒,獲取該條POI的UID
busLineId = poi.uid;
break;
}
}
}
3.1.3定義并設(shè)置公交信息結(jié)果監(jiān)聽者(與POI類似)唯欣,并發(fā)起公交詳情檢索
//如下代碼為發(fā)起檢索代碼,定義監(jiān)聽者和設(shè)置監(jiān)聽器的方法與POI中的類似
mBusLineSearch.searchBusLine((new BusLineSearchOption()
.city(“北京”)
.uid(busLineId)));
//線路 ID 查詢
獲取公交線路的詳細(xì)信息搬味,可使用線路 ID 查詢境氢。結(jié)果返回線路信息有線路 ID、公交類型身腻、線路名稱产还、線路坐標(biāo)、城市編碼嘀趟、首發(fā)站、末站愈诚、首班車時(shí)間她按、末班車時(shí)間牛隅、全程里程、起步價(jià)酌泰、全程票價(jià)媒佣、線路沿途坐標(biāo)。
<pre>
四 地理編碼
地理編碼分:正向地圖編碼陵刹、反向地圖編碼
正向地理編碼:將地址信息轉(zhuǎn)換為坐標(biāo)點(diǎn)
反向地理編碼:將坐標(biāo)點(diǎn)轉(zhuǎn)換為地址信息
GeoCoder mSearch = GeoCoder.newInstance();//初始化地理編碼
mSearch.setOnGetGeoCodeResultListener(listener);//設(shè)置回調(diào)監(jiān)聽
ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
reverseGeoCodeOption.location(new LatLng(36.897,127.9897));//設(shè)置坐標(biāo)點(diǎn)
mSearch.reverseGeoCode(reverseGeoCodeOption);//將坐標(biāo)點(diǎn)轉(zhuǎn)換為地址信息
GeoCodeOption geoCodeOption = new GeoCodeOption();
geoCodeOption.address(addressStr);//設(shè)置地址
geoCodeOption.city(cityStr);//設(shè)置城市
mSearch.geocode(geoCodeOption);//將地址信息轉(zhuǎn)換為坐標(biāo)點(diǎn)
OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
//正向地理編碼回調(diào)默伍,注意geoCodeResult中錯誤碼的處理
geoCodeResult.getLocation();//坐標(biāo)點(diǎn)
geoCodeResult.getAddress();//地址信息
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
//反向地理編碼回調(diào)
reverseGeoCodeResult.getAddress();//簡要地址信息
reverseGeoCodeResult.getAddressDetail();//層次化地址信息
reverseGeoCodeResult.getBusinessCircle();//所屬商圈名稱
reverseGeoCodeResult.getPoiList();//周邊POI信息集合
reverseGeoCodeResult.getSematicDescription();//描述信息
reverseGeoCodeResult.getLocation();//坐標(biāo)點(diǎn)
}
});
五 行政區(qū)邊界數(shù)據(jù)檢索
根據(jù)省、市衰琐、縣(區(qū))級行政區(qū)劃名稱也糊,查詢行政區(qū)劃的詳細(xì)邊界信息。
DistrictSearch mDistrictSearch = DistrictSearch.newInstance();//初始化行政區(qū)檢索
mDistrictSearch.setOnDistrictSearchListener(listener );//設(shè)置回調(diào)監(jiān)聽
DistrictSearchOption districtSearchOption = new DistrictSearchOption();
districtSearchOption.cityName(cityStr);//檢索城市名稱
districtSearchOption.districtName(districtStr);//檢索的區(qū)縣名稱
mDistrictSearch.searchDistrict(districtSearchOption);//請求行政區(qū)數(shù)據(jù)
OnGetDistricSearchResultListener listener = new OnGetDistricSearchResultListener() {
@Override
public void onGetDistrictResult(DistrictResult districtResult) {
districtResult.getCenterPt();//獲取行政區(qū)中心坐標(biāo)點(diǎn)
districtResult.getCityName();//獲取行政區(qū)域名稱
List<List<LatLng>> polyLines = districtResult.getPolylines();//獲取行政區(qū)域邊界坐標(biāo)點(diǎn)
//邊界就是坐標(biāo)點(diǎn)的集合羡宙,在地圖上畫出來就是多邊形圖層狸剃。有的行政區(qū)可能有多個(gè)區(qū)域,所以會有多個(gè)點(diǎn)集合狗热。
}
};
本文主要做于收集整理筆記使用钞馁,關(guān)于文章的源碼,請移步我的GitHub