Существует ли 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")
}
Я знаю, что это старый вопрос, но, может быть, кто-то найдет это полезным в любом случае...