Существует ли iOS API для работы с регионами на карте и расчета пересечения, площади и т. Д.?

Я решил спросить это, прежде чем сделать это трудным путем. Я гуглил и Stackrued вокруг и не могу ничего найти. MapKit хорошо рисует фигуры областей в MKMapView, а CoreLocation хорошо показывает прямое расстояние от CLLocation до CLLocation, но ни то, ни другое мне не нужно.

Я в основном хочу иметь возможность отбрасывать точку на карте с радиусом 10 метров и знать, есть ли там что-нибудь уже (что также будет иметь радиус 10 метров) и будет ли она пересекать область второй отброшенной вещи. Я хочу иметь возможность получить общую площадь всех этих точек в квадратных метрах, что легко, но с поправкой на перекрывающиеся круги.

Спасибо за вашу помощь ТАК.

2 ответа

Решение

Есть пара ресурсов, которые вы захотите посмотреть.

Во-первых, в Mapkit есть несколько вспомогательных функций для работы со структурами MKMapRect. Они помогут вам конвертировать между регионами и MKMapRect s и так далее. Смотрите их здесь: http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html%23//apple_ref/doc/uid/TP40008209

Во-вторых, для выполнения вычислений геометрии, которые вы хотите выполнить (радиус, площадь и т. Д.), Вам, вероятно, понадобится следующее: http://trac.osgeo.org/geos/

Сложно скомпилировать для iOS, но это можно сделать. Хорошее место для того, чтобы взглянуть на его компиляцию, - это проект пространства. Spatialite зависит от географии, и люди скомпилировали пространственный для iOS. Смотрите здесь: как скомпилировать пространственный для iOS

[Править] На самом деле, после прочтения вашего вопроса вы можете просто использовать Spatialite и не беспокоиться только о гео. Вам придется хранить ваши данные в базе данных на устройстве. Это позволит вам создавать SQL-подобные запросы, которые будут отвечать на вопросы, которые вы задаете.

Я написал эту функцию, которая принимает центр x, y и радиус для двух окружностей и возвращает область пересечения.

public func circlesIntesectionArea(x1 x1: Double, y1: Double, r1: Double, x2: Double, y2: Double, r2: Double) -> Double {

    let d: Double = sqrt( pow(x1 - x2, 2) + pow(y1 - y2, 2) ) // distance between circles center

    let dd: Double = pow(d, 2)
    let rr1: Double = pow(r1, 2)
    let rr2: Double = pow(r2, 2)

    if d > r2 + r1 { return 0.0 } // no overlap
    if d <= abs(r1 - r2) {
        if r1 >= r2 { return M_PI * rr2 } //Circle2 inside circle1
        else { return M_PI * rr1 } //Circle1 inside circle2
    } else {
        let phi: Double = acos((dd + rr1 - rr2) / (2 * r1 * d)) * 2; // circle1 sector angle
        let area1: Double = (phi * rr1)/2 - (rr1 * sin(phi))/2; // sector1 area - triangle1 area

        let theta: Double = acos((dd + rr2 - rr1) / (2 * r2 * d)) * 2; // circle2 sector center angle
        let area2: Double = (theta * rr2)/2 - (rr2 * sin(theta))/2; // sector2 area - triangle2 area

        let intersectionArea: Double = area1 + area2;
        return isnan(intersectionArea) ? 0.0 : intersectionArea; //isnan == no overlap
    }
}

Радиус здесь не может быть в метрах или милях, поэтому, если у вас есть круговой регион, вы должны преобразовать его в MKCoordinateRegion:

let region1 = MKCoordinateRegionMakeWithDistance(circularRegion.center, circularRegion.radius, circularRegion.radius)

Затем:

if circlesIntesectionArea(x1: region1.center.longitude, y1: region1.center.latitude, r1: region1.span.latitudeDelta,
                          x2: region2.center.longitude, y2: region2.center.latitude, r2: region2.span.latitudeDelta) == 0.0 {
    print("No overlapping")
} else {
    print("Overlapping")
}

Я знаю, что это старый вопрос, но, может быть, кто-то найдет это полезным в любом случае...

Другие вопросы по тегам