Java 如何破解谷歌&x27;s多段线算法?

Java 如何破解谷歌&x27;s多段线算法?,java,google-maps,language-agnostic,Java,Google Maps,Language Agnostic,: 你怎么破译这个 可能是反向运行算法;但是我被困在第5步:如果没有初始值,我怎么知道它是正的还是负的?它的编码左移,如果是负的,则反转,例如: 1: 0000_0001 =>0000_0010 2: 0000_0010 =>0000_0100 3: 0000_0011 =>0000_0110 4: 0000_0100 =>0000_1000 5: 0000_0101 =>0000_1010 6: 0000_0110 =>0000_1100 7: 0000_

:

你怎么破译这个


可能是反向运行算法;但是我被困在第5步:如果没有初始值,我怎么知道它是正的还是负的?

它的编码左移,如果是负的,则反转,例如:

1: 0000_0001 =>0000_0010
2: 0000_0010 =>0000_0100
3: 0000_0011 =>0000_0110
4: 0000_0100 =>0000_1000
5: 0000_0101 =>0000_1010
6: 0000_0110 =>0000_1100
7: 0000_0111 =>0000_1110
8: 0000_1000 =>0001_0000

-1: 1111_1111 =>1111_1110 =>0000_0001
-2: 1111_1110 =>1111_1100 =>0000_0011
-3: 1111_1101 =>1111_1010 =>0000_0101
-4: 1111_1100 =>1111_1000 =>0000_0111
-5: 1111_1011 =>1111_0110 =>0000_1001
-6: 1111_1010 =>1111_0100 =>0000_1011
-7: 1111_1001 =>1111_0010 =>0000_1101
-8: 1111_1000 =>1111_0000 =>0000_1111
因此,如果最后一位是
0
,则解码具有正初始值,如果最后一位是
1
,则解码具有负初始值<人力资源>附录:

完整解码演示:

public class Test {
 public static void main(String args[]) {
  for (int point : Decode("_p~iF~ps|U_ulLnnqC_mqNvxq`@",10)) {
   System.out.println(point); // Be aware that point is in E5
  }
 }

 private static java.util.List<java.lang.Integer> Decode(String encoded_polylines, int initial_capacity) {
  java.util.List<java.lang.Integer> trucks = new java.util.ArrayList<java.lang.Integer>(initial_capacity);
  int truck = 0;
  int carriage_q = 0;
  for (int x = 0, xx = encoded_polylines.length(); x < xx; ++x) {
   int i = encoded_polylines.charAt(x);
   i -= 63;
   int _5_bits = i << (32 - 5) >>> (32 - 5);
   truck |= _5_bits << carriage_q;
   carriage_q += 5;
   boolean is_last = (i & (1 << 5)) == 0;
   if (is_last) {
    boolean is_negative = (truck & 1) == 1;
    truck >>>= 1;
    if (is_negative) {
     truck = ~truck;
    }
    trucks.add(truck);
    carriage_q = 0;
    truck = 0;
   }
  }
  return trucks;
 }
}
公共类测试{
公共静态void main(字符串参数[]){
for(int point:Decode(“_p~iF~ps|U ullnqc_mqNvxq`@”,10)){
System.out.println(点);//注意点在E5中
}
}
私有静态java.util.List解码(字符串编码的多段线,int初始容量){
java.util.List trucks=new java.util.ArrayList(初始容量);
int卡车=0;
int carries_q=0;
对于(int x=0,xx=encoded_polylines.length();x>(32-5);
卡车|=_5_位>=1;
如果(是负的){
卡车=~卡车;
}
卡车。添加(卡车);
车厢q=0;
卡车=0;
}
}
返回卡车;
}
}

由于这是一个与语言无关的问题,我将从以下位置添加此PHP解决方案(因为PHP中不存在
运算符):

函数decodePolylineToArray($encoded)
{
$length=strlen($encoded);
$index=0;
$points=array();
$lat=0;
$lng=0;
而($index<$length)
{
$b=0;
$shift=0;
$result=0;
做
{
$b=ord(substr($encoded,$index++)-63;
$result |=($b&0x1f)=0x20);
$dlat=($result&1)~($result>>1):($result>>1));
$lat+=$dlat;
$shift=0;
$result=0;
做
{
$b=ord(substr($encoded,$index++)-63;
$result |=($b&0x1f)=0x20);
$dlng=($result&1)~($result>>1):($result>>1));
$lng+=$dlng;
$points[]=阵列($lat*1e-5,$lng*1e-5);
}
返回$points;
}

更新: 解码指令几乎很简单,为了找到原始值,您可以通过已从ASCII字符转换的每个值的最后一位来计算它是正还是负

例:

步骤5.如果值chunked(chunks of 5)的最后一位为“0x1f”,则该值为负值,应将其反转
例如:
|=($foo&0x1f)虽然这个代码片段可以解决这个问题,但它确实有助于提高您文章的质量。请记住,您是在为将来的读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
function decodePolylineToArray($encoded)
{
  $length = strlen($encoded);
  $index = 0;
  $points = array();
  $lat = 0;
  $lng = 0;

  while ($index < $length)
  {
    $b = 0;
    $shift = 0;
    $result = 0;
    do
    {
      $b = ord(substr($encoded, $index++)) - 63;
      $result |= ($b & 0x1f) << $shift;
      $shift += 5;
    }
    while ($b >= 0x20);
    $dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1));
    $lat += $dlat;

    $shift = 0;
    $result = 0;
    do
    {
      $b = ord(substr($encoded, $index++)) - 63;
      $result |= ($b & 0x1f) << $shift;
      $shift += 5;
    }
    while ($b >= 0x20);

    $dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1));
    $lng += $dlng;

    $points[] = array($lat * 1e-5, $lng * 1e-5);
  }
  return $points;
}