检查用户位置是否在形状内

Check if user location is inside a shape

我使用此方法来检查用户位置是否在地图视图 (mapkit) 的多边形内。 我将当前用户位置 (CLLocationCoordinate2D) 和 return 一个布尔值传递给方法,只是为了知道用户是否在多边形中。

func userInsidePolygon(userlocation: CLLocationCoordinate2D ) -> Bool{
    // get every overlay on the map  
    let o = self.mapView.overlays
    // loop every overlay on map
    for overlay in o {
        // handle only polygon
        if overlay is MKPolygon{
            let polygon:MKPolygon =  overlay as! MKPolygon
            let polygonPath:CGMutablePathRef  = CGPathCreateMutable()
            // get points of polygon
            let arrPoints = polygon.points()
            // create cgpath
            for (var i:Int=0; i < polygon.pointCount; i++){
                let mp:MKMapPoint = arrPoints[i]
                if (i == 0){
                    CGPathMoveToPoint(polygonPath, nil, CGFloat(mp.x), CGFloat(mp.y))
                }
                else{
                    CGPathAddLineToPoint(polygonPath, nil, CGFloat(mp.x), CGFloat(mp.y))
                }
            }
            let mapPointAsCGP:CGPoint = self.mapView.convertCoordinate(userlocation, toPointToView: self.mapView)
            return CGPathContainsPoint(polygonPath , nil, mapPointAsCGP, false)
        }
    }
    return false
}

我真的不明白为什么,但在这次测试之后用户永远不会在多边形内。 (我很确定他是)

我认为 lat/long 对 x,y 可能存在逻辑问题。

有没有人已经有这样的工作了?

提前感谢所有建议。

干杯

问题是您正在将 userLocation 从地图坐标转换为视图坐标,但是在构建路径时,您没有将点转换为视图坐标。

您需要将 MKMapPoint 转换为 CLLocationCoordinate2D,然后再转换为 CGPoint

let polygonMapPoint: MKMapPoint = arrPoints[i]
let polygonCoordinate = MKCoordinateForMapPoint(polygonPoint)
let polygonPoint self.mapView.convertCoordinate(polygonPointAsCoordinate, toPointToView: self.mapView)

然后在构建路径时使用polygonPoint

CGPathMoveToPoint(polygonPath, nil, polygonPoint.x, polygonPoint.y)

Swift3、Xcode8 回答:

func userInsidePolygon(userlocation: CLLocationCoordinate2D ) -> Bool {
    var containsPoint: Bool = false
    // get every overlay on the map
    let o = self.mapView.overlays
    // loop every overlay on map
    for overlay in o {
        // handle only polygon
        if overlay is MKPolygon{
            let polygon:MKPolygon =  overlay as! MKPolygon
            let polygonPath:CGMutablePath  = CGMutablePath()
            // get points of polygon
            let arrPoints = polygon.points()
            // create cgpath
            for i in 0..<polygon.pointCount {

                let polygonMapPoint: MKMapPoint = arrPoints[i]
                let polygonCoordinate = MKCoordinateForMapPoint(polygonMapPoint)
                let polygonPoint = self.mapView.convert(polygonCoordinate, toPointTo: self.mapView)

                if (i == 0){
                    polygonPath.move(to: CGPoint(x: polygonPoint.x, y: polygonPoint.y))
                }
                else{
                    polygonPath.addLine(to: CGPoint(x: polygonPoint.x, y: polygonPoint.y))
                }
            }
            let mapPointAsCGP:CGPoint = self.mapView.convert(userlocation, toPointTo: self.mapView)
            containsPoint =  polygonPath.contains(mapPointAsCGP)
            if containsPoint {
                return true
            }
        }
    }
    return containsPoint
}