百度地图API 怎样实现根据人生的起点和终点点点击查询能出现路线

1898人阅读
android开发(23)
之前我们讲了怎么在百度地图上设置Marker(如A点。。) 和弹出框(跟随Marker的,Marker移动的时候也是会跟着移动的),接着又觉得百度地图自带的放大缩小不(fei)是(chang)很(de)漂(chou)亮,我们自定义了放大缩小的控件,本篇我们将制作类似百度地图API制作类似百度地图的公交/驾车/行走/查询界面并实现简单的路线规划功能。
先来张截图:
这个界面的实现其实是使用的SlidingUpPanelLayout 开源库从而使得可以跟随手指下拉上划:
其实布局也没什么好讲的,自己到百度地图的APK包里扒拉扒拉图片就都有了,哈哈
&?xml version=&1.0& encoding=&utf-8&?&
&com.jsbtclient.cusViews.SlidingUpPanelLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
xmlns:sothree=&/apk/res-auto&
android:id=&@+id/map_sliding_layout&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:gravity=&bottom&
sothree:umanoPanelHeight=&60dp&
sothree:umanoShadowHeight=&4dp& &
&RelativeLayout
android:layout_width=&match_parent&
android:layout_height=&match_parent& &
&com.baidu.mapapi.map.MapView
android:id=&@+id/map_mapView&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:apiKey=&vNQtC8sQSODsLGBk01HYaBQt&
android:clickable=&true& /&
&FrameLayout
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:layout_alignParentBottom=&true&
android:layout_alignParentLeft=&true& &
&com.jsbtclient.cusViews.ZoomControlView
android:id=&@+id/map_zoomcontrol&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_gravity=&right&
android:layout_marginBottom=&20dp&
android:layout_marginRight=&15dp& &
&/com.jsbtclient.cusViews.ZoomControlView&
&ImageView
android:id=&@+id/map_relocation&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_gravity=&left|top&
android:layout_marginLeft=&15dp&
android:layout_marginTop=&5dp&
android:background=&@drawable/map_relocation_bg&
android:src=&@drawable/baidu_map_relocation& /&
&/FrameLayout&
&/RelativeLayout&
&LinearLayout
android:id=&@+id/map_slidePanel&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical&
android:padding=&10dp& &
&LinearLayout
android:id=&@+id/slidingdrawer_menu&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:orientation=&horizontal&
android:padding=&10dp& &
&ImageView
android:id=&@+id/map_route_bus&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_weight=&1&
android:src=&@drawable/map_route_bus_selector& /&
&ImageView
android:id=&@+id/map_route_car&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_weight=&1&
android:src=&@drawable/map_route_car_selector& /&
&ImageView
android:id=&@+id/map_route_walk&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_weight=&1&
android:src=&@drawable/map_route_walk_selector& /&
android:id=&@+id/map_route_search&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_gravity=&center_vertical&
android:layout_weight=&1&
android:text=&@string/map_route_search&
android:textColor=&@color/call_fragment_bg_color&
android:textSize=&16sp& /&
&/LinearLayout&
android:layout_width=&match_parent&
android:layout_height=&0.1dp&
android:background=&@color/lightgray& /&
&LinearLayout
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:background=&@drawable/white_shadow_bg&
android:orientation=&horizontal&
android:padding=&10dp& &
&LinearLayout
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_weight=&1&
android:layout_gravity=&center_vertical&
android:orientation=&vertical&&
&ImageView
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:layout_gravity=&center_vertical&
android:src=&@drawable/map_route_start& /&
&ImageView
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:layout_gravity=&center_vertical&
android:src=&@drawable/map_route_end& /&
&/LinearLayout&
&LinearLayout
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_weight=&8&
android:orientation=&vertical&
android:padding=&10dp& &
android:id=&@+id/map_my_address&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:layout_gravity=&center_vertical&
android:background=&@null&
android:text=&@string/map_my_address&
android:textColor=&@color/lightgrey&
android:textSize=&16sp& /&
android:layout_width=&match_parent&
android:layout_height=&0.1dp&
android:layout_marginBottom=&20dp&
android:layout_marginTop=&20dp&
android:background=&@color/lightgray& /&
android:id=&@+id/map_target_address&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:layout_gravity=&center_vertical&
android:background=&@null&
android:text=&@string/map_company_address&
android:textColor=&@color/call_fragment_bg_color&
android:textSize=&16sp& /&
&/LinearLayout&
&ImageView
android:id=&@+id/map_route_exchange&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_gravity=&center_vertical&
android:layout_weight=&1&
android:src=&@drawable/route_exchange& /&
&/LinearLayout&
&/LinearLayout&
&/com.jsbtclient.cusViews.SlidingUpPanelLayout&
UI上的事就不重点说了,功能实现才是重点:
我们来理一下思路用户当前的位置是使用百度地图定位获取的,而目标位置则应该是用户自己输入的,我这里的实现比较简单,目的地或者出发地点是固定的就是公司地址,
但是原理是相同的只不过少一次网络请求而已。 现在假设用户目的地是指定地点(已知经纬度),那么我们需要查询的就是用户当前的位置,所以首先要定位用户当前位置。
* 开启定位,回调接口为MyLocationListener类 /接口
private void StartLocation()
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
option.setCoorType(&gcj02&);//返回的定位结果是百度经纬度
option.setScanSpan(1000);//设置发起定位请求的间隔时间为1000ms
option.setIsNeedAddress(true); //是否需要返回地址
mLocationClient.setLocOption(option);
mLocationClient.start();//发起定位请求
接着看回调接口:
* 定位回调监听
public class MyLocationListener implements BDLocationListener {
public void onReceiveLocation(BDLocation location)
//回调返回对象对象里包含多个属性,这里我们只需要经纬度
userLatLng = new LatLng(location.getLatitude(), location.getLongitude());
//这句代码可以忽略,我不知道定位可以拿到具体的地址,所以使用了
详细地址与经纬度转化的接口
//其实location.getAddrStr();就可以拿到地址
if(userLatLng != null){
mGeoCoder.reverseGeoCode(new ReverseGeoCodeOption()
.location(userLatLng));
mLocationClient.stop();
接着看将经纬度转化为具体详细地址的回调接口:
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Host.showToast(R.string.map_result_error);
baiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.baidu_map_marka)));
baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
.getLocation()));
mPosition = result.getAddress().toString();//以上代码忽略,这里的mPosition就是具体的地址
PlanNode stNode = null, enNode =
//声明两个节点,stNote 起始节点, enNode目的地节点
if(!IsExchanged)
//这里的if else 可忽略,是为了实现目标地址与当前地址互换效果而做的
myAddress.setText(mPosition);
stNode = PlanNode.withLocation(userLatLng);//将经纬度对象传入
enNode = PlanNode.withLocation(latLng);
targetAddress.setText(mPosition);
enNode = PlanNode.withLocation(userLatLng);
stNode = PlanNode.withLocation(latLng);
StartRouteSearch(stNode, enNode);
//开始搜索
* 发起路线规划请求,获取路线
* 回调接口为onGetTransitRouteResult/onGetWalkingRouteResult/onGetDrivingRouteResult
* @param stNode
* @param enNode
private void StartRouteSearch(PlanNode stNode, PlanNode enNode) {
baiduMap.clear();
//每次重新搜索都清空地图上的所有标记以及路线
if (searchType == SearchType.BUS) {
mSearch.drivingSearch((new DrivingRoutePlanOption()).from(stNode).to(enNode)); //搜索驾车路线
} else if (searchType == SearchType.CAR) {
mSearch.transitSearch((new TransitRoutePlanOption()).from(stNode).city(&无锡&).to(enNode));//搜索公交路线
} else if (searchType == SearchType.WALK) {
mSearch.walkingSearch((new WalkingRoutePlanOption()).from(stNode).to(enNode));//搜索行走路线
这里的三钟搜索方式对应三个不同的回调接口,分别是:
public void onGetDrivingRouteResult(DrivingRouteResult dRouteResult) {
if (dRouteResult == null || dRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
Host.showToast(R.string.map_result_error);
if (dRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
// result.getSuggestAddrInfo()
if (dRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
// nodeIndex = -1;
route = dRouteResult.getRouteLines().get(0); //获取路线
DrivingRouteOverlay overlay = new DrivingRouteOverlay(baiduMap);
routeOverlay =
baiduMap.setOnMarkerClickListener(overlay);
overlay.setData(dRouteResult.getRouteLines().get(0));//overLay 为在地图上的路径 ,这里为它设置数据
overlay.addToMap();
//添加到地图
overlay.zoomToSpan();
public void onGetWalkingRouteResult(WalkingRouteResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Host.showToast(R.string.map_result_error);
if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
// result.getSuggestAddrInfo()
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
route = result.getRouteLines().get(0);
WalkingRouteOverlay overlay = new WalkingRouteOverlay(baiduMap);
baiduMap.setOnMarkerClickListener(overlay);
routeOverlay =
overlay.setData(result.getRouteLines().get(0));
overlay.addToMap();
overlay.zoomToSpan();
public void onGetTransitRouteResult(TransitRouteResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Host.showToast(R.string.map_result_error);
if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
// result.getSuggestAddrInfo()
if (result.error == SearchResult.ERRORNO.NO_ERROR) { //同上
route = result.getRouteLines().get(0);
TransitRouteOverlay overlay = new TransitRouteOverlay(baiduMap);
baiduMap.setOnMarkerClickListener(overlay);
routeOverlay =
overlay.setData(result.getRouteLines().get(0));
overlay.addToMap();
overlay.zoomToSpan();
这样一个基本的百度地图路径搜索就完成了.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:18398次
排名:千里之外
原创:24篇
(2)(3)(3)(1)(2)(5)(2)(3)(2)(2)求助,高手指点。根据输入的起始点得到路径_百度地图api吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:5,405贴子:
求助,高手指点。根据输入的起始点得到路径收藏
&html&&head&&meta http-equiv="Content-Type" content="text/ charset=utf-8" /&&style type="text/css"&body, html,#allmap {width: 100%;height: 100%;overflow:margin:0;}#l-map{height:100%;width:78%;float:border-right:2px solid #}#r-result{height:100%;width:20%;float:}&/style&&script type="text/javascript" src=""&&/script&&title&IP定位获取当前城市&/title&&/head&&body&&div id="allmap" style="width:500 height:500px"&&/div&&/body&&/html&&script type="text/javascript"&var map = new BMap.Map("allmap");var point = new BMap.Point(116..897445);map.centerAndZoom(point,12);function myFun(result){
var cityName = result.
map.setCenter(cityName);}var myCity = new BMap.LocalCity();myCity.get(myFun);//定位到当前城市function searchluxian(){var startid = document.getElementById('start');var startcontent =start.var endid = document.getElementById('end');var endcontent =end.//driving.search(startcontent,endcontent);var output = "从"+startcontent+"到"+endcontent+"驾车需要";var searchComplete = function (results){
if (transit.getStatus() != BMAP_STATUS_SUCCESS){
var plan = results.getPlan(0);
output += plan.getDuration(true) + "\n";
//获取时间
output += "总路程为:" ;
output += plan.getDistance(true) + "\n";
//获取距离}var transit = new BMap.DrivingRoute(map, {renderOptions: {map: map},
onSearchComplete: searchComplete,
onPolylinesSet: function(){
setTimeout(function(){alert(output)},"1000");
transit.search(startcontent,endcontent);}&/script&起点&input type="text" name="start" id="start" &&br/&终点&input type="text" name="end" id="end" &&br /&&button name="but"
onClick="searchluxian()"
value="提交" &查询路线&/button&以上是代码 我要实现的功能是根据两个输入框输入的起始和终点 获取路程长度和大概用时。但是有输入地名详细到街道号的时候 无法获取结果。只有输入一些地标才能获取到。求指点啊
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或2014年2月 扩充话题大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。百度地图开发-检索功能
百度地图开发-检索功能
百度地图SDK开发
转载请注明作者。
注:本人在找工作,地点在北京。
百度地图SDK开发(三)检索功能
目前百度地图SDK所集成的检索服务包括:POI检索、公交信息查询、线路规划、地理编码、行政区边界数据检索、在线建议查询、短串分享(包括POI搜索结果分享、驾车/公交/骑行/步行路线规划分享、反向地理编码结果分享)。 本文将简单的介绍下POI检索,路线查询,地理编码。
POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。
百度地图SDK提供三种类型的POI检索:周边检索、区域检索和城市内检索。
接下来就是代码时刻,通过不同的代码来展示下三种不同的搜索,其实也就是范围不同,其他的都差不多。还记得上一篇中说过的百度地图中的基本模式吗?创建对象, 创建监听器,设置参数发起请求。在检索的时候也是这个套路。
public void onClick(View v) {
if(TextUtils.isEmpty(ed_constent.getText().toString())){
//创建搜索对象
PoiSearch search= PoiSearch.newInstance();
//创建监听器
search.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
public void onGetPoiResult(PoiResult poiResult) {
//普通检索
if (poiResult == null || poiResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "没有搜索内容", Toast.LENGTH_SHORT).show();
List&PoiInfo& allPoi = poiResult.getAllPoi();
for (PoiInfo info : allPoi) {
MarkerOptions overlay = new MarkerOptions();
overlay.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_locate));
overlay.position(info.location);
Marker marker = (Marker)baiduMap.addOverlay(overlay);
Log.d("tag", "info: " + info.toString());
Bundle bundle = new Bundle();
bundle.putString("arr", info.address);
bundle.putString("phone", info.phoneNum);
bundle.putString("name", info.name);
marker.setExtraInfo(bundle);
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
//深度检索
//设置检索参数,发起检索
PoiNearbySearchOption option=new PoiNearbySearchOption()
.keyword(ed_constent.getText().toString())
.location(mylocation)
.radius(30000);
search.searchNearby(option);
上面的代码完全就是按照之前的逻辑去写的,创建对象,设置监听器,设置参数。发起请求,采用的是附近检索,用到的类分别有 PoiSearch POi检索对象,OnGetPoiSearchResultListener检索的监听对象,根据检索方式的不同采用不用的检索参数对象。
经常用的就是City,Bound,Nearby三种检索方式,其他的我也不熟悉。配置好参数之后就可以发起一次检索,并且发起的形式要与检索参数相对应。之后就可以就监听器中对检索的结果进行处理了。
检索监听器的回调函数有两个,分别是普通回调和深度回调,以普通回调为例,先进行检索结果的判断,之后对结果中的信息进行处理,查出每一个POi的PoiInfo对象,之后我做的就是把info中的一些信息封装到了Marker的bundle对象中,好在之后使用。marker对象的获得是通过baidumap的addoverlay方法的返回值强转获取到的。接下来看看对于查询到的信息的使用。
infoView=View.inflate(this,mation,null);
name=(TextView) infoView.findViewById(R.id.name);
phone=(TextView) infoView.findViewById(R.id.phone);
arr=(TextView) infoView.findViewById(R.id.arr);
baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
public boolean onMarkerClick(Marker marker) {
Log.d("TAG","marker:"+marker);
Bundle info= marker.getExtraInfo();
Log.d("TAG","info:"+info);
Log.d("TAG","name"+name);
name.setText(info.getString("name"));
phone.setText(info.getString("phone"));
arr.setText(info.getString("arr"));
InfoWindow infoWindow=new InfoWindow(infoView,marker.getPosition(),-30);
baiduMap.showInfoWindow(infoWindow);
利用InfoWindow和marker的点击事件,创建一个布局放置三个文本用来显示信息,之后在监听事件中取出之前放在marker对象中的bundle对象,将其中的内容显示在文本中,最后创建一个infowindow显示在地图上。看效果。
布局写的有点Low,各位就将就看吧,不过功能是实现了,对于POI检索就这多,还有就是建议大家以后写的时候别像我上面那样写,很浪费资源的,可以把搜索对象和监听回调都拿出去,在onClick方法中只对检索参数进行设置,发起检索就可以。城市检索和范围检索就是在检索参数上有所不同,其他的都一样,最后别忘了执行search.destroy(),释放资源。
在最新的V3.7.0中支持四种线路分别是,公交,驾车,步行,骑行四种。四种方式的规划模式是一样的,上代码。
public void onClick(View v) {
if(TextUtils.isEmpty(ed_start.getText().toString())|TextUtils.isEmpty(ed_end.getText().toString())){
RoutePlanSearch search=RoutePlanSearch.newInstance();
search.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
//TODO 步行回调
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
//TODO 公交回调
Log.d("TAG","result_biking:"+transitRouteResult.error);
if (transitRouteResult==null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
if (transitRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
//起终点或途经点地址有岐义,通过以下接口获取建议查询信息
//result.getSuggestAddrInfo()
if (transitRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
TransitRouteOverlay overlay = new TransitRouteOverlay(baiduMap);
baiduMap.setOnMarkerClickListener(overlay);
overlay.setData(transitRouteResult.getRouteLines().get(0));
overlay.addToMap();
overlay.zoomToSpan();
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
//TODO 驾车回调
Log.d("TAG","result_biking:"+drivingRouteResult.error);
if (drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
if (drivingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
//起终点或途经点地址有岐义,通过以下接口获取建议查询信息
//result.getSuggestAddrInfo()
if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
DrivingRouteOverlay overlay = new DrivingRouteOverlay(baiduMap);
baiduMap.setOnMarkerClickListener(overlay);
overlay.setData(drivingRouteResult.getRouteLines().get(0));
overlay.addToMap();
overlay.zoomToSpan();
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
Log.d("TAG","result_biking:"+bikingRouteResult.error);
if (bikingRouteResult == null || bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
if (bikingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
//起终点或途经点地址有岐义,通过以下接口获取建议查询信息
//result.getSuggestAddrInfo()
if (bikingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
BikingRouteOverlay overlay = new BikingRouteOverlay(baiduMap);
baiduMap.setOnMarkerClickListener(overlay);
overlay.setData(bikingRouteResult.getRouteLines().get(0));
overlay.addToMap();
overlay.zoomToSpan();
PlanNode start=PlanNode.withCityNameAndPlaceName("北京",ed_start.getText().toString());
PlanNode end=PlanNode.withCityNameAndPlaceName("北京",ed_end.getText().toString());
BikingRoutePlanOption options=new BikingRoutePlanOption()
.from(start)
TransitRoutePlanOption options=new TransitRoutePlanOption()
.from(start)
.city("北京");
search.bikingSearch(options);
search.transitSearch(options);
上面的代码同样也是根据之前说过的模板去写的。创建一个查询对象RoutePlanSearch,设置监听器setOnGetRoutePlanResultListener,设置查询参数BikingRoutePlanOption,发起查询search.bikingSearch(options)。百度地图中都是这么处理的。接下来仔细看下代码。原谅我的懒惰,我都写onClick方法里了。比较值得注意的就是在监听器的回调中有四个方法,分别对应着四种规划。同样的查询方法也有四种。参数的配置也有四种。在回调函数中可能会有人注意到BikingRouteOverlay类似的这种类,对应着骑车覆盖物,驾车覆盖物等,就是在地图上的显示,这些类在百度地图的类参考中是没有的。而且下载下来的SDK中也没有,最开始还以为得自己根据查询回来的路线,之后经过计算用之前说过的基本的覆盖物去写,后来在官方的demo中发现了这个东西。
,有兴趣的可以去下个demo去看看,专门有个overlayUtils包里面放着已经写好的关于路线的覆盖物。真是的。百度地图也不告诉一声。而且官方的类参考也查不到,有点不负责任啊。
上面的代码并不难。如果你已经了解了百度地图的这种创建模式就很好理解了。上效果。(效果里面显示的是骑行的路线)。
关于这个搜索的地址,可以看到我在搜索东单到西单的时候提示地址是无效的,百度对于路线规划的站点是不支持模糊查询的,必须是准确的。
还有一点就是我一共进行了两次搜索,在进行第二次搜索之后之前的搜索路线没有被清除,这点也很好解决。调用这个方法就可以 overlay.removeFromMap();
如果想要更改路线覆盖物的样式,可以直接重写overlay的两个方法,能够设置起点和终点坐标,如果想把路线改了,可以改BikingRouteOverlay中的代码,可以实现各种样式。
公交,驾车,步行的程序类似,就不多介绍了。
地理编码指的是将地址信息建立空间坐标关系的过程。有可分为正向地图编码和反向地图编码。使用的方式也很简单,跟之前的方式也是相同的,创建对象, 设置监听器,设置参数发起请求就可以。上代码。。
//创建百度地图的地理编码查询对象
GeoCoder coder=GeoCoder.newInstance();
//设置监听器
coder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
public void onGetGeoCodeResult(GeoCodeResult result) {
//地理位置查经纬度
Log.d("tag", "error_code: "+result.error);
if(result==null||result.error!= SearchResult.ERRORNO.NO_ERROR){
Toast.makeText(GeocodeActivity.this, "该点在地球上不存在",Toast.LENGTH_SHOR#
#T).show();
LatLng location = result.getLocation();
MarkerOptions overlay=new MarkerOptions();
overlay.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_locate));
overlay.position(location);
baiduMap.addOverlay(overlay);
//移动屏幕中心
MapStatusUpdate msu= MapStatusUpdateFactory.newLatLng(location);
baiduMap.animateMapStatus(msu);
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
//经纬度查地址
GeoCodeOption options=new GeoCodeOption()
.city("北京")
.address(ed_location.getText().toString());
//设置查询参数。发起查询
coder.geocode(options);
//坐标系查地理位置
coder.reverseGeoCode();
可以看到逻辑都是一样的,不同的就是地理编码查询类GeoCoder,看一下官方的文档。
,可以看到就这么几个方法,使用也很容易。
监听器的回调有两个方法,发起请求有两种,参数设置有两个辅助类。就这么多就能实现从地理位置到坐标和坐标到地理位置。
可以看到在效果图中输入地理位置信息就能在地图上标记出来,至于坐标转到地理位置就是调用另一个方法就可以。
关于百度地图的开发就准备写这么多了。不再继续往下写了,因为写一篇博客对于我来说通常需要一天到两天的时间去了解,查资料,自己先写一遍再整理成一篇博客,对于百度地图,通过我的这三篇博客应该就可能够说实现基本的使用了,日常功能完全可以满足,更多的内容我也不怎么会 。那就这样吧。。
注:本人在找工作,地点在北京。
我的热门文章
即使是一小步也想与你分享

我要回帖

更多关于 长征起点和终点 的文章

 

随机推荐