Google Maps 折线编码(修改2)

修改地方:输入一组坐标点求编码

#include "stdafx.h"
#include "string"
#include "iostream"
using namespace std;

//四舍五入取整函数
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;
}
//无符号数编码
string encodeNumber(unsigned int sgn_num)
{
	
	string result="";
	 //将该二进制值分为5位一组的块
   while(sgn_num>=0x20)
   {
	   int x;
	   x=sgn_num&0x1f;
	   //进行异或加上63
	   x=x|0x20;
	    x=x+63;
	    result+=char(x);
	   sgn_num>>=5;
	   
	      }
  
   result+=char(sgn_num+63);
  
	return result;
}
//有符号值编码
string encodeSignedNumber(int num)
{
	int sgn_num;
	string result;
	//变换二进制值,左移,地位补0
	sgn_num=num<<1;

	if(num<0)
	{
		sgn_num=~(sgn_num);//对负数求反
	}
	result=encodeNumber(sgn_num);
	return result;

}

int _tmain(int argc, _TCHAR* argv[])
{
	//有符号数,设置成double型,双精度浮点型,10位有效数字,float是单精度浮点型,只有6位有效数字
	//一组数据
	string cl="(38.5,-120.2),(40.7,-120.95),(43.252,-126.453)";
	
	//string.size类型是size_type,不能与int比较,没找到其他方法,所以原字符串后加点东西做比较
	string p=",a";
	string p1="a";
	string result;
	cl+=p;
	double lat,lng;
	
	//设置个初始值
	int lat_x=0,lng_x=0;
	//设置差值
	int lat_y,lng_y;
	while(cl!=p1)
	{
	int w1=cl.find('(');
	int w2=cl.find(',');
	int w3=cl.find(')');
	lat=atof(cl.substr(1,w2-w1-1).c_str());
	lng=atof(cl.substr(w2+1,w3-1).c_str());
	
	int x=interger(lat*100000);
	int y=interger(lng*100000);
	//计算差值
	lat_y=x-lat_x;
	lng_y=y-lng_x;
	//用差值求arscII码
	string latlat,lnglng;
	latlat=encodeSignedNumber(lat_y);	
	result+=latlat;
	
	lnglng=encodeSignedNumber(lng_y);
	result+=lnglng;	
	//重设初值
	lat_x=x;
	lng_x=y;
	cl=cl.substr(w3+2);		
	
	}

    cout<<result<<endl;

	//system函数是用来执行一条dos命令或运行一个外部程序。 pause是暂停,并等待用户按键 
	system("pause");
	return 0;
}

 结果为:_p~iF~ps|U_ulLnnqC_mqNvxq`@           与google提供的例子结果一致

你可能感兴趣的:(C++,c,Google,C#,dos)