Как я могу нарисовать два MKPolygons на MapView без их соединения? - PullRequest
0 голосов
/ 15 января 2020

По какой-то причине, когда я пытаюсь нарисовать два MKPolygons на mapView (MKMapView), я получаю два подключенных полигона. Рисование каждого многоугольника в отдельности работает отлично. И я проверил, что каждый из полигонов не содержит никаких координат, чтобы сформировать связь между ними. Я прикрепил изображение с двумя соединенными полигонами

Для справки, вот где я звоню, чтобы добавить полигоны.

func addPeakTimePolygon(from coordinatesArray: [CLLocationCoordinate2D], title: Int){
            let polygon = MKPolygon(coordinates: coordinatesArray, count: coordinatesArray.count)
            polygon.title = String(title)
            //Should refactor to use .contains(where:
            var shouldAdd = true
            for polygon in self.currentPolygons{
                if polygon.title == String(title){
                    shouldAdd = false
                }
            }
            if shouldAdd{
                self.currentPolygons.append(polygon)
                self.mapView.add(polygon)
            }
    } 

А вот мои rendererFor код:

 func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        if overlay is MKPolyline {
            let renderer = MKPolylineRenderer(overlay: overlay)
            renderer.strokeColor = #colorLiteral(red: 0, green: 0.6862745098, blue: 0.7607843137, alpha: 1)
            renderer.lineWidth = 5.0
            return renderer
        }
        else if overlay is MKPolygon {
            let renderer = MKPolygonRenderer(overlay: overlay)
            renderer.fillColor = UIColor.red.withAlphaComponent(0.5)
            renderer.strokeColor = UIColor.red
            renderer.lineWidth = 2
            return renderer
        }
        return MKOverlayRenderer()
    }

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Я забыл проверить / опубликовать код, который звонил addPeakTimePolygon. Вот код проблемы c ниже:

var locationList: [CLLocationCoordinate2D] = []
        var title = 0
        if let peakTimeCampaignList = data["PeakTimeRewardCampaignList"] as? [[AnyHashable:Any]]{
            for campaign in peakTimeCampaignList{
                if let polygonPoints = campaign["CampaignPolygon"] as? [[AnyHashable:Any]]{
                    for polygonPoint in polygonPoints{
                        let polygonPoint = CLLocationCoordinate2D(latitude: polygonPoint["Latitude"] as! CLLocationDegrees, longitude: polygonPoint["Longitude"] as! CLLocationDegrees)
                        locationList.append(polygonPoint)
                    }
                }
                if let id = campaign["Id"] as? Int{
                    title = id
                }
                mapBundle.addPeakTimePolygon(from: locationList, title: title)
            }
        }

Как вы можете видеть, locationList не был очищен в l oop, поэтому все, что мы отправили на addPeakTimePolygon, получило координаты двух полигонов, и MapKit пытался создать между ними многоугольник.

Это была глупая ошибка, но надеяться, что кто-то другой увидит это с той же проблемой!

0 голосов
/ 15 января 2020

Похоже, вы делаете один оверлей, состоящий из двух полигонов. Вы не можете сделать это с MKPolygonRenderer; вы получите один многоугольник, как вы наблюдаете.

Вам понадобятся отдельные наложения, по одному для каждого многоугольника. Если вы не используете iOS 13! В этом случае вам повезло: новое в iOS 13, несколько полигонов или полилиний могут быть объединены в MKMultiPolygon или MKMultiPolyline и нарисованы MKMultiPolygonRenderer или MKMultiPolylineRenderer.

...