基于百度地图SDK集成的一些功能
来源:互联网 发布:云计算设备公司 编辑:程序博客网 时间:2024/05/07 08:01
最近开发的项目用到了地图,并在地图上显示某些坐标位置的标记图标,点击图标来显示此坐标处的一些信息,之后我从百度地图卡房平台下载了百度地图的SDK和Demo,并结合API总结了一下几点内容,实现了下面的几个功能:
(1)最基本功能,定位到当前位置 并获取当前的位置信息
(2)实现了打开地图显示自定义坐标点位置
(3)实现了为地图上的某个坐标点添加一个Marker图标
(4)在地图上标注多个覆盖点 并且有点击事件,点击每个点显示某点的自定义信息
(5)实现了在地图上画几何图形覆盖在一定的坐标区域内
下面我们来看下具体怎么集成实现的:
一 、首先在百度开放平台下载jar包和.so文件放到工程项目里面
二 、在AndroidManifest.xml里添加权限
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <!-- 这个权限用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 用于读取手机当前的状态 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 访问网络,网络定位需要上网 --> <uses-permission android:name="android.permission.INTERNE" />//设置KEY<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="yplInAzbWE0uOBMxfSenlA9YXsjBZdfM" />
三 、定义一个Application类
public class TestApplication extends Application { @Override public void onCreate() { super.onCreate(); // 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext SDKInitializer.initialize(this); //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型. //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。 SDKInitializer.setCoordType(CoordType.GCJ02); }}
四 、MainActivit类实现具体功能
package com.junto.baidumaptest;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.mapapi.CoordType;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapStatus;import com.baidu.mapapi.map.MapStatusUpdate;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.Marker;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.MyLocationConfiguration;import com.baidu.mapapi.map.MyLocationData;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.map.PolygonOptions;import com.baidu.mapapi.map.Stroke;import com.baidu.mapapi.model.LatLng;import java.util.ArrayList;import java.util.List;public class MainActivity extends Activity { private MapView mapView; private BaiduMap mBaiduMap; // 定位相关 LocationClient mlocationClient; private BitmapDescriptor geo; private Button btn_click; private List<MarkerInfoUtil> infos; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); center();// setMarker1();// setPolyline();// locate(); } private void initView() { mapView = (MapView) findViewById(R.id.mapView); mBaiduMap = mapView.getMap(); //普通地图 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); btn_click = (Button) findViewById(R.id.btn_click); btn_click.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { locate(); } }); } @Override protected void onPause() { mapView.onPause(); super.onPause(); } @Override protected void onResume() { mapView.onResume(); super.onResume(); } @Override protected void onDestroy() { mapView.onDestroy(); super.onDestroy(); // 关闭定位图层 mBaiduMap.setMyLocationEnabled(false); } //打开地图显示自定义坐标点位置 private void center() { Marker marker; //设定中心点坐标 LatLng cenpt = new LatLng(39.142693, 117.216624); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.mipmap.icon_gcoding); //定义地图状态 MapStatus mMapStatus = new MapStatus.Builder() .target(cenpt) .zoom(18) .build(); //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化 MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(cenpt) .icon(bitmap); //在地图上添加Marker,并显示 mBaiduMap.addOverlay(option); //改变地图状态 mBaiduMap.setMapStatus(mMapStatusUpdate); } //为地图上的某个坐标点添加一个Marker图标 private void setMarker1() { //定义Maker坐标点 LatLng point = new LatLng(39.142693, 117.216624); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.mipmap.icon_gcoding); Marker marker; //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(point) .icon(bitmap); //在地图上添加Marker,并显示 mBaiduMap.addOverlay(option); } //地图上标注多个覆盖点 并且有点击事件,点击每个点显示某点的自定义信息 private void setMarker() { infos = new ArrayList<>(); MarkerInfoUtil markerInfoUtil1 = new MarkerInfoUtil(); markerInfoUtil1.setLatitude(39.93923); markerInfoUtil1.setLongitude(116.357428); markerInfoUtil1.setDescription("标志点1"); MarkerInfoUtil markerInfoUtil2 = new MarkerInfoUtil(); markerInfoUtil2.setLatitude(39.91923); markerInfoUtil2.setLongitude(116.327428); markerInfoUtil2.setDescription("标志点2"); MarkerInfoUtil markerInfoUtil3 = new MarkerInfoUtil(); markerInfoUtil3.setLatitude(39.89923); markerInfoUtil3.setLongitude(116.347428); markerInfoUtil3.setDescription("标志点3"); MarkerInfoUtil markerInfoUtil4 = new MarkerInfoUtil(); markerInfoUtil4.setLatitude(39.89923); markerInfoUtil4.setLongitude(116.367428); markerInfoUtil4.setDescription("标志点4"); MarkerInfoUtil markerInfoUtil5 = new MarkerInfoUtil(); markerInfoUtil5.setLatitude(39.91923); markerInfoUtil5.setLongitude(116.387428); markerInfoUtil5.setDescription("标志点5"); infos.add(markerInfoUtil1); infos.add(markerInfoUtil2); infos.add(markerInfoUtil3); infos.add(markerInfoUtil4); infos.add(markerInfoUtil5); for (int i = 0; i < infos.size(); i++) { LatLng point = new LatLng(infos.get(i).getLatitude(), infos.get(i).getLongitude());// } //定义Maker坐标点// LatLng point = new LatLng(39.963175, 116.400244); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.mipmap.icon_gcoding); Marker marker; //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(point) .icon(bitmap); //在地图上添加Marker,并显示 mBaiduMap.addOverlay(option); //添加marker marker = (Marker) mBaiduMap.addOverlay(option); //使用marker携带info信息,当点击事件的时候可以通过marker获得info信息 Bundle bundle = new Bundle(); //info必须实现序列化接口 bundle.putSerializable("info", infos.get(i)); marker.setExtraInfo(bundle); } mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { //从marker中获取info信息 Bundle bundle = marker.getExtraInfo(); MarkerInfoUtil infoUtil = (MarkerInfoUtil) bundle.getSerializable("info"); Toast.makeText(MainActivity.this, infoUtil.getDescription(), Toast.LENGTH_SHORT).show(); Log.e("tag", "Description=" + infoUtil.getDescription()); return false; } }); } //地图上几何覆盖物 private void setPolyline() { //定义多边形的五个顶点 LatLng pt1 = new LatLng(39.93923, 116.357428); LatLng pt2 = new LatLng(39.91923, 116.327428); LatLng pt3 = new LatLng(39.89923, 116.347428); LatLng pt4 = new LatLng(39.89923, 116.367428); LatLng pt5 = new LatLng(39.91923, 116.387428); List<LatLng> pts = new ArrayList<LatLng>(); pts.add(pt1); pts.add(pt2); pts.add(pt3); pts.add(pt4); pts.add(pt5); //构建用户绘制多边形的Option对象 OverlayOptions polygonOption = new PolygonOptions() .points(pts) .stroke(new Stroke(5, 0xAA00FF00)) .fillColor(0xAAFFFF00); //在地图上添加多边形Option,用于显示 mBaiduMap.addOverlay(polygonOption); } //定位到当前位置 并获取当前的位置信息 private void locate() { // 定位初始化 mlocationClient = new LocationClient(getApplicationContext()); LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 设置定位模式 高精度 option.setOpenGps(true); // 打开GPRS option.setCoorType(String.valueOf(CoordType.GCJ02));// 返回的定位结果是百度经纬度,默认值gcj02 option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms option.disableCache(false);// 禁止启用缓存定位 option.setIsNeedAddress(true);// 返回的定位结果包含地址信息 option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向 mlocationClient.setLocOption(option); mlocationClient.registerLocationListener(new BDLocationListener() { @Override public void onReceiveLocation(BDLocation result) { Log.e("tag", "BuildingName=" + result.getBuildingName()); Log.e("tag", "Country=" + result.getCountry()); Log.e("tag", "City=" + result.getCity()); Log.e("tag", "AddrStr=" + result.getAddrStr()); Log.e("tag", "Street=" + result.getStreet()); Log.e("tag", "Latitude=" + result.getLatitude());//纬度 Log.e("tag", "Longitude=" + result.getLongitude());//经度 Log.e("tag", "Radius=" + result.getRadius());//获取定位精度 Log.e("tag", "Direction=" + result.getDirection());//获取手机当前方向 Log.e("tag", "District=" + result.getDistrict());//获取区/县信息 Log.e("tag", "Floor=" + result.getFloor());//获取楼层信息,仅室内定位有效 if (result != null) { MyLocationData data = new MyLocationData.Builder() .accuracy(100)// .accuracy(result.getRadius()) .latitude(result.getLatitude()) .longitude(result.getLongitude()).build(); // 设置定位数据 mBaiduMap.setMyLocationData(data); LatLng ll = new LatLng(result.getLatitude(), result.getLongitude()); MapStatus.Builder builder = new MapStatus.Builder(); //地图缩放比设置为18 builder.target(ll).zoom(18.0f); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } nnrride public void onConnectHotSpotMessage(String s, int i) { Log.e("tag", "s=" + s + "i=" + i); } }); geo = BitmapDescriptorFactory.fromResource(R.mipmap.location_marker); MyLocationConfiguration configuration = new MyLocationConfiguration( MyLocationConfiguration.LocationMode.FOLLOWING, true, geo); mBaiduMap.setMyLocationConfigeration(configuration);// 设置定位模式 mBaiduMap.setMyLocationEnabled(true);// 打开定位图层 mlocationClient.start();// 调用此方法开始定位 }}
五 、xml布局文件
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.junto.baidumaptest.MainActivity"> <com.baidu.mapapi.map.MapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true"/> <Button android:id="@+id/btn_click" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="40dp" android:text="获取当前位置"/></RelativeLayout>
此例子还用到了一个地图标注信息的实体类,代码如下:
package com.junto.baidumaptest;import java.io.Serializable;/** * Created by wangjinyong on 2017/8/11. * 地图标注信息实体类 */public class MarkerInfoUtil implements Serializable { private double latitude;//纬度 private double longitude;//经度 private String name;//名字 private int imgId;//图片 private String description;//描述 //构造方法 public MarkerInfoUtil() {} public MarkerInfoUtil(double latitude, double longitude, String name, int imgId, String description) { super(); this.latitude = latitude; this.longitude = longitude; this.name = name; this.imgId = imgId; this.description = description; } //toString方法 @Override public String toString() { return "MarkerInfoUtil [latitude=" + latitude + ", longitude=" + longitude + ", name=" + name + ", imgId=" + imgId + ", description=" + description + "]"; } //getter setter public double getLatitude() { return latitude; } public void setLatitude(double latitude) { this.latitude = latitude; } public double getLongitude() { return longitude; } public void setLongitude(double longitude) { this.longitude = longitude; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getImgId() { return imgId; } public void setImgId(int imgId) { this.imgId = imgId; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; }}
到这里基本功能就已经实现了,有不足之处欢迎大家提出意见
下面附上本例子源码下载地址供参考
Demo源码
阅读全文
0 0
- 基于百度地图SDK集成的一些功能
- AndroidStudio集成百度地图导航SDK的一些坑
- 集成百度地图sdk
- 百度地图Sdk集成的使用
- AndroidStudio百度地图定位功能的集成
- Android集成百度地图SDK
- Android集成百度地图SDK
- 集成百度地图SDK(swift)
- Android集成百度地图SDK
- Android集成百度地图SDK
- Android集成百度地图SDK
- 基于百度地图的地理位置选择功能
- 百度地图的集成
- 百度地图的集成
- 百度地图的集成
- 集成百度地图SDK,百度定位SDK,二维码扫描
- 百度地图SDK集成搜索服务
- iOS开发百度地图SDK集成方法
- 生产消费模型-多生产者vs多消费者
- 8月10日云栖精选夜读:云数据库HBase版重磅商业化上线
- hdu1203(01背包微变形)
- BZOJ2002 Bounce 弹飞绵羊 <分块>
- address already in use :JVM_Bind eclipse或者myEclipse端口号被占用的解决方法
- 基于百度地图SDK集成的一些功能
- 创建一种线程的方法续
- 编辑距离 (dp)
- 蚂蚁搬新家了_还在办公室搞了个音乐节
- iOS Epub阅读器,该有的都有了
- 如何使用maven创建web项目
- 全机器学习和Python的27个速查表(完整版)
- UVALive
- java.util.concurrent.ConcurrentHashMap