代码之家  ›  专栏  ›  技术社区  ›  SeaFuzz

在javascript中获得16个可用位

  •  2
  • SeaFuzz  · 技术社区  · 8 年前

    我最近遇到了一个YouTube视频,讨论使用空间填充曲线处理GPS坐标。有一个公式来实现这一点,所以我决定尝试复制它,但是我还没能找到如何使用JavaScript获得相同的结果。

    公式如下:

    缩放纬度和经度以使用16个可用位:

    scaled_x = (-122.4012 + 180) / 360 * 2 ^ 16   // result = 10485
    scale_y = (37.7839 + 90) / 180 * 2 ^ 16       // result = 46524
    

    Video Reference


    我尝试了几种编写公式的方法,结果与基于演示文稿中显示的内容的结果相差甚远。要么是报告不准确,要么是我没有找到正确的方法。

    我的一些尝试都失败了。

    使用战俘

    base = Math.round((lat + 180) / 360);
    scale = Math.pow(base * 2, 16); // Result = 0
    

    精确公式

    base = Math.round((lat + 180) / 360 * 2 ^ 16); // Result = 16
    

    内联功率

    base = Math.round((lat + 180) / 360 * Math.pow(2, 16)); // Result = -22282
    

    有人知道这个公式需要用javascript来构造才能得到预期的结果吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   gone    8 年前
    base = Math.round((lat + 180) / 360);
    scale = Math.pow(base * 2, 16)
    

    这不起作用,因为在将该值乘以2之前,需要将其舍入 十六 --所以它将舍入到0或1。这不是你想要的。

    base = Math.round((lat + 180) / 360 * 2 ^ 16); 
    

    在javascript和许多其他语言中-- ^ 用于按位异或,而不是指数运算。 2 ^ 16 是18岁,不是65536岁。

    base = Math.round((lat + 180) / 360 * Math.pow(2, 16));
    

    这看起来是对的。你引用的结果不适合 lat = -122.4012 不过,你有没有把 + 180 也许吧?