本文实例讲解android百度地图定位后获取周边位置的实现代码,分享给大家供大家参考,具体内容如下
效果图:
具体代码:
1.布局文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
<?xml version= "1.0" encoding= "utf-8" ?>
<linearlayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:orientation= "vertical"
android:layout_width= "match_parent"
android:layout_height= "match_parent" >
<relativelayout
android:layout_width= "match_parent"
android:layout_height= "@dimen/height_top_bar"
android:background= "@color/common_top_bar_dark"
android:gravity= "center_vertical" >
<button
android:id= "@+id/btn_location_back"
android:layout_width= "wrap_content"
android:layout_height= "match_parent"
android:drawableleft= "@drawable/back"
android:text= "@string/top_back"
style= "@style/btn_title_bar"
android:layout_alignparentleft= "true"
android:onclick= "back"
/>
<textview
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:layout_centerinparent= "true"
android:text= "@string/location_message"
style= "@style/txt_titlebar_message" />
<button
android:id= "@+id/btn_location_ok"
android:layout_width= "52dp"
android:layout_height= "match_parent"
android:layout_alignparentright= "true"
android:background= "@drawable/common_tab_bg"
android:text= "@string/txt_queding"
style= "@style/btn_title_bar" />
</relativelayout>
<com.baidu.mapapi.map.mapview
android:layout_weight= "2"
android:id= "@+id/mapview_location"
android:layout_width= "fill_parent"
android:layout_height= "match_parent"
android:clickable= "true" />
<listview
android:layout_weight= "3"
android:id= "@+id/lv_location_nearby"
android:layout_width= "match_parent"
android:layout_height= "match_parent" />
</linearlayout>
|
布局文件就是上面是一个百度地图的mapview,下面是一个显示周边位置的listview,很简单。
1、自动定位
我们先看一下根据自己的地理位置实现定位
1.首先初始化要用到的组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/**
* 初始化组件
*/
private void initview() {
btnlocationback = (button) findviewbyid(r.id.btn_location_back);
btnlocationback.setonclicklistener( this );
btnlocationok = (button) findviewbyid(r.id.btn_location_ok);
btnlocationok.setonclicklistener( this );
mapviewlocation = (mapview) findviewbyid(r.id.mapview_location);
lvlocnear = (listview) findviewbyid(r.id.lv_location_nearby);
nearlist = new arraylist<poiinfo>();
adapter = new locnearaddressadapter(context, nearlist, isselected);
lvlocnear.setadapter(adapter);
}
|
2.初始化locationclient类,该类需要在主线程中声明
1
2
3
4
5
6
7
|
public locationclient mlocationclient = null ;
public bdlocationlistener mylistener = new mylocationlistener();
public void oncreate() {
mlocationclient = new locationclient(getapplicationcontext()); //声明locationclient类
mlocationclient.registerlocationlistener( mylistener ); //注册监听函数
}
|
3.配置定位sdk参数
设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开gps,是否返回地址信息、位置语义化信息、poi信息等等。
locationclientoption类,该类用来设置定位sdk的定位方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
private void initlocation(){
locationclientoption option = new locationclientoption();
option.setlocationmode(locationmode.hight_accuracy
); //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setcoortype( "bd09ll" ); //可选,默认gcj02,设置返回的定位结果坐标系
int span= 1000 ;
option.setscanspan(span); //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setisneedaddress( true ); //可选,设置是否需要地址信息,默认不需要
option.setopengps( true ); //可选,默认false,设置是否使用gps
option.setlocationnotify( true ); //可选,默认false,设置是否当gps有效时按照1s1次频率输出gps结果
option.setisneedlocationdescribe( true ); //可选,默认false,设置是否需要位置语义化结果,可以在bdlocation.getlocationdescribe里得到,结果类似于“在北京*附近”
option.setisneedlocationpoilist( true ); //可选,默认false,设置是否需要poi结果,可以在bdlocation.getpoilist里得到
option.setignorekillprocess( false ); //可选,默认false,定位sdk内部是一个service,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
option.setignorecacheexception( false ); //可选,默认false,设置是否收集crash信息,默认收集
option.setenablesimulategps( false ); //可选,默认false,设置是否需要过滤gps仿真结果,默认需要
mlocationclient.setlocoption(option);
}
|
4.实现bdlocationlistener接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
/**
* 监听函数,有新位置的时候,格式化成字符串,输出到屏幕中
*/
public class mylocationlistenner implements bdlocationlistener {
@override
public void onreceivelocation(bdlocation location) {
if (location == null ) {
return ;
}
log.d( "map" , "on location change received:" + location);
log.d( "map" , "addr:" + location.getaddrstr());
if (progressdialog != null ) {
progressdialog.dismiss();
}
if (lastlocation != null ) {
if (lastlocation.getlatitude() == location.getlatitude() && lastlocation.getlongitude() == location.getlongitude()) {
log.d( "map" , "same location, skip refresh" );
// mmapview.refresh(); //need this refresh?
return ;
}
}
lastlocation = location;
mbaidumap.clear();
mcurrentlantitude = lastlocation.getlatitude();
mcurrentlongitude = lastlocation.getlongitude();
log.e( ">>>>>>>" , mcurrentlantitude + "," + mcurrentlongitude);
latlng lla = new latlng(lastlocation.getlatitude(), lastlocation.getlongitude());
coordinateconverter converter = new coordinateconverter();
converter.coord(lla);
converter.from(coordinateconverter.coordtype.common);
latlng convertlatlng = converter.convert();
overlayoptions ooa = new markeroptions().position(convertlatlng).icon(bitmapdescriptorfactory
.fromresource(r.drawable.icon_marka))
.zindex( 4 ).draggable( true );
mcurrentmarker = (marker) mbaidumap.addoverlay(ooa);
mapstatusupdate u = mapstatusupdatefactory.newlatlngzoom(convertlatlng, 16 .0f);
mbaidumap.animatemapstatus(u);
new thread( new runnable() {
@override
public void run() {
searchneayby();
}
}).start();
}
public void onreceivepoi(bdlocation poilocation) {
if (poilocation == null ) {
return ;
}
}
}
|
这里接受到的bdlocation中包含好多参数,相信总有一个对你有用的。
2、根据经纬度定位
这种方法不需要自动定位,就是根据经纬度来显示地图上的位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/*
* 显示经纬度的位置
* */
private void showmap( double latitude, double longtitude, string address) {
// sendbutton.setvisibility(view.gone);
latlng lla = new latlng(latitude, longtitude);
coordinateconverter converter = new coordinateconverter();
converter.coord(lla);
converter.from(coordinateconverter.coordtype.common);
latlng convertlatlng = converter.convert();
overlayoptions ooa = new markeroptions().position(convertlatlng).icon(bitmapdescriptorfactory.fromresource(r.drawable.icon_marka))
.zindex( 4 ).draggable( true );
markera = (marker) (mbaidumap.addoverlay(ooa));
u = mapstatusupdatefactory.newlatlngzoom(convertlatlng, 16 .0f);
mbaidumap.animatemapstatus(u);
new thread( new runnable() {
@override
public void run() {
searchneayby();
}
}).start();
}
|
3、获取周边地理位置
最后看一下怎么获取周边的地理位置,这里需要用到sdk中的一个类poinearbysearchoption,我们可以看一下类参考:
- poinearbysearchoption keyword(java.lang.string key)
- 检索关键字
- poinearbysearchoption location(latlng location)
- 检索位置
- poinearbysearchoption pagecapacity(int pagecapacity)
- 设置每页容量,默认为每页10条
- poinearbysearchoption pagenum(int pagenum)
- 分页编号
- poinearbysearchoption radius(int radius)
- 设置检索的半径范围
- poinearbysearchoption sorttype(poisorttype sorttype)
- 搜索结果排序规则,可选,默认
这里是它的一些方法,我们可以看到我们只需要设置一下关键字、周边位置半径、检索位置、排序规则、分页号、每页数量等。然后我们实现ongetpoisearchresultlistener这个接口,获取周边地理位置结果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
/**
* 搜索周边地理位置
*/
private void searchneayby() {
poinearbysearchoption option = new poinearbysearchoption();
option.keyword( "写字楼" );
option.sorttype(poisorttype.distance_from_near_to_far);
option.location( new latlng(mcurrentlantitude, mcurrentlongitude));
if (radius != 0 ) {
option.radius(radius);
} else {
option.radius( 1000 );
}
option.pagecapacity( 20 );
mpoisearch.searchnearby(option);
}
/*
* 接受周边地理位置结果
* @param poiresult
*/
@override
public void ongetpoiresult(poiresult poiresult) {
if (poiresult != null ) {
if (poiresult.getallpoi()!= null &&poiresult.getallpoi().size()> 0 ){
nearlist.addall(poiresult.getallpoi());
if (nearlist != null && nearlist.size() > 0 ) {
for ( int i = 0 ; i < nearlist.size(); i++) {
isselected.put(i, false );
}
}
message msg = new message();
msg.what = 0 ;
handler.sendmessage(msg);
}
}
}
|
获取完数据之后更新适配器显示周边位置就ok了,最后再实现一个小小的功能,就是点击列表中的每个位置,显示位置的小图标根据位置的改变而改变
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/**
* 周边地理位置列表点击事件
*/
lvlocnear.setonitemclicklistener( new adapterview.onitemclicklistener() {
@override
public void onitemclick(adapterview<?> adapterview, view view, int i, long l) {
adapter.setselected(i);
adapter.notifydatasetchanged();
poiinfo ad = (poiinfo) adapter.getitem(i);
u = mapstatusupdatefactory.newlatlng(ad.location);
mbaidumap.animatemapstatus(u);
if (!isloc) {
mcurrentmarker.setposition(ad.location);
} else {
markera.setposition(ad.location);
}
}
});
|
好了,很简单有用的一个小功能,会给用户带来很好的体验效果。
希望大家会喜欢这篇文章。