我一直在尝试计算MKPolygon,我在这里已经按照一些链接进行了相应的调整。我似乎无法正确计算平方米。如果需要,我可以提供更多信息
这是我的代码
func polygonArea() -> Double{
var area: Double = 0
var kEarthRadius:Double = 6378137
var coord: NSArray = self.coordinates()
if (coord.count > 2){
var p1, p2, p3 : CLLocationCoordinate2D
var lowerIndex, middleIndex, upperIndex: Int
for var i = 0; i < points.count - 1; i++ {
if (i == (points.count - 2)){
lowerIndex = points.count - 2
middleIndex = points.count - 1
upperIndex = 0
}else if (i == points.count - 1){
lowerIndex = points.count - 1
middleIndex = 0
upperIndex = 1;
}else{
lowerIndex = i
middleIndex = i + 1
upperIndex = i + 2
}
p1 = points[lowerIndex]
p2 = points[middleIndex]
p3 = points[upperIndex]
area += degreesToRadians(p2.longitude - p1.longitude) * (2 + sin(degreesToRadians(p1.latitude)) + sin(degreesToRadians(p2.latitude)))
}
area = area * kEarthRadius * kEarthRadius / 2
}
return area
measureLabel.text = "\(area)"
}
我特意注意了这个链接 MKPolygon area calculation
答案 0 :(得分:1)
这是Objective-C版本。您可以在代码中使用它而没有任何问题。
#define kEarthRadius 6378137
@implementation MKPolygon (AreaCalculation)
- (double) area {
double area = 0;
NSMutableArray *coords = [[self coordinates] mutableCopy];
[coords addObject:[coords firstObject]];
if (coords.count > 2) {
CLLocationCoordinate2D p1, p2;
for (int i = 0; i < coords.count - 1; i++) {
p1 = [coords[i] MKCoordinateValue];
p2 = [coords[i + 1] MKCoordinateValue];
area += degreesToRadians(p2.longitude - p1.longitude) * (2 + sinf(degreesToRadians(p1.latitude)) + sinf(degreesToRadians(p2.latitude)));
}
area = - (area * kEarthRadius * kEarthRadius / 2);
}
return area;
}
- (NSArray *)coordinates {
NSMutableArray *points = [NSMutableArray arrayWithCapacity:self.pointCount];
for (int i = 0; i < self.pointCount; i++) {
MKMapPoint *point = &self.points[i];
[points addObject:[NSValue valueWithMKCoordinate:MKCoordinateForMapPoint(* point)]];
}
return points.copy;
}
double degreesToRadians(double radius) {
return radius * M_PI / 180;
}
编辑:更新,以便计算也将线上的点视为聚合物内部。
答案 1 :(得分:0)
我试图解决同样的问题,除了使用UTM而不是long / lat。经过多次搜索后,我一直在寻找与上面相同的代码,这对我来说无效。
然而,我发现的是一个简单的C函数,当转换为Swift时似乎工作得很好。我计算的距离大约为4米,计算时间约为1600米,可能是地球曲线。
class func polygonArea(points: Array<GAPaddockPoint>) -> Double {
var area:Double = 0.0
var j = points.count - 1
for var i=0; i<points.count; i++ {
area = area + ( (points[j].easting + points[i].easting) * (points[j].northing - points[i].northing) )
j=i
}
return area * 0.5
}
答案 2 :(得分:0)
Swift版本由@AVT在MKPolygon area calculation发布:
import MapKit
let kEarthRadius = 6378137.0
// CLLocationCoordinate2D uses degrees but we need radians
func radians(degrees: Double) -> Double {
return degrees * M_PI / 180
}
func regionArea(locations: [CLLocationCoordinate2D]) -> Double {
guard locations.count > 2 else { return 0 }
var area = 0.0
for i in 0..<locations.count {
let p1 = locations[i > 0 ? i - 1 : locations.count - 1]
let p2 = locations[i]
area += radians(degrees: p2.longitude - p1.longitude) * (2 + sin(radians(degrees: p1.latitude)) + sin(radians(degrees: p2.latitude)) )
}
area = -(area * kEarthRadius * kEarthRadius / 2)
return max(area, -area) // In order not to worry about is polygon clockwise or counterclockwise defined.
}