Я работаю над 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.
Любая помощь будет оценена. Спасибо. :)