需求:使用高德地图api实现多边形的绘制与编辑,从而实现圈中房屋的效果。
在js中有相关插件,效果很好。点我跳转
但是在高德开放平台中并未找到安卓ios的相关插件或者方法,于是提交工单,5个工作日才能回复,算了不等了,自己写吧!
思路:
1.首先根据当前定位的点绘制一个矩形,在矩形的四个顶点(LatLng)创建Marker,并给四个顶点初始化一个状态(MyLatLng.ABLE)和一个索引值。
2.计算矩形四边的中点经纬度(LatLng),四个中点创建Marker,并给四个顶点初始化一个状态(MyLatLng.UNABLE)和一个索引值。
3.绘制多边形样式,并调用AMap.addPolygon方法创建多边形。
4.aMap.setOnMarkerDragListener给Marker添加拖拽事件
5.在onMarkerDragStart方法移除拖拽的Marker
6.在onMarkerDragEnd方法添加新的Marker并判断该点左右两个Marker的状态:如果状态为MyLatLng.ABLE,则表示该点拖拽后需要在该点两侧创建新Marker。如果状态为MyLatLng.UNABLE则不需要创建新的点,而是替换两侧的点的坐标(该坐标为新点到两侧点的中间点)。
7、重新根据新的点绘制多边形
效果图
444.png
代码:
1.集成高德地图和申请位置权限就不说了
2.初始化地图
/**
* 初始化地图
*/
private void initMap() {
if (aMap == null) {
aMap = mMapView.getMap();
MyLocationStyle myLocationStyle;
myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
aMap.setMinZoomLevel(20);//不让用户缩放地图
aMap.moveCamera(CameraUpdateFactory.zoomTo(20));
mlocationClient = new AMapLocationClient(this.getApplicationContext());
locationOption = getDefaultOption();
mlocationClient.setLocationOption(locationOption);
mlocationClient.setLocationListener(locationListener);
// 启动定位
mlocationClient.startLocation();
}
}
/**
* 设置默认的定位参数
*/
private AMapLocationClientOption getDefaultOption() {
AMapLocationClientOption mOption = new AMapLocationClientOption();
mOption.setLocationMode(
AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
mOption.setInterval(300000);//可选,设置定位间隔。默认为2秒
mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
mOption.setOnceLocation(true);//可选,设置是否单次定位。默认是false
mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
AMapLocationClientOption.setLocationProtocol(
AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
mOption.setWifiScan(
true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差
return mOption;
}
3.定位的监听
/**
* 定位监听
*/
AMapLocationListener locationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (null != amapLocation) {
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
if (amapLocation.getErrorCode() == 0) {
latitude = amapLocation.getLatitude();
longitude = amapLocation.getLongitude();
aMap.a