Android studio 百度地图开发(4)触摸选点、地理编码
email:[email protected]
开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0。
之前通过百度地图官网的Demo学习了百度地图显示、定位和导航。
(1)百度地图显示,主要是初步学习一下工程配置;
(2)百度地图定位,实现了对客户端的定位,主要目的是了解:
LocationClient类(定位SDK核心类);
LocationClientOption类(定位配置信息类);
BDLocationListener接口(SDK定位监听);
BDLocation类(定位获得的数据信息类)等数据结构,以及它们之间的关系;
(3)百度地图导航,实现了对指定起点和终点的路径规划;
那么,我后续又进行了定位+(触摸选点+地理编码)导航的实现:在地图中长按一个点,通过反地理编码获得该点的经度维度以及地名等信息,点击“去这里”按钮计算客户端点和该点的导航路径。长按一点后,显示该点的信息信息以及“去这里”按钮最好可以使用覆盖物或者infoWindow实现,但是为了先将导航实现,我只是写了一个TextView来实现的,后期再学习覆盖物和infoWindow后再完善。
以下代码只是一部分,整个工程点击这里下载。
/** * 为百度地图增加长按监听函数 */ baiduMap.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() { @Override public void onMapLongClick(LatLng latLng) { /** * 存储定位点信息 */ currentPt = latLng; /** * 发起反向搜索 */ reverseSearch(latLng); } });
(1)正向地理编码:将地址信息转换为经纬度坐标;
(2)反向地理编码:将经纬度坐标转换为地址信息;
第一步:声明搜索模块
/** * 搜索模块 */ GeoCoder mSearch = null;第二步:注册监听
<pre name="code" class="java"> /** * 初始化搜索模块,注册事件监听 */ mSearch = GeoCoder.newInstance(); mSearch.setOnGetGeoCodeResultListener(this);
/** * 正向地理编码和反向地理编码 * @param result */ @Override public void onGetGeoCodeResult(GeoCodeResult result) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(BaiDuMapActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG) .show(); return; } baiduMap.clear(); baiduMap.addOverlay(new MarkerOptions().position(result.getLocation()) .icon(BitmapDescriptorFactory .fromResource(R.drawable.icon_marka))); baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result .getLocation())); String strInfo = String.format("纬度:%f 经度:%f", result.getLocation().latitude, result.getLocation().longitude); Toast.makeText(BaiDuMapActivity.this, strInfo, Toast.LENGTH_LONG).show(); } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(BaiDuMapActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG) .show(); return; } baiduMap.clear(); baiduMap.addOverlay( new MarkerOptions() .position(result.getLocation()) //坐标位置 .icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka)) //图标 .title(result.getAddress()) //标题 ); baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result .getLocation())); Toast.makeText(BaiDuMapActivity.this, result.getAddress(), Toast.LENGTH_LONG).show(); /** * 弹出InfoWindow,显示信息 */ poputInfo(result); }
/** * 反向搜索 * @param latLng */ public void reverseSearch(LatLng latLng) { mSearch.reverseGeoCode(new ReverseGeoCodeOption() .location(latLng)); }
/** * 弹出InfoWindow,显示信息 */ public void poputInfo(final ReverseGeoCodeResult result) { /** * 获取弹窗控件 */ popuInfoView = (RelativeLayout) findViewById(R.id.id_marker_info); TextView addrNameView = (TextView)findViewById(R.id.addrName); if(addrNameView!=null) addrNameView.setText(result.getAddress()); popuInfoView.setVisibility(View.VISIBLE); /** * 首先进行授权 */ if(initDirs()) initNavi(); /** * 获取到这去 按钮 */ Button goButton = (Button)findViewById(R.id.goButton); /** * 为到这去按钮绑定点击事件 */ goButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /** * 判断是否已经授权 */ if(!BaiduNaviManager.isNaviInited()) { Toast.makeText(BaiDuMapActivity.this, "授权失败咯", Toast.LENGTH_SHORT).show(); return; } /** * 获取该点的坐标位置 */ LatLng ll = new LatLng(result.getLocation().latitude,result.getLocation().longitude); BNRoutePlanNode sNode = null; BNRoutePlanNode eNode = null; Toast.makeText(BaiDuMapActivity.this, "开始获取起点和终点", Toast.LENGTH_SHORT).show(); sNode = new BNRoutePlanNode( currentLoction.getLongitude(), //经度 currentLoction.getLatitude(), //纬度 currentLoction.getBuildingName(), //算路节点名 null, //算路节点地址描述 BNRoutePlanNode.CoordinateType.BD09LL ); //坐标类型 eNode = new BNRoutePlanNode( result.getLocation().longitude, result.getLocation().latitude, result.getAddress(), null, BNRoutePlanNode.CoordinateType.BD09LL); if (sNode != null && eNode != null) { List<BNRoutePlanNode> list = new ArrayList<BNRoutePlanNode>(); list.add(sNode); list.add(eNode); /** * 发起算路操作并在算路成功后通过回调监听器进入导航过程,返回是否执行成功 */ BaiduNaviManager .getInstance() .launchNavigator( BaiDuMapActivity.this, //建议是应用的主Activity list, //传入的算路节点,顺序是起点、途经点、终点,其中途经点最多三个 1, //算路偏好 1:推荐 8:少收费 2:高速优先 4:少走高速 16:躲避拥堵 true, //true表示真实GPS导航,false表示模拟导航 new DemoRoutePlanListener(sNode)//开始导航回调监听器,在该监听器里一般是进入导航过程页面 ); } } }); }
点击这里前往下载(.java和.xml文件以及所有的jar包和.so文件)。
因为用Android Studio做百度地图应用的资料还不是很多,如果有问题,欢迎大家相互讨论:[email protected]