OpenStreetMap многоугольный тайл обнаружение молча вниз - PullRequest
1 голос
/ 19 февраля 2020

Я работаю над OpenStreetMap для отображения полигонов. Здесь я использую MKMapView и устанавливаю плитку OpenStreetMap.

Плитка OSM равна http://tile.openstreetmap.org/\(path.z)/\(path.x)/\(path.y).png

Она работает нормально и рисует многоугольник в точном положении. (пожалуйста, найдите приложение ниже). Я добавил UITapGestureRecognizer на многоугольник, который нарисован на карте для получения события клика. Единственная проблема заключается в том, что когда я нажимаю на многоугольник, он обнаруживает молча вниз. пожалуйста, посмотрите видео здесь .

Код плитки:

func setupTileRenderer() {
     let overlay = AdventureMapOverlay()
     overlay.canReplaceMapContent = true
     mapView.addOverlay(overlay, level: MKOverlayLevel.aboveLabels)
     tileRenderer = MKTileOverlayRenderer(tileOverlay: overlay)
     overlay.minimumZ = 13
     overlay.maximumZ = 16
}
extension MapViewVC : MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        if let overlay = overlay as? myPolygon {
            let renderer = MKPolygonRenderer(polygon: overlay)
            renderer.fillColor = overlay.color //UIColor.black.withAlphaComponent(0.5)
            renderer.strokeColor = UIColor.orange
            renderer.lineWidth = 2
            return renderer
        }
        return tileRenderer
    }

    func removeMapOverlay(){
        self.mapView.removeOverlays(self.arrPolygons.compactMap({$0.mkOverlay}))
    }
}

Событие касания:

@objc func mapTapped(_ gesture: UITapGestureRecognizer){
        let point = gesture.location(in: self.mapView)
        let coordinate = self.mapView.convert(point, toCoordinateFrom: nil)
        //print("Tap \(coordinate)")
        for overlay in self.mapView.overlays {
            if let polygon = overlay as? MKPolygon {
                guard (self.mapView.renderer(for: polygon) as? MKPolygonRenderer) != nil else { continue }
                if polygon.contain(coor: coordinate){
                    print("Tap was inside this polygon \(coordinate)")
                    break
                }                
                continue
            }
        }
    }
extension MKPolygon {
    func contain(coor: CLLocationCoordinate2D) -> Bool {
        let polygonRenderer = MKPolygonRenderer(polygon: self)
        let currentMapPoint: MKMapPoint = MKMapPoint(coor)
        let polygonViewPoint: CGPoint = polygonRenderer.point(for: currentMapPoint)
        return polygonRenderer.path.contains(polygonViewPoint)
    }
}

PS: я также нахожу способ отрисовки автономной строки OpenStreetMap так же, как MKMapView.

Любая помощь будет оценена. Спасибо. :)

...