GPS坐标:如何舍入到定义的公里数?

GPS coordinates: how to round to a define number of kilometers?

我有一个带有纬度和经度的数据框:

   latitude  longitude

0 -1.621622   8.918919
1 -1.216216   8.648649
2 -1.486486   8.783784
3 -2.027027   8.918919
4 -1.216216   8.648649

我想将坐标四舍五入到定义的公里数 n(介于 5 和 50 之间),这意味着我将获得坐标的子集,每个点之间有 n 公里。

基本上我可以四舍五入到小数点后一位,大约对应11.1公里(http://wiki.gis.com/wiki/index.php/Decimal_degrees):

   latitude  longitude
0      -1.6        8.9
1      -1.2        8.6
2      -1.5        8.8
3      -2.0        8.9
4      -1.2        8.6

但是如果 n 不是 11.1,我该如何实现呢?例如,如果 n = 10。 我尝试了以下公式:

degree_to_km_factor = 1.11
ratio = degree_to_km_factor / n = 0.111
rounded_latitude = (latitude * ratio).round(2) / ratio

这给了我:

        latitude  longitude
0      -1.621622   8.918919
1      -1.171171   8.738739
2      -2.072072   8.918919
3      -2.072072   8.918919
4      -1.621622   8.918919

这样我就可以得到四舍五入到 1/11.1 = 0.09 的纬度和经度点,这对应于 10 公里。 我已经针对 n 的几个值测试了这个公式,它似乎有效,但我不确定它是否正确,而且我没有达到证明它的目的。你知道它是否正确,如果不正确,是否有更好的方法来实现这一点?

注意:我假设我一直在赤道,所以近似值 1 度 = 111 公里在我的情况下总是正确的,我不需要更多比这更精确。

如果你想将度坐标四舍五入到 n 公里的倍数,你必须

  1. 计算以千米为单位的坐标。
  2. 四舍五入为n的倍数。
  3. 将其计算回度坐标。

正如您所说,您的坐标靠近赤道,您可以将操作 1) 和 3) 确定为简单的乘法。

kilometers = degree * 111 # Approximate number of kilometers for 1 degree close to the equator

将任意数四舍五入为n的倍数可以表示为

y = round(x/n) * n

因此将度数舍入到定义的公里数的函数可以表示为:

def round_to_n_km(degree_coordinate, n):
   kilometers = degree_coordinate * 111
   rounded_kilometers = round(kilometers / n) * n
   as_degree = rounded_kilometers / 111
   return as_degree

如果您需要为远离赤道的坐标解决此问题,您可以使用更高级的函数(例如 geopy.distance.distance() 函数)代替乘以 111。

现在,您想知道为什么将度坐标四舍五入到小数点后一位可以四舍五入到大约 11.1 公里。如果你采用上面的公式并将 n 替换为 11.1 你会得到这个

rounded_kilometers = round(kilometers * 11.1) * 11.1
                   = round(degree_coordinate * 111 / 11.1) * 11.1
                   = round(degree_coordinate * 10 ) * 11.1
as_degree = rounded_kilometers / 111
          = round(degree_coordinate * 10) * 11.1 / 111
          = round(degree_coordinate / 0.1) * 0.1 
          # equivalent to rounding to .1 degrees (what you did with latitude*ratio.round(2) )

这就是为什么在靠近赤道的情况下四舍五入到 0.1 度与四舍五入到 11.1 公里大致相同的原因。