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

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

Спасибо за вашу помощь С.О.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Есть пара ресурсов, на которые вы захотите взглянуть.

Во-первых, в Mapkit есть несколько вспомогательных функций для работы со структурами MKMapRect.Они помогут вам конвертировать между регионами и MKMapRects и так далее.Смотрите их здесь: 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-подобные запросы, которые будут отвечать на вопросы, которые вы задаете.

1 голос
/ 28 апреля 2016

Я написал эту функцию, которая принимает центр 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")
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...