【问题标题】:How To Detect A User Is Within Range Of An Annotation如何检测用户在注释范围内
【发布时间】:2016-11-26 16:20:05
【问题描述】:

所以我正在开展一个项目,其中包括在地图周围放置注释的许多用途。注释(这是一个具有更大圆形范围的自定义图像)出现在屏幕上,理想情况下,我希望用户是:

  1. 在注释范围内时通知 和
  2. 如果圆形图钉重叠超过 25%,则不允许在另一个注释范围内放置另一个注释

我认为这是一个非常独特的问题,应该很有趣,有人可以帮忙,所以玩得开心!谢谢大家!

【问题讨论】:

  • 作为通用指针,查找 GeoFencing
  • 或者,更具体地说,使用 MapKit,请查看 Location and Maps Programming Guide 中的 Monitoring Geographical Regions。请注意,我相信您可以使用的区域数量是有限的同时监控,但这是一种可能的方法。但正如其他人所讨论的,正确的解决方案可能只是使用CLLocationdistanceFromLocation 方法。
  • 感谢@Rob 的参与,我现在就看看这个!

标签: ios swift mapkit mkpinannotationview


【解决方案1】:

您可以使用

检查与每个注释的距离
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location

此方法通过追踪来测量两个位置之间的距离 它们之间的一条线,沿着地球的曲率。这 产生的圆弧是平滑曲线,不考虑 两个位置之间的特定高度变化。

更多详情请咨询Link

【讨论】:

  • @user154248 更新
  • 嗯,这可能有效。问题是所有注释坐标都将来自服务器。这意味着将没有恒定的第二组坐标来测量距离。我想知道这是否可以适应某种扫描仪,仅检查屏幕内的注释。
  • 你可以画一个你想要设置的范围的圆圈,最初标记它的中心点,然后每次你从服务器获取新的位置对象时,你使用你的中心位置对象在上面的方法中传递它,然后服务器位置对象。 CLLocationDistance 距离 = [centerInitialLocation distanceFromLocation:serverLocation];
  • 好的,我正在让它工作。如何一次取出范围内的所有引脚?有什么方法可以将Annotation.withReuseIdentifiyer("pin") 之类的东西传递给第二个参数?
  • 或者甚至通过检查注解的标题,因为标题都是一样的
【解决方案2】:

试试这个:

let location = CLLocation(latitude: 1, longitude: 1)//Or user's location
let distance = location.distance(from: anotherLocation)

编辑:

如 cmets 中所述,您想要创建一个等距点。我建议手动这样做:

从用户的位置中减去注释的位置。然后将您的距离添加回原来的距离。例如:

用户的位置 = (1, 1)

注解的位置 = (3, 2)

垂直差为 2

水平差为 1

然后:

(3 + 2, 2 + 1)

你的结果:(5, 3)

现在您将有两个点(您刚刚创建的一个和用户的位置),每个末端都有一个中心点(原始注释)

【讨论】:

  • 我认为位置和距离必须是 var,我想知道我是否可以将距离设置为位置坐标内的注释加上具有特定可重用标识符的容差?也许?
  • 你不需要它们是 vars。每次更新位置时都会调用它(locationDidUpdate 方法)。我根据新观点编辑了我的问题。
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多