高德2d实现该功能请移步高德2D地图画多边形并判断某一点是否在多边形内;
不显示地图(用于后台小程序等),判断经纬度是否在多边形区域内请移步;
最近接了一个结合ERP做线上商城的小活,有一个需求为:每一个店维护多个可配送的地址,配送地址为地图中的多边形区域,用户选择收货地址的时候需要判断该收货地址在不在多边形区域内。
翻看了一下高德提供的技术文档,没找到3D地图下该怎么完成此功能。无奈自己翻找高德的SDK,发现了这两个类:MAPolygon MAOverlayRenderer
MAPolygon用于定义一个由多个点组成的闭合多边形,点与点之间按顺序尾部相连,第一个点与最后一个点相连,通常MAPolygon是MAPolygonView的model
MAOverlayRenderer是地图覆盖物Renderer的基类,提供绘制overlay的接口但并无实际的实现(render相关方法只能在重写后的glRender方法中使用)
具体高德的配置不再啰嗦,高德官方提供的流程非常简单易懂,直接扔代码吧~~~
当时写的太匆忙,现在重新编辑下,只留和多边形相关的代码
画多边形
//构造多边形数据对象,此处注意需要用到C语言的数组
CLLocationCoordinate2D coordinates[6];
coordinates[0].latitude = 36.66252;
coordinates[0].longitude = 117.126837;
coordinates[1].latitude = 36.658458;
coordinates[1].longitude = 117.105551;
coordinates[2].latitude = 36.64379;
coordinates[2].longitude = 117.10804;
coordinates[3].latitude = 36.637454;
coordinates[3].longitude = 117.126665;
coordinates[4].latitude = 36.651847;
coordinates[4].longitude = 117.139797;
coordinates[5].latitude = 36.662589;
coordinates[5].longitude = 117.126407;
//构造多边形
MAPolygon *pol = [MAPolygon polygonWithCoordinates:coordinates count:6];
//在地图上添加圆
[_mapView addOverlay: pol];
}
//多边形 线的 overlay协议
- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id<MAOverlay>)overlay
{
//多边形
if ([overlay isKindOfClass:[MAPolygon class]])
{
MAPolygonRenderer *pol = [[MAPolygonRenderer alloc] initWithPolygon:overlay];
pol.lineWidth = 1.f;
pol.strokeColor = [UIColor blueColor];
pol.fillColor = [UIColor colorWithRed:158/255.0 green:230/255.0 blue:252/255.0 alpha:0.5];
pol.lineDash = YES;//YES表示虚线绘制,NO表示实线绘制
self.polygonView = pol;
return pol;
}
return nil;
}
判断某个经纬度是否在多边形内
MAMapPoint point = MAMapPointForCoordinate(self.mapView.userLocation.location.coordinate);
if (MAPolygonContainsPoint(point, _polygonView.polygon.points, 6)) {
NSLog(@"在区域内");
}else{
NSLog(@"不在区域内");
}
此处给出高德两个判断经纬度是否在多边形内的方法:
/**
* @brief 判断点是否在多边形内
* @param point 点
* @param polygon 多边形
* @param count 多边形点的数量
* @return 判断结果
*/
extern BOOL MAPolygonContainsPoint(MAMapPoint point, MAMapPoint *polygon, NSUInteger count);
/**
* @brief 判断经纬度点是否在多边形内
* @param point 经纬度点
* @param polygon 多边形
* @param count 多边形点的数量
* @return 判断结果
*/
extern BOOL MAPolygonContainsCoordinate(CLLocationCoordinate2D point, CLLocationCoordinate2D *polygon, NSUInteger count);
最终实现的效果:
image.png