【问题标题】:How can I implement a cache of geo-points如何实现地理点缓存
【发布时间】:2016-01-19 07:31:13
【问题描述】:

我正在使用地图服务,给定一个地理圆(由坐标和半径定义),返回该区域的一组地点。我希望缓存此地图服务返回的结果。

我希望我的缓存可以存储两个表:

  • 服务返回的地点列表地点
  • 表格 Circles 区域的位置已缓存在表格 Places 中。

然后,给定一个任意的新圆C,我想有效地测试缓存中C的区域是否被表中的圆完全覆盖圈子。如果 C 被完全覆盖,我有一个缓存命中,我不需要咨询地图服务。如果 C 没有完全覆盖,我必须咨询地图服务并缓存结果。

Q1:如何存储一组地理圆,以便我可以有效地测试它们的区域的并集是否完全覆盖任意新圆?

即使使用 Q1 的解决方案,我也可能会遇到缓存未命中非常轻微的性能问题,并且我向地图服务发出请求,这几乎不会增加我的缓存区域。为了解决这个问题,我希望能够在 C 中找到一个未被圆圈覆盖的示例点,以便将其用作地图服务请求的中心。我将重复这个过程,直到 C 被完全覆盖。

Q2:如何存储地理圆集,以便在它们的区域不完全覆盖给定圆C的情况下,我可以在 C 中有效地生成一个未被覆盖的示例点?

我希望使用 PostgreSQL 和 PostGIS 之类的东西来实现我的缓存,但我欢迎其他建议。

【问题讨论】:

标签: postgresql caching geospatial postgis geo


【解决方案1】:

这是我的 hacky 方法,本质上是“光栅化”。

将地球区域划分为大量但数量有限的小地理块,这些地理块通过在纬度/经度平面上绘制网格来定义。

我们保留了一张 Tiles 表格,而不是 Circles 表格,这些表格的位置已缓存在 Places 表格中。 p>

给定一个地理圆,我们可以高效地生成被圆部分覆盖的地理图块集合,以及被圆完全覆盖的集合。

在将点插入缓存时,我们将每个完全覆盖的图块标记为已缓存。

在探查圆圈C的缓存时,如果C完全或部分覆盖的每个tile都在Tiles表中,我们有缓存命中。否则,我们有一个缓存未命中,以及一个未缓存的示例图块,我们可以从中选择一个点作为圆心向地图服务请求。

这种方法有缺陷:

  • 由于投影变形,地球上的瓷砖大小和形状各不相同。
  • 如果圆太小,它可能无法完全覆盖任何图块,因此永远不会被标记为缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 2011-07-15
    • 1970-01-01
    • 2014-08-14
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多