是否有 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一年