Google Maps API 编码折线算法实现

本文介绍了如何使用Google Maps API的编码折线算法来提高地图呈现速度。提供了MFC和标准C实现的经纬度及级别编码算法,并给出了调用示例。算法包括将经纬度和级别转换为二进制,进行分组处理和ASCII编码。通过提供的代码,开发者可以将经纬度坐标和地图级别高效编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                        Google Maps API 编码折线算法实现

 

 

   在Google Maps API二次开发中,我们碰到了编码折线算法问题,通过GPolyline.fromEncoded调用可以有效地提高呈现速度.基于网上现在没有相关的实现,下面我给出编码折线中经纬度和级别算法,以供读者参考. 它用MFC和标准c实现,其它环境请读者自行修改相关代码即可.

 

 

一.   二进制转十进制(8位)

 

inline int BintoDec(char* b)
     {
         int i,j,v;
         v = 0;
         int len = strlen(b);
         if (len < 1) return v;
         i = 0;v = 0; j = 0;
         for (i = len - 1;i >=0 ;i--)
         {
              if (b[i] == '1')
                  v += (int)pow(2,j); 
              j++;
         }
         return v;
    }

 

二.   相关算法

 

1.  经纬度算法

CString polyline_lonlat_encode(double num)
     {
         int  m,i;
         CString s;

   int  d[8];

   char m_buf[8][6];
         int N = 32;
         char buf[256]={0};
         bool is_negative = false;
         double t = num;

    //微调数据,防止数据失真
         t += ((t<1e-8)?-1:1)*1e-8;
         t *= 1e5;
         m = int(t);
         if (m < 0) is_negative = true;

    //十进制转二进制
         for(i = 0;i<N;i++)
        {
             if ((1<<(N - i-1)) & m) 
                   buf[i]='1';
             else
                   buf[i]='0';
        }

   //求反码,并加上后缀1位(负数为1,正数为0)
        if (is_negative) 
        {
             for(i = 0;i<N;i++)
             {
                  if (buf[i]=='0') 
                      buf[i]='1';
                  else
                      buf[i]='0';

        }
        }
        s = buf;
        s += is_negative?"1":"0";
       //去除前端的0,从1开始
        i = s.Find("1",0);
        if (i != -1)
             s = s.Right(s.GetLength() - i);

    else

         s = "0";

   //计算分组(5位一组)

m = s.GetLength()/5;
        if (m*5 <s.GetLength())
             m += 1;
       //对分组数据先xor 0x20(最后一组不用),然后加63
        for(i=0;i<m;i++)
        {
             sprintf(m_buf[i],"%s",s.Right(5));
             if (i == m -1)
                d[i] = BintoDec(m_buf[i])+63;
            else
               d[i] = BintoDec(m_buf[i])+32+63;

        s = s.Left(s.GetLength()-5);
        }

  //转换成ascii
        s ="";
        for(i=0;i<m;i++)
        {
              s += toascii(d[i]);
        }
        return s;
    }

2.  编码级别算法

CString polyline_level_encode(int level)

{
         int  m,i;
         CString s;

    int  d[8];

   char m_buf[8][6];
         int N = 32;
         char buf[256]={0};

         m = level;

   //十进制转二进制
         for(i = 0;i<N;i++)
        {
             if ((1<<(N - i-1)) & m) 
                   buf[i]='1';
             else
                   buf[i]='0';
       }

   //求反码,并加上后缀1位(负数为1,正数为0)
        if (is_negative) 
        {
             for(i = 0;i<N;i++)
             {
                  if (buf[i]=='0') 
                      buf[i]='1';
                  else
                      buf[i]='0';

        }
        }
        s = buf;
       //去除前端的0,从1开始
        i = s.Find("1",0);
        if (i != -1)
             s = s.Right(s.GetLength() - i);

   else

         s = "0";

   //计算分组(5位一组)

   m = s.GetLength()/5;
        if (m*5 <s.GetLength())
             m += 1;
       //对分组数据先xor 0x20(最后一组不用),然后加63
        for(i=0;i<m;i++)
        {
             sprintf(m_buf[i],"%s",s.Right(5));
             if (i == m -1)
                d[i] = BintoDec(m_buf[i])+63;
            else
               d[i] = BintoDec(m_buf[i])+32+63;

        s = s.Left(s.GetLength()-5);
        }

  //转换成ascii
        s ="";
        for(i=0;i<m;i++)
        {
              s += toascii(d[i]);
        }
        return s;
    }    

 

三.   调用说明

 

    AfxMessageBox(" Level: "+polyline_level_encode(16));
          AfxMessageBox("Points (38.5 -120.2),(40.7, -120.95), (43.252, -126.453):  "+

                               polyline_lonlat_encode(38.5)+polyline_lonlat_encode(-120.2) +

                               polyline_lonlat_encode(40.7-38.5)+

                               polyline_lonlat_encode(-120.95+120.2)+

                               polyline_lonlat_encode(43.252-40.7)+

                               polyline_lonlat_encode(-126.453+120.95));


 

四.   相关说明

    1.   编码折线算法格式见http://code.google.com/intl/zh-CN/apis/maps/documentation/polylinealgorithm.html,可以核对调用说明中的呈现结果

    2.   sprintf,toascii,pow等是标准的c函数

 

最后,希望各位多多捧场, 3Q!  我的Email:wxy3064one@163.com

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值