Android 高德地图 定位+围栏
16lz
2021-01-23
package com.amap.map3d.demo;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Point;import android.net.ConnectivityManager;import android.os.Bundle;import android.util.Log;import android.widget.Toast;import com.amap.api.fence.GeoFence;import com.amap.api.fence.GeoFenceClient;import com.amap.api.fence.GeoFenceListener;import com.amap.api.location.AMapLocation;import com.amap.api.location.AMapLocationClient;import com.amap.api.location.AMapLocationClientOption;import com.amap.api.location.AMapLocationListener;import com.amap.api.location.DPoint;import com.amap.api.maps.AMap;import com.amap.api.maps.MapView;import com.amap.api.maps.model.BitmapDescriptorFactory;import com.amap.api.maps.model.CameraPosition;import com.amap.api.maps.model.CircleOptions;import com.amap.api.maps.model.LatLng;import com.amap.api.maps.model.Marker;import com.amap.api.maps.model.MarkerOptions;import com.amap.api.maps.model.MyLocationStyle;import org.jetbrains.annotations.Nullable;import java.util.List;/** * Created by PVer on 2018/4/9. */public class DingweiActivity extends Activity implements AMapLocationListener, GeoFenceListener { private AMapLocationClient aMapLocationClient; private AMapLocationClientOption locationClientOption; private AMap aMap; private MapView mapView; private MyBroadcastReceiver mBReceiver; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map); mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState); init(); showLocationIcon(); createMark(); create();//围栏初始化 //注册监听事件 mGeoFenceClient = new GeoFenceClient(getApplicationContext()); mGeoFenceClient.setActivateAction(GeoFenceClient.GEOFENCE_IN| GeoFenceClient.GEOFENCE_OUT| GeoFenceClient.GEOFENCE_STAYED); mGeoFenceClient.createPendingIntent(GEOFENCE_BROADCAST_ACTION);//接受定位广播 IntentFilter filter = new IntentFilter( ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(GEOFENCE_BROADCAST_ACTION); mBReceiver = new MyBroadcastReceiver(); registerReceiver(mBReceiver, filter); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态 mapView.onSaveInstanceState(outState); } //---------------todo 定位代码--------------------------------------------------------------------- public void init() { aMap = mapView.getMap(); aMapLocationClient = new AMapLocationClient(this); locationClientOption = new AMapLocationClientOption(); //设置返回地址信息,默认为true locationClientOption.setNeedAddress(true);//设置定位监听//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式 locationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置定位间隔,单位毫秒,默认为2000ms locationClientOption.setInterval(2000); aMapLocationClient.setLocationListener(DingweiActivity.this);//定位监听 获取定位信息onLocationChanged() aMapLocationClient.setLocationOption(locationClientOption); aMapLocationClient.startLocation(); } @Override public void onLocationChanged(AMapLocation aMapLocation) { StringBuffer sb = new StringBuffer(); if (aMapLocation != null) { if (aMapLocation.getErrorCode() == 0) { sb.append("定位成功" + "\n"); sb.append("定位类型: " + aMapLocation.getLocationType() + "\n"); sb.append("经 度 : " + aMapLocation.getLongitude() + "\n"); sb.append("纬 度 : " + aMapLocation.getLatitude() + "\n"); sb.append("精 度 : " + aMapLocation.getAccuracy() + "米" + "\n"); sb.append("提供者 : " + aMapLocation.getProvider() + "\n"); sb.append("速 度 : " + aMapLocation.getSpeed() + "米/秒" + "\n"); sb.append("角 度 : " + aMapLocation.getBearing() + "\n"); // 获取当前提供定位服务的卫星个数 sb.append("星 数 : " + aMapLocation.getSatellites() + "\n"); sb.append("国 家 : " + aMapLocation.getCountry() + "\n"); sb.append("省 : " + aMapLocation.getProvince() + "\n"); sb.append("市 : " + aMapLocation.getCity() + "\n"); sb.append("城市编码 : " + aMapLocation.getCityCode() + "\n"); sb.append("区 : " + aMapLocation.getDistrict() + "\n"); sb.append("区域 码 : " + aMapLocation.getAdCode() + "\n"); sb.append("地 址 : " + aMapLocation.getAddress() + "\n"); sb.append("兴趣点 : " + aMapLocation.getPoiName() + "\n"); //定位完成的时间 // sb.append("定位时间: " + Utils.formatUTC(aMapLocation.getTime(), "yyyy-MM-dd HH:mm:ss") + "\n"); //Log.e("tag", sb.toString()); } } } //todo------------定位图标与map 的关联----------------------------------------- private MyLocationStyle myLocationStyle; public void showLocationIcon() { myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。 myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。 myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//定位模式 不跟随 默认情况下跟随 aMap.setMyLocationStyle(myLocationStyle); //图片与map 相互关联 aMap.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮是否显示,非必需设置。 aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。 } //todo -----------------創建圍欄创建围栏 并监听 围栏事件-------- private GeoFenceClient mGeoFenceClient; public void showWeiLan(double v1, double v2) { //创建自定义 围栏 圆形//创建一个中心点坐标 DPoint centerPoint = new DPoint(v1, v2); mGeoFenceClient.addGeoFence(centerPoint, 300f, "1"); //围栏监听信息 mGeoFenceClient.setGeoFenceListener(this); Log.e("tag", "============围栏300==================1"); } //绘制面 public void circle(double v1, double v2) { LatLng latLng = new LatLng(v1, v2); aMap.addCircle(new CircleOptions().center(latLng) .radius(300).strokeColor(Const.STROKE_COLOR) .fillColor(Const.FILL_COLOR).strokeWidth(Const.STROKE_WIDTH)); Log.e("tag", "============圈圈300==================2"); } //点击地图任意一个地方创建围栏 public void create() { aMap.setOnMapClickListener(new AMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { Log.e("经纬度", latLng.latitude + "/////" + latLng.longitude); circle(latLng.latitude, latLng.longitude); showWeiLan(latLng.latitude, latLng.longitude); } }); } //围栏监听信息 @Override public void onGeoFenceCreateFinished(List list, int i, String s) { if (i == GeoFence.ADDGEOFENCE_SUCCESS) {//判断围栏是否创建成功 //geoFenceList就是已经添加的围栏列表 // Toast.makeText(DingweiActivity.this, "yy", Toast.LENGTH_SHORT).show(); Log.e("ee", "创建围栏成功"); //创建并设置PendingIntent 发送广播 } else { //geoFenceList就是已经添加的围栏列表 Log.e("ee", "创建围栏失敗"); } } //todo ------------------------------------------------------------------- //定义接收广播的action字符串 public static final String GEOFENCE_BROADCAST_ACTION = "com.location.apis.geofencedemo.broadcast"; class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(GEOFENCE_BROADCAST_ACTION)) { //解析广播内容 Bundle bundle = intent.getExtras(); //获取当前有触发的围栏对象: GeoFence fence = bundle.getParcelable(GeoFence.BUNDLE_KEY_FENCE); Toast.makeText(context, fence.getStatus() + "-----------", Toast.LENGTH_SHORT).show(); int status = bundle.getInt(GeoFence.BUNDLE_KEY_FENCESTATUS); StringBuffer sb = new StringBuffer(); switch (status) { case GeoFence.STATUS_LOCFAIL: sb.append("定位失败"); break; case GeoFence.STATUS_IN: sb.append("进入围栏 "); Toast.makeText(context, "enter围栏", Toast.LENGTH_SHORT).show(); Log.e("tttt", "进入围栏"); break; case GeoFence.STATUS_OUT: sb.append("离开围栏 "); Toast.makeText(context, "离开围栏", Toast.LENGTH_SHORT).show(); Log.e("tttt", "离开围栏"); break; case GeoFence.STATUS_STAYED: sb.append("停留在围栏内 "); Log.e("tttt", "停留围栏"); Toast.makeText(context, "停留围栏", Toast.LENGTH_SHORT).show(); break; default: break; } } } } /** * 添加mark */ public void createMark() { //map 地图添加 监听mark 必须的 aMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() { @Override public void onMapLoaded() { addMarkersToMap(); } }); //拖动地图 获取地图位置设置地图状态的监听接口。 aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { Log.e("AAPP_CHANGE", cameraPosition.toString()); } @Override public void onCameraChangeFinish(CameraPosition cameraPosition) { Log.e("AAPP_FINISH", cameraPosition.toString()); } });// 对amap添加移动地图事件监听器 } /** * 在地图上添加marker */ private void addMarkersToMap() { addMarkerInScreenCenter(); } /** * 在屏幕中心添加一个Marker */ /** * 可视区域的位置(CameraPosition) * * 可视区域的位置由以下属性组成: *
* 目的地(target) * 缩放级别(zoom) * 方向(bearing) * 倾斜角度(tilt) *
* 屏幕当前可视区域的位置可以通过 AMap.getCameraPosition() 方法获取。 * 目的地(target) * 屏幕中心marker 跳动 *
* 该mark 始终在屏幕的中心点 不跟随地图的移动而移动 因此在监听地图拖动监听事件时获取地理位置 也要进行中心点的判断 *
* getCameraPosition() 和 aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {} CameraPosition 一致 */
Marker screenMarker = null; private void addMarkerInScreenCenter() { LatLng latLng = aMap.getCameraPosition().target;// 目的地(target) 缩放级别(zoom) 方向(bearing) 倾斜角度(tilt) Point screenPosition = aMap.getProjection().toScreenLocation(latLng); screenMarker = aMap.addMarker(new MarkerOptions() .anchor(0.5f, 0.5f) .icon(BitmapDescriptorFactory.fromResource(R.drawable.purple_pin))); //设置Marker在屏幕上,不跟随地图移动 screenMarker.setPositionByPixels(screenPosition.x, screenPosition.y); } //通过Mark 所在的坐标点 获取 坐标获取 poi/* public void getPoi() { PoiSearch poiSearch = new PoiSearch(this, query); poiSearch.setOnPoiSearchListener(this); poiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(locationMarker.getPosition().latitude, locationMarker.getPosition().longitude), 1000));//设置周边搜索的中心点以及半径 }*/ @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图 mapView.onDestroy(); aMapLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。 unregisterReceiver(mBReceiver); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图 mapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制 mapView.onPause(); }}如图 :当创建 围栏所在的区域范围内包含自己所在的定点坐标 会提示 已经进入围栏 反之离开围栏
代码传送https://download.csdn.net/download/bxllove/10340794
更多相关文章
- RotateAnimation 设置旋转中心点、不停顿
- 高德地图自定义点聚合样式Android
- 百度地图android开发资料
- Android百度地图——路径规划(驾车、步行和公交线路搜索)
- Android引路蜂地图开发包
- 根据百度地图API得到坐标和地址并在地图上显示
- android百度地图 覆盖物弹出层效果
- Android使用百度地图SDK获得当前设备位置所在的省、市(系列1)
- android 百度地图轨迹回放