Ios MK多边形面积计算Swift

Ios MK多边形面积计算Swift,ios,swift,swift2,mapkit,mkpolygon,Ios,Swift,Swift2,Mapkit,Mkpolygon,我一直在尝试得到一个MKPolygon的计算,我在这里遵循了一些链接,并进行了相应的调整。我似乎无法正确计算平方米。如果需要,我可以提供更多信息 这是我的密码 func polygonArea() -> Double{ var area: Double = 0 var kEarthRadius:Double = 6378137 var coord: NSArray = self.coordinates() if (coord.count > 2){

我一直在尝试得到一个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)"
}
func polygorea()->Double{
变量区域:双=0
var kEarthRadius:Double=6378137
var-coord:NSArray=self.coordinates()
如果(坐标计数>2){
变量p1、p2、p3:CLLocationCoordinated2D
var lowerIndex、middleIndex、upperIndex:Int
对于变量i=0;i
我特别关注这个链接

除了使用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
}
class func polygorea(点:数组)->Double{
变量区域:双=0.0
var j=点数。计数-1

对于var i=0;i这是Objective-C版本。您可以在代码中毫无问题地使用它

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

编辑:已更新,以便计算也将线上的点视为多边形内部。

Swift版本由@AVT发布于:

导入地图工具包
设kEarthRadius=6378137.0
//CLLocationCoordinate2D使用度,但我们需要弧度
func弧度(度:双精度)->双精度{
返回度*M_PI/180
}
func regionArea(位置:[CLLocationCoordinate2D])->Double{
guard locations.count>2其他{返回0}
var面积=0.0
对于0..0中的i?i-1:locations.count-1]
设p2=位置[i]
面积+=弧度(度:p2.经度-p1.经度)*(2+sin(弧度(度:p1.纬度))+sin(弧度(度:p2.纬度)))
}
面积=-(面积*kEarthRadius*kEarthRadius/2)
返回max(area,-area)//为了不担心多边形是顺时针还是逆时针定义的。
}

当前返回的
polygorea()
是什么?另外,
返回区域之后的行将永远不会执行。你应该把它移到return语句的上方。它返回的是什么意思?喜欢这个值吗?我会去掉最后一行。我知道电话断了。例如,现在它返回382838.399394838。谢谢你的回复!是的,价值。你期望的价值是什么?不客气!1439064387.63392是我在13816米的实际面积上得到的,而且我看到没有使用var p3,但我也没有在我提到的链接的计算中看到它。我将检查它,看看它是如何工作的。我感谢你的时间和回应。我会尽快通知你的!!这不起作用,但我正在努力理解这两个点之间的区别。我曾经计算过一次,结果非常接近,但一无所获。我将继续这方面的工作。这真的很接近,我将设置一些坐标并匹配它们。在我把这个标记为答案之前,我想确认一下。非常感谢!我离开了124-125米。你知道为什么吗。我试着比较和整理一些我以前用过的公式,因为地球的恒定半径不是恒定的。地球不是一个完美的球体。我认为125米的面积,大约15x15米,可以忽略不计。
#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;
}
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.
}