如何在iOS中获取MKPolygon的面积

如何在iOS中获取MKPolygon的面积,ios,overlay,mapkit,polygon,Ios,Overlay,Mapkit,Polygon,如何在iOS中获取MKPolygon或MKOverlay的面积 我已经能够将多边形分解成三角形,并进行一些数学运算以获得面积。但是,对于不规则多边形,该方法不太适用 我想在这里做一些类似“更复杂的案例”的事情: 我希望MapKit有一个更简单的解决方案 谢谢, 蒂姆我通过在多边形中的点上做一个小循环来解决这个问题。对于每3个点,我检查三角形的中心是否在多边形中。如果是“继续”,如果不是,请连接多边形,使多边形中没有倾斜。完成后,获取多边形中的三角形并进行数学运算以获得面积。然后减去删除的三角形

如何在iOS中获取MKPolygon或MKOverlay的面积

我已经能够将多边形分解成三角形,并进行一些数学运算以获得面积。但是,对于不规则多边形,该方法不太适用

我想在这里做一些类似“更复杂的案例”的事情:

我希望MapKit有一个更简单的解决方案

谢谢,
蒂姆

我通过在多边形中的点上做一个小循环来解决这个问题。对于每3个点,我检查三角形的中心是否在多边形中。如果是“继续”,如果不是,请连接多边形,使多边形中没有倾斜。完成后,获取多边形中的三角形并进行数学运算以获得面积。然后减去删除的三角形

希望这对别人有帮助

这是我正在使用的实现

#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;
}
#定义kEarthRadius 6378137
@多边形的实现(面积计算)
-(双)面积{
双面积=0;
NSMutableArray*coords=[[self coordinates]mutableCopy];
[coords addObject:[coords firstObject]];
如果(coords.count>2){
CLLocationCoordination2d p1、p2;
对于(int i=0;i
在Swift 3中:

let kEarthRadius = 6378137.0

extension MKPolygon {
    func degreesToRadians(_ radius: Double) -> Double {
        return radius * .pi / 180.0
    }

    func area() -> Double {
        var area: Double = 0

        var coords = self.coordinates()
        coords.append(coords.first!)

        if (coords.count > 2) {
            var p1: CLLocationCoordinate2D, p2: CLLocationCoordinate2D
            for i in 0..<coords.count-1 {
                p1 = coords[i]
                p2 = coords[i+1]
                area += degreesToRadians(p2.longitude - p1.longitude) * (2 + sin(degreesToRadians(p1.latitude)) + sin(degreesToRadians(p2.latitude)))
            }
            area = abs(area * kEarthRadius * kEarthRadius / 2)
        }

        return area
    }

    func coordinates() -> [CLLocationCoordinate2D] {
        var points: [CLLocationCoordinate2D] = []
        for i in 0..<self.pointCount {
            let point = self.points()[i]
            points.append(MKCoordinateForMapPoint(point))
        }
        return Array(points)
    }
}
让kEarthRadius=6378137.0
扩展多边形{
func度弧度(uu半径:双精度)->双精度{
返回半径*.pi/180.0
}
func区域()->Double{
变量区域:双=0
var coords=self.coordinates()
coords.append(coords.first!)
如果(coords.count>2){
变量p1:CLLocationCoordinate2D,p2:CLLocationCoordinate2D
对于0中的i..[CLLocationCoordinated2D]{
变量点:[CLLocationCoordinate2D]=[]

对于0中的i..@spikerola,swift中的sin函数是否像objective-c中的sinf?是的,现在它与swift 3中的
Double
s一起工作,而不是
Float
s。