百度地图开发之poi检索,线路规划
官方文档 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key
先去官方文档申请秘钥下载压缩文件等操作,参考
公交,步行,驾车路线查询,附近POI查询
参考文档导入所需jar包和so文件
标注点,覆盖物的实现见官方文档
poi检索:
1.首先获取地图,创建poi检索实例:
private void initView() {
//输入框
etPoi = (EditText) inflate.findViewById(R.id.fragment_detailpage_search_et_poi);
//检索图标
ivSearch = (ImageView) inflate.findViewById(R.id.fragment_detailpage_search_iv_search);
//设置点击监听
ivSearch.setOnClickListener(this);
//获取地图控件引用
mMapView = (MapView)inflate.findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
//普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//创建POI检索实例
mPoiSearch = PoiSearch.newInstance();
//详细信息布局
mMarkerInfoLayout = (RelativeLayout)inflate. findViewById(R.id.layout_map_rl_layout); }
2.为poi检索设置监听,监听回调了两个方法,第一个是poi检索结果的监听,当用户进行poi检索后,会回调该方法,第二个方法,是对检索后显示的标注点(marker)进行点击后回调的方法,会传入该点的详情结果对象,我们可以通过该对象得到名字,地址,url地址等
//设置监听
mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { /* 1.获得poi检索结果的监听*/ @Override
public void onGetPoiResult(PoiResult poiResult) {
//创建覆盖物对象
myPoiOverlay = new MyPoiOverlay(mBaiduMap);
myPoiOverlay.setData(poiResult);
myPoiOverlay.addToMap();
myPoiOverlay.zoomToSpan();
//给poi的结果设置点击事件,点击marker后弹出详情页
mBaiduMap.setOnMarkerClickListener(myPoiOverlay);
Log.i("tag", "获得poi检索结果的监听 ");
}
/* 3. poi的详情页结果*/
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(getActivity(), "抱歉,未找到结果",
Toast.LENGTH_SHORT).show();
etPoi.setText("");
} else {// 正常返回结果的时候,此处可以获得很多相关信息
//获取详情页的请求结果
String detailUrl = poiDetailResult.getDetailUrl();
//得到当前经纬度
Log.i("tag", "获取详情页的请求结果: detailUrl -" + poiDetailResult.getName() + ": "
+ poiDetailResult.getAddress());
Toast.makeText(getActivity(), detailUrl, Toast.LENGTH_SHORT).show();
//弹出窗体
// 设置详细信息布局为可见
mMarkerInfoLayout.setVisibility(View.VISIBLE);
//根据商家信息为详细信息布局设置信息
popupInfo(mMarkerInfoLayout, poiDetailResult);
}} @Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { }
});
上面创建的MyPoiOverlay是继承了PoiOverLay的,需要重写onPoiClick,当poi检索的结果被点击的时候回调该方法,然后通过获得该标注点的uid得到详情结果然后将详情结果,传入检索监听中的onGetPoiDetailResult(PoiDetailResult poiDetailResult),
注意:需要为marker设置点击监听,
mBaiduMap.setOnMarkerClickListener(myPoiOverlay);
class MyPoiOverlay extends PoiOverlay { /**
* 构造函数
*
* @param baiduMap 该 PoiOverlay 引用的 BaiduMap 对象
*/
public MyPoiOverlay(BaiduMap baiduMap) {
super(baiduMap);
} /*2.当poi的结果点被点击的时候调用*/
@Override
public boolean onPoiClick(int i) { //获取i对应的点的uid
String uid = getPoiResult().getAllPoi().get(i).uid;
Log.i("tag", "当poi的结果点被点击的时候调用: "+uid);
//uid是POI检索中获取的POI ID信息
mPoiSearch.searchPoiDetail((new PoiDetailSearchOption()).poiUid(uid));
return super.onPoiClick(i);
}
}
popInfo:使用viewHolder复用布局
private void popupInfo(RelativeLayout mMarkerInfoLayout,final PoiDetailResult poiDetailResult) {
ViewHolder viewHolder = null;
if(mMarkerInfoLayout.getTag() == null){
viewHolder = new ViewHolder();
viewHolder.poiName = (TextView) inflate.findViewById(R.id.layout_map_poiname);
viewHolder.poiAddress = (TextView)inflate.findViewById(R.id.layout_map_poiaddress);
viewHolder.poiSearch = (TextView) inflate.findViewById(R.id.layout_map_button);
mMarkerInfoLayout.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) mMarkerInfoLayout.getTag();
viewHolder.poiName.setText(poiDetailResult.getName());
viewHolder.poiAddress.setText(poiDetailResult.getAddress());
viewHolder.poiSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//弹出新的页面展示poi详情
Intent intent = new Intent(getActivity(), PoiDetailActivity.class);
intent.putExtra("POI_DETAIL_URL",poiDetailResult.getDetailUrl());
startActivity(intent);
}
});
}
}
class ViewHolder{
TextView poiName;
TextView poiSearch;
TextView poiAddress; }
为地图设置点击事件,点击隐藏布局
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener()
{
@Override
public boolean onMapPoiClick(MapPoi arg0)
{
return false;
} @Override
public void onMapClick(LatLng arg0)
{
mMarkerInfoLayout.setVisibility(View.GONE);
mBaiduMap.hideInfoWindow();
}
});
开始搜索poi:按城市内搜索
public void onStartSearch(View view){
// String keyword = etKeyword.getText().toString().trim();
/* if (TextUtils.isEmpty(keyword)){
return;
}*/
Log.i("tag", "onStartSearch: ");
mPoiSearch.searchInCity(new PoiCitySearchOption().city("杭州").keyword("美食").pageNum(10));
/**
* 附近检索
*/
/*
PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();
nearbySearchOption.location(new LatLng(latitude, longitude));
nearbySearchOption.keyword(editSearchKeyEt.getText().toString());
nearbySearchOption.radius(1000);// 检索半径,单位是米
nearbySearchOption.pageNum(10);
mPoiSearch.searchNearby(nearbySearchOption);// 发起附近检索请求*/ }
DetailPoiActivity
public class PoiDetailActivity extends Activity { private WebView wbPoiDetail; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_poidetail); wbPoiDetail = (WebView) findViewById(R.id.wv_poidetail);
Intent intent = getIntent();
String url = intent.getStringExtra("POI_DETAIL_URL");
Log.i("MainActivity", "url-" + url);
//webview加载数据
wbPoiDetail.loadUrl(url); wbPoiDetail.setWebViewClient(new WebViewClient(){//解决办法
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//返回true的时候网页在webView中去打开,如果为false则是调用系统浏览器打开
view.loadUrl(url);
return true;
}
}); }
}
效果如下:
线路规划基本步骤:
分析:
1.创建路规划检索实例
设置点击事件
2.准备检索起、终点信息
3.发起线路规划的检索
1.公交检索
2.驾车检索
3.步行
4.设置检索结果监听器
5.实现监听器
根据不同的结果展示不同的路线
1.公交检索
2.驾车检索
3.步行
public class RoutePlanActivity extends Activity {
private MapView mMapView;
private RoutePlanSearch mSearch;
private EditText etStartName;
private EditText etEndName;
private BaiduMap mBaiduMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_routeplan);
etStartName = (EditText) findViewById(R.id.et_startname);
etEndName = (EditText) findViewById(R.id.et_endname); //获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap(); // 1.创建路规划检索实例;
mSearch = RoutePlanSearch.newInstance(); //设置检索结果监听器
mSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { /*步行结果监听*/
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
if(walkingRouteResult == null || walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR){
Toast.makeText(RoutePlanActivity.this, "请求结果有误", Toast.LENGTH_SHORT).show();
}
if (walkingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
//构造公交线路的图层对象
WalkingRouteOverlay walkingRouteOverlay = new WalkingRouteOverlay(mBaiduMap); //给覆盖物设置数据
walkingRouteOverlay.setData(walkingRouteResult.getRouteLines().get(0));
//添加到map
walkingRouteOverlay.addToMap();
//设置自适应缩放
walkingRouteOverlay.zoomToSpan(); }
} /*公交线路监听*/
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
if(transitRouteResult == null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR){
Toast.makeText(RoutePlanActivity.this, "请求结果有误", Toast.LENGTH_SHORT).show();
}
if (transitRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
//构造公交线路的图层对象
TransitRouteOverlay transitRouteOverlay = new TransitRouteOverlay(mBaiduMap); //给覆盖物设置数据
transitRouteOverlay.setData(transitRouteResult.getRouteLines().get(0));
//添加到map
transitRouteOverlay.addToMap();
//设置自适应缩放
transitRouteOverlay.zoomToSpan(); } } /*驾车线路监听*/
@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
if(drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR){
Toast.makeText(RoutePlanActivity.this, "请求结果有误", Toast.LENGTH_SHORT).show();
}
if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
//构造公交线路的图层对象
DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(mBaiduMap); //给覆盖物设置数据
drivingRouteOverlay.setData(drivingRouteResult.getRouteLines().get(0));
//添加到map
drivingRouteOverlay.addToMap();
//设置自适应缩放
drivingRouteOverlay.zoomToSpan(); }
} @Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) { }
});
} public void onSearchRuote(View view) {
//检查数据是否合法
String startName = etStartName.getText().toString().trim();
String endName = etEndName.getText().toString().trim();
if (TextUtils.isEmpty(startName) || TextUtils.isEmpty(endName)) {
return;
} PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", startName);
PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", endName); switch (view.getId()) {
case R.id.btn_transit:
mSearch.transitSearch(new TransitRoutePlanOption().from(stNode).to(enNode).city("北京"));
break;
case R.id.btn_driving:
mSearch.drivingSearch(new DrivingRoutePlanOption().from(stNode).to(enNode));
break;
case R.id.btn_walking:
mSearch.walkingSearch(new WalkingRoutePlanOption().from(stNode).to(enNode));
break;
default:
break;
} } @Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
} @Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
} @Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
}
公交线路规划:
public class BusLineSearchActivity extends Activity {
private MapView mMapView;
private BaiduMap mBaiduMap;
private EditText etKeyword;
private PoiSearch mPoiSearch;
private BusLineSearch mBusLineSearch; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_buslinesearch);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap(); etKeyword = (EditText) findViewById(R.id.et_keyword);
// 创建POI检索实例
mPoiSearch = PoiSearch.newInstance();
//创建buslineserarch的实例
mBusLineSearch = BusLineSearch.newInstance(); //设置监听
mBusLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() {
@Override
public void onGetBusLineResult(BusLineResult busLineResult) {
//展示公交线路信息
BusLineOverlay busLineOverlay = new BusLineOverlay(mBaiduMap);
busLineOverlay.setData(busLineResult);
busLineOverlay.addToMap();
busLineOverlay.zoomToSpan();
}
}); mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
//获得公交信息的poi检索结果
if (poiResult == null || poiResult.error != SearchResult.ERRORNO.NO_ERROR) {
return;
}
//只展示第一条公交信息
PoiInfo poiInfo = poiResult.getAllPoi().get(0); //重新请求
//如下代码为发起检索代码,定义监听者和设置监听器的方法与POI中的类似
mBusLineSearch.searchBusLine((new BusLineSearchOption()
.city("北京")
.uid(poiInfo.uid)));
} @Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { } @Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { }
});
} public void onStartSearch(View view){
String keyword = etKeyword.getText().toString().trim();
if (TextUtils.isEmpty(keyword)){
return;
}
mPoiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword(keyword)); } @Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
}
百度地图开发之poi检索,线路规划的更多相关文章
- 百度地图开发之POI数据检索
前面学习百度地图的一些基本的用法,这次我们一起来看一看百度地图的检索功能吧 poi检索api的基本用法 百度地图的POI类中共有如下几个方法 PoiBoundSearchOption POI范围内检索 ...
- 顾维灏谈百度地图数据采集:POI自动处理率达90%
顾维灏谈百度地图数据采集:POI自动处理率达90% 发布时间:2015-12-21 22:37 来源:cnsoftnews.com 作者: 百度地图还创新研发高精地 ...
- Android应用中使用百度地图API之POI(三)
先看执行后的图吧: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFqaWFuamll/font/5a6L5L2T/fontsize/400/fill/ ...
- Android百度地图开发(四)线路搜索
一.标注驾车线路搜索 1.首先需要定义一个起点和一个终点 // 定义一个起始点和终点 private MKPlanNode start; private MKPlanNode end; 2.实例化地图 ...
- 零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(代码篇)
好,现在进入高阶代码篇. 目的: 爬取昆明市中学的兴趣点POI. 关键词:中学 已有ak:9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO 昆明市坐标范围: 左下角:24.390894 ...
- 将百度地图Demo抽取出来安到自己的程序中
今日所学: 使用百度地图ADK实现手机定位 [Android]使用百度.高德.腾讯地图SDK获取定位数据与屏幕截图分享到QQ_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 代码获取SHA1 (2 ...
- 从POI到O2O 看百度地图如何走出未来之路
近期O2O的烧钱融资大战如火如荼,有人已经把O2O大战,用乌合之众的群体心理失控来形容.其实厂商都不傻,O2O烧钱大家都知道,但是大家还知道O2O背后这块大蛋糕价值"万亿级". 有 ...
- iOS开发---集成百度地图完善版
一.成为百度的开发者.创建应用 http://developer.baidu.com/map/index.php?title=首页 (鼠标移向 然后选择你的项目需要的功能 你可以在里面了解到你想要使用 ...
- 地图调起URI API(通过连接直接调用百度地图)
网站:http://lbsyun.baidu.com/index.php?title=uri/api/web 地图调起URI API 百度地图URI API是为开发者提供直接调起百度地图产品(百度We ...
随机推荐
- POJ 3298 Antimonotonicity (思维)
题目链接:http://poj.org/problem?id=3298 找一个最长不要求连续的子序列,如a1 > a3 < a6 > a7 ... 举个例子模拟一下差不多明白了,a[ ...
- PetaPoco 笔记
PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项--单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...
- SQL语句 & 查询表结构
[group by] 对结果集进行分组,常与汇总函数一起使用. SELECT column,SUM(column) FROM table GROUP BY column HAVING 通常与 GROU ...
- AP(应付帐管理)
--更新供应商地点 PROCEDURE update_vendor_site(p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false, x_return ...
- 【flash】关于flash的制作透明gif的一个小技巧
关于flash的制作透明gif的一个小技巧 或者说是一个需要注意的地方 1.导出影片|gif,得到的肯定是不透明的.2.想要透明背景,必须通过发布.3.flash中想要发布gif动画的话,不能有文字, ...
- Linux device tree 简要笔记
第一.DTS简介 在嵌入式设备上,可能有不同的主板---它们之间差异表现在主板资源不尽相同,比如I2C.SPI.GPIO等接口定义有差别,或者是Timer不同,等等.于是这就产生了BSP的一个 ...
- JavaWeb-10(会话技术之session&JSP)
JavaWeb-会话技术之session&JSP 会话管理之Session技术 一.Session 在WEB开发中,server能够为每一个用户浏览器创建一个会话对象(session对象),注 ...
- Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05- ...
- wp8 在OnBackKeyPress事件中调用MessageBox.Show()崩溃
今天写代码的时候遇到一个问题,在wp8中执行下面的代码后,弹出对话框后,停滞一段时间程序退出. protected override void OnBackKeyPress(CancelEventAr ...
- jquery的匿名函数研究
jQuery片段: ? 1 2 3 ( function (){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在 ...