您的位置:首页 > 移动开发 > Android开发

Android studio 百度地图开发(4)触摸选点、地理编码

2016-04-01 14:37 381 查看
Android studio 百度地图开发(4)触摸选点、地理编码
email:chentravelling@163.com
开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0

百度地图显示:Android studio
百度地图开发(1)配置工程、显示地图

百度地图定位:Android
studio 百度地图开发(2)地图定位

百度地图导航:Android studio 百度地图开发(3)地图导航

一.前言

之前通过百度地图官网的Demo学习了百度地图显示、定位和导航。

(1)百度地图显示,主要是初步学习一下工程配置;

(2)百度地图定位,实现了对客户端的定位,主要目的是了解:

LocationClient类(定位SDK核心类);

LocationClientOption类(定位配置信息类);

BDLocationListener接口(SDK定位监听);

BDLocation类(定位获得的数据信息类)等数据结构,以及它们之间的关系;

(3)百度地图导航,实现了对指定起点和终点的路径规划;

那么,我后续又进行了定位+(触摸选点+地理编码)导航的实现:在地图中长按一个点,通过反地理编码获得该点的经度维度以及地名等信息,点击“去这里”按钮计算客户端点和该点的导航路径。长按一点后,显示该点的信息信息以及“去这里”按钮最好可以使用覆盖物或者infoWindow实现,但是为了先将导航实现,我只是写了一个TextView来实现的,后期再学习覆盖物和infoWindow后再完善。

二.功能实现

以下代码只是一部分,整个工程点击这里下载。

1.触摸选点

/**
* 为百度地图增加长按监听函数
*/
baiduMap.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
/**
* 存储定位点信息
*/
currentPt = latLng;
/**
* 发起反向搜索
*/
reverseSearch(latLng);
}
});


2.正反向地理编码

(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));
}


3.弹出显示信息的窗口;为按钮绑定点击事件

/**
* 弹出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)//开始导航回调监听器,在该监听器里一般是进入导航过程页面
);
}

}
});
}


ok,剩下的就应该是前面导航部分涉及到的东西了。

三.结果





四.工程代码

点击这里前往下载(.java和.xml文件以及所有的jar包和.so文件)。

因为用Android Studio做百度地图应用的资料还不是很多,如果有问题,欢迎大家相互讨论:chentravelling@163.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: