Cálculo de área de MKPolygon

Estoy tratando de hacer una categoría de cálculo de área para MKPolygon. Encontré un código JS https://github.com/mapbox/geojson-area/blob/master/index.js#L1 con un enlace al algoritmo: http://trs-new.jpl.nasa.gov/dspace / handle / 2014/40409 . Dice: enter image description here

enter image description here

Aquí está mi código, que dio un resultado incorrecto (miles de veces más que el real):

#define kEarthRadius 6378137 @implementation MKPolygon (AreaCalculation) - (double) area { double area = 0; NSArray *coords = [self coordinates]; 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; } @end 

¿Qué me perdí?

El paso final para i = N-1 e i+1 = 0 (ajuste) falta en su ciclo.

El algoritmo completo implementado en Swift 3.0 :

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

Esto puede ayudar a alguien … Debe pasar los puntos de borde de forma en el siguiente método y devuelve el área correcta de un polígono.

 static double areaOfCurveWithPoints(const NSArray *shapeEdgePoints) { CGPoint initialPoint = [shapeEdgePoints.firstObject CGPointValue]; CGMutablePathRef cgPath = CGPathCreateMutable(); CGPathMoveToPoint(cgPath, &CGAffineTransformIdentity, initialPoint.x, initialPoint.y); for (int i = 1;i