【问题标题】:Computing a hash for a street计算街道的哈希值
【发布时间】:2015-04-26 23:00:10
【问题描述】:

我遇到了一点地理定位问题。我有Street {name, lat, long},我希望构造一个散列,为[lat, long] 半径约500-1000m 范围内的特定街道名称返回相同的值。我不太关心哈希的长度。

附加信息:此[lat, long] 将通过移动设备 (GPS) 获得。

编辑:我考虑过从latlong 的末尾截断数字,但这并不能解决像[7.499999, 7.599999] 这样的情况

编辑 2:四舍五入到最接近的百分之一似乎更好,但也会出现一些边缘情况。

你会怎么做?

【问题讨论】:

  • 您所描述的无法完成。具有相同的哈希码是等价关系。但是在某个地方的 500-1000m 范围内是不传递的。
  • @DavidWallace 任何可能不一定 100% 正确的近似值?如果您知道任何可能的改进,请查看我的编辑。

标签: java hash geolocation geocoding geospatial


【解决方案1】:

也许您应该以另一种方式处理问题。我假设您需要一个哈希值,以便更接近指定的经纬度的街道位于顶部。

如果,那么将街道名称、long、lat 放入可比较的对象中

public class Location
{
    String street;
    long longitude;
    long latitude;
}

然后为这个对象创建一个比较器

public class LocationComparator implements Comparator
{
    long someLongitude;
    long someLatitude;

    public LocationComparator(long someLongitude, long someLatitude)
    {
        this.someLongtitude = someLongitude;    
        this.someLatitude = someLatitude;

    }

    public int compare(Location obj1, Location obj2)
    {
        // get distance from obj1 to someLongtitude, someLatitude
        // get distance from obj2 to someLongtitude, someLatitude

        // return -1, 0, 1 accodring to distance for obj1, obj2
    }
}

然后用

对列表进行排序
LocationComparator comparator = new LocationComparator(someLongitude, your someLatitude);
Collections.sort(LocationsList, comparator);

【讨论】:

  • 实际上,这不是用例。我希望能够仅通过名称和坐标来唯一标识一条街道。我知道可以有许多“芝麻街”,但我认为半径约 1 公里内应该只有一条。
  • 啊,好的,nvm,虽然我原以为列表顶部的那条是离你所在位置最近的街道。
  • 但这意味着我从数据存储中检索“街道”,这正是我想要避免的。我不想担心街道是否已经存在于数据存储中,即使存在,我也不想费心检索它。我只是想盲目地存储一个哈希值,然后可以用来检索其他地标。
  • 您可能感兴趣也可能不感兴趣,因为历史原因,我居住的城市包含两条完全独立的街道,都称为维多利亚街,彼此相距不到 1 公里。
【解决方案2】:

我会按照您描述的方式截断 latlong,然后使用

Objects.hash(name, truncatedLat, truncatedLong)

使用latlong 的截断值与仅考虑某些关键位置相同

X    X    X    X

X    X    X    X

X    X    X    X

给定一个三元组(name, lat, long),截断latlong 不能保证得到相同的哈希值,因为这条街道可能靠近多个十字路口X。但是我不认为这是一个问题,因为它只是意味着要在HashMap 中找到一条街道,您可能需要搜索几个最近的十字路口X

【讨论】:

  • @SayoOladeji 我已经阅读了编辑。这个答案有什么问题?大卫华莱士的评论是正确的。根本无法保证每次都获得相同的哈希值。不过,像我描述的那样会起作用。
  • 我以为您可能没有看到 EDIT 2。这个答案本身没有问题。
  • 我已阅读编辑 2。我不明白你的意思。无论您使用什么比例,总会有边缘情况,因为您试图用离散值替换连续空间中的一个点。我只想确保十字架相隔约 500m,然后接受您可能必须搜索搜索,例如,在找到条目之前,可能需要搜索 25 个或更多十字架。
  • 我同意你的观点,总会有边缘情况。我只是想知道是否有可能做出改进(即使它只是将结果提高了 1%)。您的回答和解释很好,非常感谢您抽出宝贵时间提供。
  • 嗯,您的问题在于将您的区域划分为多个补丁,其中每个补丁中的所有位置都具有相同的哈希码。使用截断的值会给你小的矩形补丁。目前尚不清楚您认为哪种方案是对此的“改进”。
猜你喜欢
  • 2014-04-01
  • 2016-06-23
  • 1970-01-01
  • 2017-02-04
  • 2012-04-14
  • 2014-01-14
  • 1970-01-01
  • 2017-10-28
  • 2022-01-04
相关资源
最近更新 更多