分组/分桶纬度和经度

Posted

技术标签:

【中文标题】分组/分桶纬度和经度【英文标题】:Grouping/Bucketing latitude and longitude 【发布时间】:2016-11-02 01:53:16 【问题描述】:

这更像是一个逻辑问题而不是技术问题。所以请大家不要举报。

我想在 python 中编写一个方法,它需要两个参数 -> 纬度和经度。此方法应返回组/桶。应该按照0.05度进行分组。

def get_bucket(lat,lng):
  #body

例如:

get_bucket(1.05,1.05) -> b1 get_bucket(1.05,1.03) -> b1

所以这就像假设地球被划分为 0.05 度的方格,并且落在这个方格中的任何纬度/经度都共享同一个桶。

【问题讨论】:

最初的想法是只划分和取地板,但例如0.15 / 0.05 并不完全是 3。乘以 100 并除以 5? 由于地球不是平的,当您接近两极时,您的水桶将逐渐变得更加三角形。这意味着,粗略地说,你最大的桶将是有更多人的地方,如果你的问题域完全受到人口的影响,这可能真的很糟糕。 (当然,如果您只对地球的一小块区域感兴趣,尤其是在该区域位于赤道附近时,这并不重要。) 那么你的问题是什么?你有没有尝试过任何东西?如果您想根据除以 2 的结果将 0 到 1000 之间的所有整数放入桶中,您需要多少桶?如果你能解决这个问题,那么你就可以解决这个问题。 【参考方案1】:

通常有 180 度的纬度(-90 到 90)和 360 度的经度(-180 到 180)。

因此,纬度有 18,000 百度增量(即 -90.00、-89.99、... 89.99、90.00),经度有 36,000 百度增量。

假设你把它放在一个二维数组中。如果您希望增量为 0.05 度,则纬度需要 3,600 (18,000/5) 行,纬度需要 7,200 列 (36,000/5) 行。

因此,您想将经度/纬度转换为两个数组索引。这是一种方法:

    取你的纬度数,它在 -90 到 90 的范围内,然后加上 90。这会给你一个从 0 到 180 的数字。 乘以 100 并向上取整。这会给你一个从 0 到 18,000 的数字。 除以 5。

这是你的行索引。

对经度执行相同操作,但添加 180 以获得 0 到 360 之间的数字。这提供了您的列号。

例子:

德克萨斯州奥斯汀的位置纬度:30.267,液化天然气:-97.743

30.267 + 90 = 120.267
120.267 * 1000 = 12027 (rounded up)
12027 / 5 = 2405

-97.743 + 180 = 82.257
82.257 * 1000 = 8226 (rounded up)
8226 / 5 = 1645

因此德克萨斯州奥斯汀市将进入存储桶 (2450,1645)

当然,将索引转换回纬度和经度只是原始转换的逆过程。对于纬度,乘以 5,除以 1,000,然后减去 90。

【讨论】:

【参考方案2】:

这是一种实现方式:

def get_bucket(lat,lng):
    int(lng/0.05)*(whatever the highest possible lat is)/0.05 + int(lat/0.05)

【讨论】:

这是什么“无论最高纬度是多少” @Juvenik 90 度?这颗行星是球形的。

以上是关于分组/分桶纬度和经度的主要内容,如果未能解决你的问题,请参考以下文章

如何将相同的纬度和经度分组以在画面中显示多个位置

Strava - 具有纬度、经度和时间的团体路线接近度

根据纬度/经度计算密度

特定点附近的所有纬度经度(纬度经度)

GSM小区(经度,纬度),它的扇区和一些物体(经度,纬度)

我需要使用现有的纬度/经度、距离和方向来计算纬度/经度