倒圆图填swift4

inverted circle map fill in swift 4

我想在地图上画一个圆圈,当用户 select 选项 1 时,圆圈被填充为蓝色,当用户 select 选项 2 时,整个地图将被填充为蓝色而圆形区域是无色的。这怎么可能?

`func addRadiusOverlay(forGeotification geotification: Geotification) {

        mapView?.addOverlay(MKCircle(center: geotification.coordinate, radius: 300))
    }`



`func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        if overlay is MKCircle {
            let circleRenderer = MKCircleRenderer(overlay: overlay)
            circleRenderer.lineWidth = 5.0
            circleRenderer.strokeColor = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1.0)
            circleRenderer.fillColor = circleRenderer.strokeColor!.withAlphaComponent(0.1)


            return circleRenderer
        }
        return MKOverlayRenderer(overlay: overlay)
    }`

如果是Option-2,要画一个外填充透明孔的圆,使用MKPolygon.polygonWithPoints:count:interiorPolygons:和interiorPolygons参数作为圆MKPolygon,像这样:

MKPolygon(coordinates: WORLD_COORDINATES, count: WORLD_COORDINATES.count, interiorPolygons: circlePolygon)

使用以下方法生成多边形

func setupRadiusOverlay(forGeotification geotification: Geotification) {
    let c = makeCircleCoordinates(geotification.coordinate, radius: RADIUS)
    self.option1polygon = MKPolygon(coordinates: c, count: c.count, interiorPolygons: nil)
    self.option2polygon = MKPolygon(coordinates: WORLD_COORDINATES, count: WORLD_COORDINATES.count, interiorPolygons: option1polygon)
}

使用以下方法添加多边形

func addRadiusOverlay(isOption2Selected: Bool) {
    guard let mapView = mapView else { return }

    let overlay = isOption2Selected ? self.option2polygon : self.option1polygon
    if mapView.overlays.index(where: { [=12=] === overlay }) == nil {
        mapView.removeOverlays(mapView.overlays.filter{ [=12=] is MKPolygon })
        mapView.addOverlay(overlay)
    }
}

更改委托方法mapView(_:rendererFor:)

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    guard overlay is MKPolygon else {
        return MKOverlayRenderer(overlay: overlay)
    }

    let color = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1.0)
    let renderer = MKPolygonRenderer(overlay: overlay)
    renderer.lineWidth = 5.0
    renderer.strokeColor = color
    renderer.fillColor = color.withAlphaComponent(0.1)
    return renderer
}

以下为世界坐标

let WORLD_COORDINATES = [
    CLLocationCoordinate2D(latitude: 90, longitude: 0),
    CLLocationCoordinate2D(latitude: 90, longitude: 180),
    CLLocationCoordinate2D(latitude:-90, longitude: 180),
    CLLocationCoordinate2D(latitude:-90, longitude: 0),
    CLLocationCoordinate2D(latitude:-90, longitude:-180),
    CLLocationCoordinate2D(latitude: 90, longitude:-180)
]

以及以下辅助方法,由我的

提供
func makeCircleCoordinates(_ coordinate: CLLocationCoordinate2D, radius: Double, tolerance: Double = 3.0) -> [CLLocationCoordinate2D] {
    let latRadian = coordinate.latitude * .pi / 180
    let lngRadian = coordinate.longitude * .pi / 180
    let distance = (radius / 1000) / 6371 // kms
    return stride(from: 0.0, to: 360.0, by: tolerance).map {
        let bearing = [=15=] * .pi / 180

        let lat2 = asin(sin(latRadian) * cos(distance) + cos(latRadian) * sin(distance) * cos(bearing))
        var lon2 = lngRadian + atan2(sin(bearing) * sin(distance) * cos(latRadian),cos(distance) - sin(latRadian) * sin(lat2))
        lon2 = fmod(lon2 + 3 * .pi, 2 * .pi) - .pi  // normalise to -180..+180º
        return CLLocationCoordinate2D(latitude: lat2 * (180.0 / .pi), longitude: lon2 * (180.0 / .pi))
    }
}

option-2 选择产量

option-1 应该做反:)