IOS高德3D地图画多边形,以及判断某一经纬度是否在该多边形内

高德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

推荐阅读更多精彩内容