2011-04-07 31 views
2

我想我會在做這件事情之前先問這個問題。我谷歌搜索和StackOverflowed周圍,找不到任何東西。 MapKit善於在MKMapView上繪製區域形狀,CoreLocation擅長告訴你從CLLocation到CLLocation的距離,但兩者都不是我所需要的。是否有iOS API用於處理地圖上的區域並計算交叉點,區域等?

我基本上希望能夠在10米半徑的地圖上放下一個點,並知道是否有任何東西(也有半徑10米),並且會與第二個放下的東西的區域相交。我希望能夠以平方米的方式獲得所有這些點的總面積,這很容易,但可以糾正重疊的圓。

感謝您的幫助。

回答

2

有幾個資源,你會想看看。

首先,Mapkit有一些幫助函數用於處理MKMapRect結構。他們將幫助您在區域和MKMapRects等之間進行轉換。看到他們在這裏: http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html%23//apple_ref/doc/uid/TP40008209

其次,做你想做的幾何計算(半徑,面積,等等),你可能想要這個:http://trac.osgeo.org/geos/

很難被編譯爲iOS,但可以辦到。一個好的地方,看看它編譯將與空間項目。 Spatialite取決於地理位置,並且人們已經編譯iOS的空間。在這裏看到: how to compile spatialite for iOS

[編輯] 事實上,一旦閱讀您的問題更長時間後,你可能只是想使用Spatialite獨自不用擔心GEOS。您將不得不將數據存儲在設備上的數據庫中。這樣做將允許您構建SQL查詢,以回答您所問的問題。

+0

我真的最終迴避了這個問題,但感謝fo你的回覆。我將爲未來的項目記住這些資源。 – 2011-05-19 08:49:31

1

我寫了這個函數,它取兩個圓的中心x,y和半徑並返回交集區域。

public func circlesIntesectionArea(x1 x1: Double, y1: Double, r1: Double, x2: Double, y2: Double, r2: Double) -> Double { 

    let d: Double = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2)) // distance between circles center 

    let dd: Double = pow(d, 2) 
    let rr1: Double = pow(r1, 2) 
    let rr2: Double = pow(r2, 2) 

    if d > r2 + r1 { return 0.0 } // no overlap 
    if d <= abs(r1 - r2) { 
     if r1 >= r2 { return M_PI * rr2 } //Circle2 inside circle1 
     else { return M_PI * rr1 } //Circle1 inside circle2 
    } else { 
     let phi: Double = acos((dd + rr1 - rr2)/(2 * r1 * d)) * 2; // circle1 sector angle 
     let area1: Double = (phi * rr1)/2 - (rr1 * sin(phi))/2; // sector1 area - triangle1 area 

     let theta: Double = acos((dd + rr2 - rr1)/(2 * r2 * d)) * 2; // circle2 sector center angle 
     let area2: Double = (theta * rr2)/2 - (rr2 * sin(theta))/2; // sector2 area - triangle2 area 

     let intersectionArea: Double = area1 + area2; 
     return isnan(intersectionArea) ? 0.0 : intersectionArea; //isnan == no overlap 
    } 
} 

半徑不能在這裏米或英里,所以,如果你有一個circularRegion你必須把它轉換爲MKCoordinateRegion:

let region1 = MKCoordinateRegionMakeWithDistance(circularRegion.center, circularRegion.radius, circularRegion.radius) 

然後:

if circlesIntesectionArea(x1: region1.center.longitude, y1: region1.center.latitude, r1: region1.span.latitudeDelta, 
          x2: region2.center.longitude, y2: region2.center.latitude, r2: region2.span.latitudeDelta) == 0.0 { 
    print("No overlapping") 
} else { 
    print("Overlapping") 
} 

我知道這是一個古老的問題,但可能有人會發現這個有用無論如何...