1

我正在开发一个从 API 加载位置的地图应用程序。我已经编写了代码,因此当用户平移很长一段距离时,会在 API 中查询 x 公里内的位置,并替换注释。

我正在为 iOS 编写代码,但这适用于任何地图应用程序。

在这一点上一切正常,但我对我的算法很不满意,因为我的算法是什么显着距离,以及要加载的位置半径。我正在考虑的一些事情-

  • 地图视图是一个长方形,比宽高。
  • 在 x 公里内加载位置会给你一个圆圈
  • 用户可以放大和缩小
  • 用户可以平移 N,S,E,W
  • 每次小的视图变化都重新加载会导致糟糕的用户体验 - 需要有一个阈值
  • 应该有视图之外的位置,以便用户在重新加载之前可以平移和缩放到一定程度
  • 给定一个圆内的矩形,向上或向下平移的用户将比左右平移时更早到达圆的边缘
  • 为了节省资源,当缩小得太宽时,并非所有位置都显示出来,因此放大可能会显示新位置
  • 缩小将显示新位置

关于我应该做什么样的算法有什么建议吗?我正在寻找确定以下变量 -

  • 加载给定屏幕宽度的位置半径
  • 重新加载点之前的变化阈值(平移和缩放)
4

1 回答 1

1

栅格地图的常见解决方案是将图像切割成图块并加载“靠近”查看器的图块。您可以通过在平移/缩放后加载其他点而不删除那里的内容来为您的数据执行此操作。如果您用于检索新点的代码在后台线程中运行,则用户不会注意到,并且每次平移时,他们总是会出现在已经有数据的地方,而当他们看到您去加载更多数据时为他们的下一个平底锅。你需要计算出他们一次能走多远。经度很简单,只需取纵向差异(即左右),这就是他们可以拖动手指和地图的距离。因此,如果您的地图视图是 1 度宽,您应该已经拥有地图右侧 1 度和地图左侧 1 度的数据。纬度更难,因为它会随着您远离赤道而改变。如果您在看苏格兰,则从上到下会有不同的测量值。不过原理是一样的。计算出用户可以在 1 次拖动中滚动多远并预加载该数据。如果您将 3x3 网格想象成电话垫。地图视图位于 5 按钮处,您需要预先加载所有环绕按钮。地图视图被拖到一边,因此它现在正在查看您需要加载的额外正方形中的 6 个正方形,而不会丢失屏幕上的数据。您可以向右侧、上方和右侧、右侧上方和右侧下方发出三个呼叫。或打一个电话,一次通话即可获取所有新数据。再看苏格兰。不过原理是一样的。计算出用户可以在 1 次拖动中滚动多远并预加载该数据。如果您将 3x3 网格想象成电话垫。地图视图位于 5 按钮处,您需要预先加载所有环绕按钮。地图视图被拖到一边,因此它现在正在查看您需要加载的额外正方形中的 6 个正方形,而不会丢失屏幕上的数据。您可以向右侧、上方和右侧、右侧上方和右侧下方发出三个呼叫。或打一个电话,一次通话即可获取所有新数据。再看苏格兰。不过原理是一样的。计算出用户可以在 1 次拖动中滚动多远并预加载该数据。如果您将 3x3 网格想象成电话垫。地图视图位于 5 按钮处,您需要预先加载所有环绕按钮。地图视图被拖到一边,因此它现在正在查看您需要加载的额外正方形中的 6 个正方形,而不会丢失屏幕上的数据。您可以向右侧、上方和右侧、右侧上方和右侧下方发出三个呼叫。或打一个电话,一次通话即可获取所有新数据。地图视图位于 5 按钮处,您需要预先加载所有环绕按钮。地图视图被拖到一边,因此它现在正在查看您需要加载的额外正方形中的 6 个正方形,而不会丢失屏幕上的数据。您可以向右侧、上方和右侧、右侧上方和右侧下方发出三个呼叫。或打一个电话,一次通话即可获取所有新数据。地图视图位于 5 按钮处,您需要预先加载所有环绕按钮。地图视图被拖到一边,因此它现在正在查看您需要加载的额外正方形中的 6 个正方形,而不会丢失屏幕上的数据。您可以向右侧、上方和右侧、右侧上方和右侧下方发出三个呼叫。或打一个电话,一次通话即可获取所有新数据。

当然,如果您获取新数据的调用有点慢,并且用户可能会在您收到答案之前平移两次,那么您可能需要获取更大的区域。因此,您将位于 5x5 网格的中心,当视图移向边缘时,您必须获取另一行或另一列。

我希望这会有所帮助。

于 2013-06-04T20:54:59.093 回答