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

Android百度地图

2016-02-04 14:43 621 查看

配置

下载jar包并导入到程序中

进入http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download进行相关下载,然后

导入到程序中

下载下来之后解压为



复制jar文件到程序中的libs文件夹中

在AD的project模式下 app-> src ->main 下新建jniLibs文件夹,然后将上图中的五个带so文件的文件夹复制到jniLibs下。(这个so库貌似是用c写的,主要用来适配不同环境的吧)

然后在 studio的project structure下将jar包导入到程序中



如图,点击File dependency将libs文件夹下的jar包导入到程序中。

获取key

key需要SHA1和包名来确定,包名及使用地图开发的程序的包名,在manifest中很容易找得到,接下来就简单介绍下如何获取SHA1

打开cmd命令窗口 输入 cd .android 然后回车 然后输入 keytool -list -v -keystore debug.keystore,回车



然后输入android 作为秘钥库口令,点击回车即可得到SHA1的值



然后在获取秘钥页面中创建应用,http://lbsyun.baidu.com/apiconsole/key/create



填写应用名称并勾选应用类型为Android SDK,将刚刚申请得到的SHA1值填写,然后将自己的包名填写完整之后,点击提交即可获得自己的key。

Manifest中的配置

权限配置 (这里需要注意的是权限在application外配置的)

<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>


秘钥配置 (这个是跟activity平级的,在application中配置)

<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="K1SMCq8rqGTnOGpv2xb123456" />       //key:开发者申请的key


服务配置 (同样,这个也是在application中配置的)

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>


显示地图及定位当前位置

添加地图控件

<com.baidu.mapapi.map.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>


在地图activity中声明即可显示地图

mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
mLocationClient.registerLocationListener(myListener);    //注册监听函数

ImageView imageViewPosition = (ImageView) findViewById(R.id.image_position);
imageViewPosition.setOnClickListener(this);//地图右下角的定位当前位置按钮

mapView = (MapView) findViewById(R.id.mapView);
//必须按照3 2 1 的顺序,否则会报错
mapView.removeViewAt(3);//比例尺
mapView.removeViewAt(2);//放大缩小按钮
mapView.removeViewAt(1);//百度地图图标


这样运行即可看到地图,默认显示的是北京市的地图

定位当前位置

首先要初始化地图

private void initLocation() {
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.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);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
mLocationClient.setLocOption(option);
}


然后需要一个监听器来继承LocationListener

class MyLocationListener implements BDLocationListener {

@Override
public void onReceiveLocation(BDLocation bdLocation) {
LatLng point = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
city = bdLocation.getCity();
localAddress = bdLocation.getAddrStr();
//设置地图显示的精度中心点等
MapStatus mMapStatus = new MapStatus.Builder().target(point).zoom(17).build();
//定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
//改变地图状态
baiduMap.setMapStatus(mMapStatusUpdate);
baiduMap.addOverlay(new MarkerOptions().position(point).icon(BitmapDescriptorFactory.fromResource(R.mipmap.current_location)));
mLocationClient.stop();
}
}


最后在onCreat方法中或者按钮的点击事件中,启动定位

initLocation();
mLocationClient.start();//开始定位当前位置


详情参考 http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/v5-0

搜索功能

百度地图的搜索主要为poi搜索,即兴趣点搜索,主要分为城市内搜索,周边搜索,范围搜索

/**
* 城市内搜索
*/
private void citySearch(int page) {
// 设置检索参数
PoiCitySearchOption citySearchOption = new PoiCitySearchOption();
citySearchOption.city(editCityEt.getText().toString());// 城市
citySearchOption.keyword(editSearchKeyEt.getText().toString());// 关键字
citySearchOption.pageCapacity(15);// 默认每页10条
citySearchOption.pageNum(page);// 分页编号
// 发起检索请求
poiSearch.searchInCity(citySearchOption);
}

/**
* 范围检索
*/
private void boundSearch(int page) {
PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption();
LatLng southwest = new LatLng(latitude - 0.01, longitude - 0.012);// 西南
LatLng northeast = new LatLng(latitude + 0.01, longitude + 0.012);// 东北
LatLngBounds bounds = new LatLngBounds.Builder().include(southwest)
.include(northeast).build();// 得到一个地理范围对象
boundSearchOption.bound(bounds);// 设置poi检索范围
boundSearchOption.keyword(editSearchKeyEt.getText().toString());// 检索关键字
boundSearchOption.pageNum(page);
poiSearch.searchInBound(boundSearchOption);// 发起poi范围检索请求
}

/**
* 附近检索
*/
private void nearbySearch(int page) {
PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();
nearbySearchOption.location(new LatLng(latitude, longitude));
nearbySearchOption.keyword(editSearchKeyEt.getText().toString());
nearbySearchOption.radius(1000);// 检索半径,单位是米
nearbySearchOption.pageNum(page);
poiSearch.searchNearby(nearbySearchOption);// 发起附近检索请求
}


详情参考 /article/1368176.html

可根据需要选择合适的搜索方式

发起搜索请求之后肯定还是需要一个监听器来监听返回结果的

mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(BaiduMapTest.this, "抱歉,未能找到结果", Toast.LENGTH_LONG).show();
return;
}
//baiduMap.clear();
//找到位置后添加个图标,但是要把之前地图上的该图标清除掉,如果用上边那句的话会把当前位置的图标也清除掉
baiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation()).icon(BitmapDescriptorFactory.fromResource(R.mipmap.position_selected)));
baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult.getLocation()));//设置地图中心为该点
}

@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
Log.e("reverse", reverseGeoCodeResult.toString());
if (reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(BaiduMapTest.this, "抱歉,未能找到结果", Toast.LENGTH_LONG).show();
return;
}
//加上覆盖物
baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(reverseGeoCodeResult.getLocation()));
//定位
//搜索该点附近的所有地方
mapSearch.searchAllNear(reverseGeoCodeResult.getAddress(), target);
mDatas.clear();
}
});


这个监听器中包含有两个方法,一个是地理编译后的结果,一个监听的是反地理编码的结果监听,说到这,普及一下地理编码和反编码

地理编码指的是将地址信息建立空间坐标关系的过程。有可分为正向地图编码和反向地图编码。

正向地理编码指的是由地址信息转换为坐标点的过程

反向地理编码服务实现了将地球表面的地址坐标转换为标准地址的过程。

补充

一:获取地图中心点的经纬度的方法:

target = baiduMap.getMapStatus().target;//中心点的经纬度

二:地图移动动画

baiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult.getLocation()));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: