【问题标题】:Geocoding know if location is near another locations in database地理编码知道位置是否靠近数据库中的另一个位置
【发布时间】:2016-07-28 20:47:47
【问题描述】:

好的,我有一个包含许多位置记录的数据库(存储纬度和经度)。
当新的潜在记录出现时,我需要检查 - 如果它与任何现有记录的距离小于 50 米 - 我不应该将其包含在数据库中。

我知道可以计算两个位置之间的距离。
但为了做到这一点,我需要从我的数据库中提取 all 记录,然后在循环中将潜在记录与每个现有记录进行比较。我想这需要一些时间。

我想要一些三角洲,我可以在其上增加/减少潜在记录的纬度和经度 - 那个三角洲会给我 50 米的距离半径。

例如,我想要这样的东西:

    public boolean needsToBeIncluded(double newLat, double newLng) {
        int delta = 0;
        Cursor c = sqLiteDatabase.rawQuery("SELECT * FROM myLocations WHERE latitude between " + (newLat - delta) + " and " + (newLat + delta) +
                " AND longitude between "  + (newLng - delta) + " and " + (newLng + delta), null); 
        return c.getCount() > 0;
    }

有没有可能,或者我对纬度和经度的想象有误?谢谢。

【问题讨论】:

  • 您绝对可以根据您所在位置的区域/区域获得增量,这为您提供了大约 50x50 米的网格,然后您只需要检查网格内的这些点。
  • 请给我更多信息 - 如何根据地区计算此类增量?谢谢。
  • 您需要知道所有现有点的最小和最大lat 值,因为lat 的每个度数转换为大约 111 公里,而不管lon,但每个度数的距离lon 取决于lat(即在赤道更长,在北极点为零)。使用nhc.noaa.gov/gccalc.shtml 来查找lon 在最小和最大纬度下的一个度数。然后您可以在最小和最大纬度处获得 50 米的lon deltas。使用两个值中较大的一个。
  • 我明白了。但是我仍然很难实现这一点。如果您愿意为此做一个简短的例子-我会非常感激并将其标记为正确的。当然。另外,是否有一些表格表明每个纬度的每个经度的距离是多少?

标签: android-sqlite gis latitude-longitude geo


【解决方案1】:

您可以计算每个位置记录的geohash 值。比较位置记录的 geohash 值的前缀部分可以确定它们的接近度。这个GIS Stack Exchange entry 有助于解释geohashes,而这个Stack Exchange 条目解释了相邻geohash 单元的准确性——两个geohash 序列开始不同的点决定了它们的delta。

【讨论】:

  • 很好的答案,谢谢,但实际上并不是我想要的。这几乎是我在问题中描述的方法 - 首先获取所有记录,然后在循环中获取到新点的距离。但是您的信息非常有用。
  • 另外,例如,它不允许我将距离确定为 50 米(在第三条链路中,距离约为 19 米和 188 米)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2010-10-28
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
相关资源
最近更新 更多