ios – MKPolygon区域计算Swift

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

最佳答案 这是Objective-C版本.您可以在代码中使用它而不会出现任何问题.

《ios – MKPolygon区域计算Swift》
《ios – MKPolygon区域计算Swift》

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

编辑:更新,以便计算也考虑线上的点作为聚合物内部.

点赞