博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android应用中使用百度地图API之POI(三)
阅读量:5812 次
发布时间:2019-06-18

本文共 16541 字,大约阅读时间需要 55 分钟。

先看执行后的图吧:

POI(Point of Interest)。中文能够翻译为“兴趣点”。在地理信息系统中。一个POI能够是一栋房子、一个商铺、一个邮筒、一个公交站等  具体:

主要应用 MKSearch 类:

com.baidu.mapapi.search

类 MKSearch

  • java.lang.Object
  • com.baidu.mapapi.search.MKSearch

  • public class MKSearchextends java.lang.Object
    搜索服务.

    用于位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索

    • 字段概要

      字段
       
      限定符和类型 字段和说明
      static int
      公交检索策略常量:不含地铁
      static int
      公交检索策略常量:时间优先
      static int
      公交检索策略常量:最少换乘
      static int
      公交检索策略常量:最少步行距离
      static int
      驾车策略: 躲避拥堵
      static int
      驾乘检索策略常量:最短距离
      static int
      驾乘检索策略常量:较少费用
      static int
      驾乘检索策略常量:时间优先
      static int
      poi具体信息检索页面
      static int
      多keyword范围搜索、周边搜索poi列表
      static int
      范围搜索、周边搜索poi列表
      static int
      城市列表
      static int
      城市内搜索poi列表

方法概要

方法
 
限定符和类型 方法和说明
int (java.lang.String city, java.lang.String busLineUid)
公交路线具体信息搜索 异步函数。返回结果在MKSearchListener里的onGetBusDetailResult方法通知
void ()
销毁MKSearch 模块 , 当不再使用Search 功能时。须要调用此函数
int (java.lang.String startCity,  start, java.lang.String endCity,  end)
驾乘路线搜索.
int (java.lang.String startCity,  start, java.lang.String endCity,  end, java.util.List<> wpNodes)
驾车路线搜索,可设置途经点 异步函数。返回结果在MKSearchListener里的onGetDrivingRouteResult方法通知
int (java.lang.String strAddr, java.lang.String city)
依据地址名获取地址信息 异步函数,返回结果在MKSearchListener里的onGetAddrResult方法通知
int ()
返回每页容量
int (int num)
获取指定页的的poi结果.
boolean ( bmapMan,  listener)
初使化,使用完毕后。请调用 destroy 函数释放资源
int (java.lang.String uid)
poi具体信息检索
boolean (java.lang.String poiUid)
获取POI信息共享短url.
boolean ( location, java.lang.String name, java.lang.String address)
获取地址信息共享短URL.
int (java.lang.String key,  ptLB,  ptRT)
依据范围和检索词发起范围检索.
int (java.lang.String city, java.lang.String key)
城市poi检索.
int (java.lang.String key,  pt, int radius)
依据中心点、半径与检索词发起周边检索.
int ( pt)
依据地理坐标点获取地址信息 异步函数,返回结果在MKSearchListener里的onGetAddrResult方法通知
int (int policy)
设置驾车路线规划策略.
void (int num)
设置每页容量.
int (int policy)
设置路线规划策略.
int (java.lang.String key, java.lang.String city)
联想词检索,依据模糊的不完备的检索词返回精确的建议搜索词 异步函数,返回结果在MKSearchListener里的onGetSuggestionResult方法通知
int (java.lang.String city,  start,  end)
公交路线搜索.
int (java.lang.String startCity,  start, java.lang.String endCity,  end)
步行路线搜索.

通过上面的阅读应该有所了解了吧,直接代码了。

这里的代码和前面()的代码变化不大:

MainActivity.java

