我希望我的应用程序知道用户是否在特定区域内。我一直在学习地理围栏,但我不希望设备不断检查它是否进入或离开一个区域,我只想知道它是否在那个具体时刻就在上面。另外,我读到地理围栏的精度(似乎)很低,而且我需要的不仅仅是蜂窝塔的精度。
所以想法是使用“标准”类型的位置来执行此操作,但我不知道如何在给定新的当前位置的情况下检查它是否在(圆形、矩形、多边形?)区域内。
它可能必须使用纯数学来完成,检查高度是否在 2 个参数之间,以及经度?有没有更简单的方法?
谢谢!
我希望我的应用程序知道用户是否在特定区域内。我一直在学习地理围栏,但我不希望设备不断检查它是否进入或离开一个区域,我只想知道它是否在那个具体时刻就在上面。另外,我读到地理围栏的精度(似乎)很低,而且我需要的不仅仅是蜂窝塔的精度。
所以想法是使用“标准”类型的位置来执行此操作,但我不知道如何在给定新的当前位置的情况下检查它是否在(圆形、矩形、多边形?)区域内。
它可能必须使用纯数学来完成,检查高度是否在 2 个参数之间,以及经度?有没有更简单的方法?
谢谢!
使用 CLLocations 的 distanceFromLocation
这是我的乔丹曲线定理的 Swift 代码。CLLocationCoordinate2D
只需提供一个可以制作正方形、多边形等任何东西的数组。
更深入的答案我翻译自: 如何确定 2D 点是否在多边形内?
原始网站:PNPOLY - 多边形测试中的点包含 W. Randolph Franklin (WRF)
extension CLLocationCoordinate2D {
func liesInsideRegion(region:[CLLocationCoordinate2D]) -> Bool {
var liesInside = false
var i = 0
var j = region.count-1
while i < region.count {
guard let iCoordinate = region[safe:i] else {break}
guard let jCoordinate = region[safe:j] else {break}
if (iCoordinate.latitude > self.latitude) != (jCoordinate.latitude > self.latitude) {
if self.longitude < (iCoordinate.longitude - jCoordinate.longitude) * (self.latitude - iCoordinate.latitude) / (jCoordinate.latitude-iCoordinate.latitude) + iCoordinate.longitude {
liesInside = !liesInside
}
}
i += 1
j = i+1
}
return liesInside
}
}
编辑
安全数组项
extension MutableCollection {
subscript (safe index: Index) -> Iterator.Element? {
get {
guard startIndex <= index && index < endIndex else { return nil }
return self[index]
}
set(newValue) {
guard startIndex <= index && index < endIndex else { print("Index out of range."); return }
guard let newValue = newValue else { print("Cannot remove out of bounds items"); return }
self[index] = newValue
}
}
}
如果您使用 Google Map SDK 并想检查一个点是否在多边形内,您可以尝试使用GMSGeometryContainsLocation
. 如果多边形不是凸的,@Magoo 的答案效果很好。但是如果它是凹的,那么@Magoo 的方法就没有帮助。
if GMSGeometryContainsLocation(point, polygon, true) {
print("Inside this polygon.")
} else {
print("outside this polygon")
}