如何转换为谷歌编码折线算法格式?

use*_*760 3 polyline google-maps-api-3

Google地图的编码折线格式存储纬度/经度信息以及缩放级别.

我有一个带有lat/lon对的巨大文本文件,我想转换为这种格式和折线的不同部分(即我需要执行批量转换)

有谁知道执行此操作的代码?

And*_*ach 7

编码和解码折线的权威性参考由Mark McClure教授撰写,网址http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/

它包含实用程序,对JDL代码的算法和端口的讨论,包括Perl,Ruby,PHP,Java和Mathematica.

注意:对于版本3,您不需要levels版本2所需的字符串.版本3可以自行计算级别.


Ben*_*Ben 5

我不知道你需要什么语言.你可以在这里得到谷歌的一般想法.但是,我发现说明不是100%准确.这是我理解它的方式,使用相同文本中的示例.我用Java实现它,转换为JavaScript或PHP应该很容易.

  public class MapMath {
    private final static double MULTIPLIER = 100000;
    private final static int FIVE_BIT_MASK = 0x1f;

    public MapMath() {
      double[][] coords = new double[][]{
        {-12.422187,130.854922},
          {-12.422445,130.854937},
          {-12.422234,130.854886}
      };

      StringBuilder encodedStrings = new StringBuilder();
      for (int i = 0; i < 3; i++){
        encodedStrings.append(
            encodeCoordinate(coords[i][0]) + 
            encodeCoordinate(coords[i][1]) + "\n"
            );
      }
      System.out.println(encodedStrings);
    }

    private String encodeCoordinate(double coordinate) {
      StringBuilder encodedCoordinate = new StringBuilder();
      boolean hasNext;

      coordinate *= MULTIPLIER;
      int value = (int) coordinate;
      value <<= 1;
      if(coordinate < 0) value = ~value;  

      do {
        int next = (value >> 5);
        hasNext = (next > 0);
        int encVal = value & FIVE_BIT_MASK;
        if(hasNext) encVal |= 0x20;
        encVal += 0x3f;
        value = next;
        encodedCoordinate.append((char)(encVal));
      } while (hasNext);

      return encodedCoordinate.toString();
    } 

    public static double toRadians(double degrees) {
      return (degrees*Math.PI)/180;
    }

    public static void main(String[] args){
      new MapMath();
    }
  }
Run Code Online (Sandbox Code Playgroud)

请注意,连续坐标应该是前一个坐标的偏移量.希望它对您有用,如果需要任何进一步的帮助,请告诉我.