是否有 iOS API 用于处理地图上的区域并计算交叉点、面积等?

Posted

技术标签:

【中文标题】是否有 iOS API 用于处理地图上的区域并计算交叉点、面积等?【英文标题】:Is there an iOS API for working with regions on a map and calculating intersection, area, etc? 【发布时间】:2011-04-07 20:03:42 【问题描述】:

我想在艰难地做之前我会问这个问题。我已经用 Google 搜索和 ***ed 周围并找不到任何东西。 MapKit 擅长在 MKMapView 上绘制区域形状,CoreLocation 擅长告诉您从 CLLocation 到 CLLocation 的直线距离,但两者都不是我所需要的。

我基本上希望能够在半径为 10 米的地图上放置一个点,并知道那里是否已经存在任何东西(其半径也为 10m),并且会与第二个放置物的区域相交。我希望能够以平方米为单位获得所有这些点的总面积,这很容易,但需要对重叠圆圈进行校正。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您会想要查看一些资源。

首先,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 项目。 Spatialite 依赖于地理,人们已经为 iOS 编译了 spatialite。看这里: how to compile spatialite for iOS

[编辑] 实际上,在再次阅读您的问题后,您可能只想使用 Spatialite 而不必单独担心地理问题。您必须将数据存储在设备上的数据库中。这样做可以让您构建类似 SQL 的查询来回答您提出的问题。

【讨论】:

我实际上最终回避了这个问题,但感谢您的回复。我会为未来的项目记住这些资源。【参考方案2】:

我编写了这个函数,它获取两个圆的中心 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
    

此处的半径不能以米或英里为单位,因此,如果您有一个圆形区域,则必须将其转换为 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")

我知道这是一个老问题,但可能有人会觉得这很有用...

【讨论】:

以上是关于是否有 iOS API 用于处理地图上的区域并计算交叉点、面积等?的主要内容,如果未能解决你的问题,请参考以下文章

用于商业用途的维基地图

获取视口两侧的纬度和经度

官方回复在安卓iOS中从app内通过androidamap://等协议唤醒手机上的高德地图app进行导航,高德平台会收费吗?高德地图URI API调用(安卓ios端)是否免费 - 商用5W一年

官方回复在安卓iOS中从app内通过androidamap://等协议唤醒手机上的高德地图app进行导航,高德平台会收费吗?高德地图URI API调用(安卓ios端)是否免费 - 商用5W一年

官方回复在安卓iOS中从app内通过androidamap://等协议唤醒手机上的高德地图app进行导航,高德平台会收费吗?高德地图URI API调用(安卓ios端)是否免费 - 商用5W一年

API.AI 用于 iOS 上的语音识别 [关闭]