MKPolygon面积计算Swift

4

我一直在尝试计算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 面积计算


polygonArea() 目前返回什么? - ndmeiri
另外,return area 后面的代码将永远不会被执行。你应该把它移到 return 语句之前。 - ndmeiri
你的意思是它返回什么?比如值?我会删除最后一行。我知道数字不对。现在它返回382838.399394838,谢谢你的回复! - Bosco Mitchell
是的,这个值。你期望什么值?不客气! - ndmeiri
我在实际面积为13816平方米的情况下得到了1439064387.63392,同时我发现变量p3没有被使用,但是我在提到的链接计算中也没有看到它。 - Bosco Mitchell
显示剩余2条评论
3个回答

1
这是 Objective-C 版本。你可以在代码中无障碍使用它。

polygon on a sphere area 1 polygon on a sphere area 2

#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;
}

编辑:更新计算方式,使得将线上的点也视为多边形内部。


我将继续处理这个。它非常接近了,我将设置一些坐标并匹配它们。在我把它标记为答案之前,我想要确认一下。非常感谢! - Bosco Mitchell
我距离目标差了124-125米。有什么想法吗?我正在尝试比较和组合之前的几个公式。 - Bosco Mitchell
由于地球的常数 - 半径并不是恒定的,地球并非完美的球体。我认为面积为125米左右15x15米可以忽略不计。 - StefanS

0
我曾试图解决同样的问题,只是使用UTM而不是经度/纬度。经过多番搜索,我一直找到了与您上面所述代码相同的代码,但对我来说根本无法工作。
然而,我发现一个简单的C函数,转换为Swift后似乎运行得非常良好。我的计算只有约1600米的计算误差约为4米,这可能归因于地球曲线。
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
}

我要去看看它是如何工作的。非常感谢你的时间和回复。我很快会告诉你的! - Bosco Mitchell
这个没有起作用,但我正在努力理解在分数上的差异会是什么。我已经有一个计算结果相当接近但还不确定的方案了。 - Bosco Mitchell

0

Swift版本是由@AVT发布的,链接为MKPolygon面积计算

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.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接