Google map折れ線符号化c++実装


いくつかの資料を調べて、座標点の多くの問題を解決する方法を見つけました.Google mapsのGPolygonクラスは、多数の座標点から変換された折線符号化をロードできるファクトリメソッドfromEncoded()を提供する.Googleは折れ線を符号化するアルゴリズムフォーマットを提供し、以下のようにします.
                        :       ,                。          ,             ,                。        。          ,               。

     
                     base64     ASCII     :            ,        ASCII          63(ASCII   “?”)。                     ,                  ;        1,        ,         。

  ,      ,            (       )。       Base64         ,            。                ,              。        +/- 180  ,    5     (180.00000   -180.00000),       32           。

          (string literal)  ,          。                                。

                。

       :
-179.9832104 
          1e5,   :
-17998321 
            。         ,         :
00000001 00010010 10100001 11110001
11111110 11101101 10100001 00001110
11111110 11101101 01011110 00001111 
      :
11111110 11101101 01011110 00001111 0 
            ,        :
00000001 00010010 10100001 11110000 1 
         5      (      ):
00001 00010 01010 10000 11111 00001 
    5          :
00001 11111 10000 01010 00010 00001 
          ,       0x20       (OR):
100001 111111 110000 101010 100010 000001 
           :
33 63 48 42 34 1 
       63:
96 126 111 105 97 64 
         ASCII    :
`~oia@ 

アルゴリズムの中のいくつかのステップはよく分かりませんが、アルゴリズムに基づいてc++コードを書きました.
#include "stdafx.h"
#include "math.h"
#include "string"
#include "iostream"
//        
int interger(double x)
{
	int y;
	if(x<0)
		y=int(x-0.5);
	else if(x>=0)
		y=int(x+0.5);
	return y;
}
int _tmain(int argc, _TCHAR* argv[])
{
	double col=-179.9832104;//   double ,      ,10     ,float       ,  6     
	int num;
	num=interger(col*100000);		
	int sgn_num;
	//      ,  ,   0
	sgn_num=num<<1;

	if(num<0)
	{
		sgn_num=~(sgn_num);//     
	}

	string result="";
	 //        5     
 
   while(sgn_num>=0x20)
//0x20 ascII         
   {
	   int x;
                  // 0x1f ,     5    
	   x=sgn_num&0x1f;	  
	   //      63
	   x=x|0x20;
                   x=x+63;
                  //char(x)       ASCII  ,  result
	   result+=char(x);
                  //     5 
	   sgn_num>>=5;	   
   }  
   result+=char(sgn_num+63);//     
   cout<<result;
		return 0;
}

 
出力値は、・~oia@