如何使用MKMapKit为美国大陆边界生成折线?

时间:2015-11-17 17:21:20

标签: mkmapview mapkit mkoverlay mkpolyline

注意:如果此问题需要更多信息,请添加评论。

详细信息:

我想在MKMapView上围绕美国大陆生成边界线。我们的想法是开始在国家大纲之外的区域绘制覆盖图(我需要不再强调外部区域,只需将美国作为主要焦点;我正在考虑模糊效果,但愿意接受有关实施的建议或其他方法来实现目标)。

背景

我需要模糊(或不再强调)除美国大陆以外的默认MKMapView中出现的其他国家/地区。

我的初步方法:

  1. 使用折线标识连续的国家/地区边界框 (类似于地图上公交路线的表示方式;我注意到了 似乎是一些默认行〜任何访问它们的方法 坐标?)
  2. 使用UIVisualEffectView识别掩盖地图的方法 模糊(或任何其他可能使地图的那部分变暗的可能性 在边界内)
  3. 我不一定需要代码解决方案(尽管如果发布,我会尝试)。我想知道在这个领域有经验的人是否可以提供伪代码或者只是提供一些关于采用这个过程的最佳方法的指示。

    其他研究:

    我查看了其他来源,包括MapKit documentation和此overlay tutorial

1 个答案:

答案 0 :(得分:1)

您将需要在所有MKMapView周围绘制一个带有内部多边形的多边形,该多边形将是您不想模糊的区域。 这是我的解决方案:

首先,您需要坐标来覆盖地图的每一位:

struct WorldCoordinates {
    static let values = [
        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)
    ]
}

然后使用这种方法添加内部和外部多边形: 请注意,我使用“ City”作为结构的示例,boundigCoordinatesArray是您不想模糊的区域的边界坐标的数组。

func addCityBoundingPolygon(in mapView: MKMapView, with city: City) {
    // Declare your inner polygon
    let innerPolygon = MKPolygon(coordinates: city.boundingCoordinatesArray, count: city.boundingCoordinatesArray.count)
    innerPolygon.title = "\(city.id)"
        
    // Declare your outer polygon with previously created inner polygon
    let outerPolygon = MKPolygon(coordinates: WorldCoordinates.values, count: WorldCoordinates.values.count, interiorPolygons: [innerPolygon])
        
    mapView.addOverlay(outerPolygon)    
}

最后像这样在MKMapViewDelegate上添加外部多边形的颜色:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    if let polygon = overlay as? MKPolygon {
        let renderer = MKPolygonRenderer(polygon: polygon)
        renderer.fillColor = UIColor.outOfCityBounds().withAlphaComponent(0.1)
        renderer.strokeColor = UIColor.outOfCityBounds().withAlphaComponent(0.4)
        renderer.lineWidth = 1
        return renderer
    }

    return MKOverlayRenderer()
}

使用这种方法,您将能够重新创建如下内容: Urbvan App