分组/分桶纬度和经度
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 度?这颗行星是球形的。以上是关于分组/分桶纬度和经度的主要内容,如果未能解决你的问题,请参考以下文章