package com.majianjie.baidumap;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.graphics.Bitmap;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.MeasureSpec;import android.view.Window;import android.widget.AdapterView;import android.widget.AdapterView.OnItemSelectedListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.Spinner;import android.widget.TextView;import android.widget.Toast;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.MKGeneralListener;import com.baidu.mapapi.map.LocationData;import com.baidu.mapapi.map.MKEvent;import com.baidu.mapapi.map.MKMapViewListener;import com.baidu.mapapi.map.MapController;import com.baidu.mapapi.map.MapPoi;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MyLocationOverlay;import com.baidu.mapapi.map.PoiOverlay;import com.baidu.mapapi.map.PopupClickListener;import com.baidu.mapapi.map.PopupOverlay;import com.baidu.mapapi.search.MKAddrInfo;import com.baidu.mapapi.search.MKBusLineResult;import com.baidu.mapapi.search.MKDrivingRouteResult;import com.baidu.mapapi.search.MKPoiInfo;import com.baidu.mapapi.search.MKPoiResult;import com.baidu.mapapi.search.MKSearch;import com.baidu.mapapi.search.MKSearchListener;import com.baidu.mapapi.search.MKShareUrlResult;import com.baidu.mapapi.search.MKSuggestionResult;import com.baidu.mapapi.search.MKTransitRouteResult;import com.baidu.mapapi.search.MKWalkingRouteResult;import com.baidu.platform.comapi.basestruct.GeoPoint;import com.example.baidumap.R;public class MainActivity extends Activity {	//声明控件		private Button request;		private static StringBuilder sb = new StringBuilder();		private int i=1;		private Toast mToast=null;		private BMapManager mBMapManager=null;		private MapView mMapView = null;			//MapView 是地图主控件		private MapController mMapController = null;//用MapController完毕地图控制				private LocationClient mLocClient; 		 public LocationData mLocData = null;		 		private LocationOverlay myLocationOverlay = null;//定位图层		private boolean isRequest = false;//是否手动触发请求定位  	    private boolean isFirstLoc = true;//是否首次定位  	   	    private PopupOverlay mPopupOverlay  = null;//弹出泡泡图层。浏览节点时使用	    private View viewCache=null;	    public BDLocation location = new BDLocation(); 	    	    //POI	    private MKSearch mMKSearch = null;	    private  Spinner detail;	    private List
poi; private ArrayAdapter< String> adapter; private String poiName="";
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //**使用地图sdk前需先初始化BMapManager。这个必须在setContentView()先初始化 mBMapManager = new BMapManager(this); //第一个參数是API key, 第二个參数是经常使用事件监听,用来处理通常的网络错误,授权验证错误等,你也能够不加入这个回调接口 mBMapManager.init("LDtH1sVwr7kygaF0aTqaVwWU", new MKGeneralListener() { //授权错误的时候调用的回调函数 @Override public void onGetPermissionState(int iError) { if (iError == MKEvent.ERROR_PERMISSION_DENIED) { showToast("API KEY错误, 请检查!"); } } //一些网络状态的错误处理回调函数 @Override public void onGetNetworkState(int iError) { if (iError == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText(getApplication(), "您的网络出错啦!", Toast.LENGTH_LONG).show(); } } }); //初始化 init(); //单击事件 click(); } //* 显示Toast消息 private void showToast(String msg){ if(mToast == null){ mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT); }else{ mToast.setText(msg); mToast.setDuration(Toast.LENGTH_SHORT); } mToast.show(); } private void click() { request.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { requestLocation(); } }); } @Override protected void onResume() { //MapView的生命周期与Activity同步。当activity挂起时需调用MapView.onPause() mMapView.onResume(); mBMapManager.start();//又一次启动 mMKSearch.init(mBMapManager, new MySearchListener()); super.onResume(); } @Override protected void onPause() { //MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause() mMapView.onPause(); super.onPause(); } private void init() { //使用自定义的title,注意顺序 setContentView(R.layout.activity_main); //activity的布局 //这里是加入自定义的titlebtn.xml //通过id找到他们 mMapView = (com.baidu.mapapi.map.MapView) findViewById(R.id.bmapView); mMapController=mMapView.getController(); //获取地图控制器 mMapController.enableClick(true); //设置地图是否响应点击事件 request=(Button)findViewById(R.id.request); viewCache = LayoutInflater.from(this).inflate(R.layout.pop_layout, null); mPopupOverlay= new PopupOverlay(mMapView, new PopupClickListener() {// * 点击弹出窗体图层回调的方法 @Override public void onClickedPopup(int arg0) { //隐藏弹出窗体图层 mPopupOverlay.hidePop(); } }); mMapController.enableClick(true); //* 设置地图是否响应点击事件 . mMapController.setZoom(12); // * 设置地图缩放级别 mMapView.setBuiltInZoomControls(true); // * 显示内置缩放控件 mMapView.setTraffic(true); //poi mMKSearch = new MKSearch(); detail=(Spinner)findViewById(R.id.detail); poi = new ArrayList
(); poi.add("请选择"); poi.add("ATM"); poi.add("旅馆"); poi.add("餐厅"); poi.add("公园"); poi.add("药店"); poi.add("图书馆"); poi.add("景点"); poi.add("医院"); poi.add("KFC"); poi.add("学校"); poi.add("超市");
adapter=new ArrayAdapter
(this, android.R.layout.simple_spinner_item,poi); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); detail.setAdapter(adapter); detail.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView
parent, View v,int position, long id) { poiName=(parent.getSelectedItem().toString()); if(poiName.equals("请选择")){} else{ mMKSearch.init(mBMapManager, new MySearchListener());//注意,MKSearchListener仅仅支持一个。以最后一次设置为准 mMKSearch.poiSearchNearBy(poiName, new GeoPoint((int) (39.907004 * 1E6), (int) (119.54048 * 1E6)), 5000); } } @Override public void onNothingSelected(AdapterView

> arg0) {} }); mLocData = new LocationData(); mLocClient = new LocationClient(getApplicationContext()); // 定位SDK的核心类 //实例化定位服务。LocationClient类必须在主线程中声明 mLocClient.registerLocationListener(new BDLocationListenerImpl());//注冊定位监听接口 /** * 设置定位參数 */ LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); //打开GPRS option.setAddrType("all");//返回的定位结果包括地址信息 option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02 option.setScanSpan(5000); //设置发起定位请求的间隔时间为5000ms option.disableCache(false);//禁止启用缓存定位 //option.setPoiNumber(5); //最多返回POI个数 //option.setPoiDistance(1000); //poi查询距离 //option.setPoiExtraInfo(true); //是否须要POI的电话和地址等具体信息 mLocClient.setLocOption(option); mLocClient.start(); // 调用此方法開始定位 myLocationOverlay = new LocationOverlay(mMapView);//定位图层初始化 //将定位数据设置到定位图层里 myLocationOverlay.setMarker(getResources().getDrawable(R.drawable.set)); //加入定位图层 mMapView.getOverlays().add(myLocationOverlay); myLocationOverlay.enableCompass(); //更新图层数据运行刷新后生效 mMapView.refresh(); /* //准备要加入的Overlay double mLat1 = 39.910159; double mLon1 = 119.544697; // 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6) GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6)); //准备overlay图像数据,依据实情情况修复 Drawable mark= getResources().getDrawable(R.drawable.set); //用OverlayItem准备Overlay数据 OverlayItem item1 = new OverlayItem(p1,"item1","item1"); //使用setMarker()方法设置overlay图片,假设不设置则使用构建ItemizedOverlay时的默认设置 //创建IteminizedOverlay CustomItemizedOverlay itemOverlay = new CustomItemizedOverlay(mark, mMapView); //将IteminizedOverlay加入到MapView中 mMapView.getOverlays().clear(); mMapView.getOverlays().add(itemOverlay); //如今全部准备工作已准备好,使用下面方法管理overlay. //加入overlay, 当批量加入Overlay时使用addItem(List<OverlayItem>)效率更高 itemOverlay.addItem(item1); //删除overlay . //itemOverlay.removeItem(itemOverlay.getItem(0)); //mMapView.refresh(); //清除overlay // itemOverlay.removeAll(); // mMapView.refresh(); mMapView.refresh(); */ // mMapController.setCenter(p1); mMapView.regMapViewListener(mBMapManager, new MKMapViewListener() { // * 地图移动完毕时会回调此接口 方法 @Override public void onMapMoveFinish() { //showToast("地图移动完毕。"); } //* 地图加载完毕回调此接口方法 @Override public void onMapLoadFinish() { showToast("地图加载完毕!"); } //* 地图完毕带动画的操作(如: animationTo())后。此回调被触发 @Override public void onMapAnimationFinish() { } //当调用过 mMapView.getCurrentMap()后,此回调会被触发 可在此保存截图至存储设备 @Override public void onGetCurrentMap(Bitmap arg0) { } //* 点击地图上被标记的点回调此方法 @Override public void onClickMapPoi(MapPoi arg0) { if (arg0 != null){ showToast(arg0.strText); } } }); } class MySearchListener implements MKSearchListener{ @Override public void onGetAddrResult(MKAddrInfo arg0, int arg1) {} @Override public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {} @Override public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {} @Override public void onGetPoiDetailSearchResult(int arg0, int arg1) {} @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { if (result == null) { return; } // 清除地图上已有的全部覆盖物 mMapView.getOverlays().clear(); // PoiOverlay是baidu map api提供的用于显示POI的Overlay PoiOverlay poioverlay = new PoiOverlay(MainActivity.this, mMapView); // 设置搜索到的POI数据 poioverlay.setData(result.getAllPoi()); // 在地图上显示PoiOverlay(将搜索到的兴趣点标注在地图上) mMapView.getOverlays().add(poioverlay); if(result.getNumPois() > 0) { // 设置当中一个搜索结果所在地理坐标为地图的中心 MKPoiInfo poiInfo = result.getPoi(0); mMapController.setCenter(poiInfo.pt); } // sb.append("共搜索到").append(result.getNumPois()).append("个POI\n"); sb.append("POI信息:").append("\n"); // 遍历当前页返回的POI(默认仅仅返回10个) for (MKPoiInfo poiInfo : result.getAllPoi()) { sb.append(i+" 名称:").append(poiInfo.name).append("\n"); sb.append("地址:").append(poiInfo.address).append("\n"); i++; } // 通过AlertDialog显示当前页搜索到的POI new AlertDialog.Builder(MainActivity.this) .setTitle("搜索到的POI信息") .setMessage(sb.toString()) .setPositiveButton("关闭", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); sb.delete(0,sb.length()); i=1; } }).create().show(); } @Override public void onGetShareUrlResult(MKShareUrlResult arg0, int arg1,int arg2) {} @Override public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {} @Override /** * 公交换乘路线搜索结果 * * @param result 搜索结果 * @param iError 错误号(0表示正确返回) */ public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {} @Override /** * 步行路线搜索结果 * * @param result 搜索结果 * @param iError 错误号(0表示正确返回) */ public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {} } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); CreateMenu(menu); return true; } private void CreateMenu(Menu menu){ MenuItem mnu1 =menu.add(0,0,0,"显示卫星地图"); { mnu1.setAlphabeticShortcut('a');//设置快捷键 //mnu1.serIcon(R.drawable.icon);//设置图片 } MenuItem mnu2 =menu.add(0,1,1,"显示街道地图"); { mnu2.setAlphabeticShortcut('b');//设置快捷键 //mnu1.serIcon(R.drawable.icon);//设置图片 } MenuItem mnu3 =menu.add(0,2,2,"3D地图"); { mnu3.setAlphabeticShortcut('c');//设置快捷键 //mnu1.serIcon(R.drawable.icon);//设置图片 } } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId() == 0){ mMapView.setSatellite(true); //设置显示为卫星地图: mMapView.setTraffic(false); }else if(item.getItemId() == 1){ mMapView.setTraffic(true); //显示街道地图 mMapView.setSatellite(false); }else if(item.getItemId() == 2){ //mMapView.se } return true; } public class BDLocationListenerImpl implements BDLocationListener { // * 接收异步返回的定位结果。參数是BDLocation类型參数 @Override public void onReceiveLocation(BDLocation location) { if (location == null) { return; } MainActivity.this.location = location; mLocData.latitude = location.getLatitude(); mLocData.longitude = location.getLongitude(); //假设不显示定位精度圈,将accuracy赋值为0就可以 mLocData.accuracy = location.getRadius(); mLocData.direction = location.getDerect(); //将定位数据设置到定位图层里 myLocationOverlay.setData(mLocData); //更新图层数据运行刷新后生效 mMapView.refresh(); if(isFirstLoc || isRequest){ //将给定的位置点以动画形式移动至地图中心 mMapController.animateTo(new GeoPoint( (int) (location.getLatitude() * 1e6), (int) (location.getLongitude() * 1e6))); showPopupOverlay(location); //加载时候就弹出 isRequest = false; } isFirstLoc = false; } // 接收异步返回的POI查询结果。參数是BDLocation类型參数 @Override public void onReceivePoi(BDLocation poiLocation) { } } private void requestLocation() { isRequest = true; if(mLocClient != null && mLocClient.isStarted()){ showToast("正在定位......"); mLocClient.requestLocation(); } } //继承MyLocationOverlay重写dispatchTap方法 private class LocationOverlay extends MyLocationOverlay{ public LocationOverlay(MapView arg0) { super(arg0); } // * 在“我的位置”坐标上处理点击事件。 @Override protected boolean dispatchTap() { //点击我的位置显示PopupOverlay showPopupOverlay(location); return super.dispatchTap(); } @Override public void setMarker(Drawable arg0) { super.setMarker(arg0); } } @Override protected void onDestroy() { //MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy() mMapView.destroy(); //退出应用调用BMapManager的destroy()方法 if(mBMapManager != null){ mBMapManager.destroy(); mBMapManager = null; } //退出时销毁定位 if (mLocClient != null){ mLocClient.stop(); } super.onDestroy(); } //* 显示弹出窗体图层PopupOverlay private void showPopupOverlay(BDLocation location){ TextView popText = ((TextView)viewCache.findViewById(R.id.location_tips)); popText.setText("[我的位置]\n" + location.getAddrStr()); mPopupOverlay.showPopup(getBitmapFromView(popText), new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)), 15); } // * 将View转换成Bitmap的方法 public static Bitmap getBitmapFromView(View view) { view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); view.buildDrawingCache(); Bitmap bitmap = view.getDrawingCache(); return bitmap; } }

有关性能的优化,这里不多解说,正在学习中。

。。/呵呵

你可能感兴趣的文章
Webpack入门教程三十
查看>>
EAServer 6.1 .NET Client Support
查看>>
锐捷交换机密码恢复(1)
查看>>
Kali linux virtualbox rc=1908 错误解决办法
查看>>
linux软件包管理之三(源代码安装)
查看>>
数据库三范式是什么?
查看>>
[转载]设置Ubuntu自动连接无线,无须再输入密钥环和无线密码
查看>>
九叔Xen App测试报告
查看>>
Apache配置
查看>>
Ext gridPanel 单元格数据的渲染
查看>>
Android SDK 的下载代理
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
LNMP一键安装
查看>>
SQL Server数据库概述
查看>>
Linux 目录结构及内容详解
查看>>
startx命令--Linux命令应用大词典729个命令解读
查看>>
华为3026c交换机配置tftp备份命令
查看>>
Oracle命令导入dmp文件
查看>>