Прямоугольник с использованием CLLocationCoordinate2D - PullRequest
0 голосов
/ 10 марта 2020

Я хотел бы знать, могу ли я создать прямоугольник, используя верхний левый и нижний правый CLLocationCoordinate2D, а затем проверить, является ли координата частью этого прямоугольника, проверив (topLeftCoordinate.latitude < coordinate.latitude && bottomRightCoordinate.latitude > coordinate.latitude) && (topLeftCoordinate.longitude < coordinate.longitude && bottomRightCoordinate.longitude > coordinate.longitude).

Я думал, что координата будет представлять точку на сфере, и тогда это не сработает. Но я запутался из-за 2D в конце CLLocationCoordinate2D. Может кто-нибудь уточнить это?

Спасибо:)

1 Ответ

0 голосов
/ 10 марта 2020

Вы сможете создать MKPolygon из ваших координат и использовать эту функцию, чтобы определить, находится ли координата внутри этого многоугольника:

func isPoint(point: MKMapPoint, insidePolygon poly: MKPolygon) -> Bool {

    let polygonVerticies = poly.points()
    var isInsidePolygon = false

    for i in 0..<poly.pointCount {
        let vertex = polygonVerticies[i]
        let nextVertex = polygonVerticies[(i + 1) % poly.pointCount]

        // The vertices of the edge we are checking.
        let xp0 = vertex.x
        let yp0 = vertex.y
        let xp1 = nextVertex.x
        let yp1 = nextVertex.y

        if ((yp0 <= point.y) && (yp1 > point.y) || (yp1 <= point.y) && (yp0 > point.y))
        {
            // If so, get the point where it crosses that line. This is a simple solution
            // to a linear equation. Note that we can't get a division by zero here -
            // if yp1 == yp0 then the above if be false.
            let cross = (xp1 - xp0) * (point.y - yp0) / (yp1 - yp0) + xp0

            // Finally check if it crosses to the left of our test point. You could equally
            // do right and it should give the same result.
            if cross < point.x {
                isInsidePolygon = !isInsidePolygon
            }
        }
    }

    return isInsidePolygon
}
...