经纬度转凯立德 K 码

由于GPS信号位置均是经纬度球面坐标,国家从安全角度考虑不允许直接引用,因此凯立德为了方便导航者易于导航,就把经纬度坐标网格化,每一个网格单位代表纵横向0.1秒。

K码的具体格式如下:

1. K码是9位码;

2. K码将地图分成了四块进行编码,中心点在内蒙的阿拉善左旗境内;经纬度是东经105度0分0秒;北纬40度0分0秒

3. 以该点为中心分别在东西方向和南北方向画一条线当横纵(XY)坐标轴,那么第一象限(即东北方向的那块)的K码的第1位是5,第2、3、4象限的K码的第一位分别是6、7、8。

4. K码的第2-5位表示东西方向上的坐标,第6-9位代表南北方向上的坐标。

5. K码是一个凯立德特有的34进制数,(在KLD K码输入界面有说明:26个字母加10个阿拉伯数字,再去掉不用的L和O共34个字符),这个34进制数从左向右从低位向高位排列

6. 中心点的K码有4个,分别是500000000、6uy1y0000、7uy1yuy1y、80000uy1y。分别代表原点或中心点四个象限的K码。及X、Y轴正方向起始坐标0秒或代码为0000,X、Y轴负方向最大坐标为1260000秒或代码为uy1y

VC++的代码如下:

KCode.h

 1 #ifndef _KLD_K_CODE_CALC_H_
 2 #define _KLD_K_CODE_CALC_H_
 3
 4 typedef struct{
 5     int iIndex;
 6     TCHAR cKCode;
 7 }MyKCode_T;
 8
 9 #define KLD_KCODE_SYSTEM            34
10 #define KOCDE_MAX_LENGTH            4
11 #define KCODE_CENTER_LAT            (40.0)
12 #define KCODE_CENTER_LON            (105.0)
13 #define KCODE_X_Y_MAX_NAGATIVE      1260000
14
15
16 BOOL ConvertDuFenMiaoToDu(double dLatLonDu,double dLatLonFen,double dLatLonMiao,double &dLatLon);
17 BOOL ConvertTo34System(DWORD dwNumber,TCHAR *pKCode,BOOL bNegative);
18 BOOL ConvertTo34System2(DWORD dwNumber,TCHAR *pKCode,BOOL bNegative);   // 与 ConvertTo34System 功能相同,采用对照表的方式实现
19
20 BOOL KCodeToZeroPoint(double dLat,double dLon,TCHAR *pKCode,int iKCodeSize);
21
22 /*
23 调用示例:
24 double dLon = 0.0;
25 double dLat = 0.0;
26 TCHAR cTmpBuffer[2 * KOCDE_MAX_LENGTH + 2];
27
28 ZeroMemory(cTmpBuffer,sizeof(TCHAR) * (2 * KOCDE_MAX_LENGTH + 2));
29 ConvertDuFenMiaoToDu(101.0,7.0,26.33,dLon);
30 ConvertDuFenMiaoToDu(29.0,39.0,51.76,dLat);
31 // ConvertDuFenMiaoToDu(40.0,0.0,0.0,dLat);     // 坐标轴上的点测试
32 KCodeToZeroPoint(dLat,dLon,cTmpBuffer,2 * KOCDE_MAX_LENGTH + 2);
33 */
34
35 #endif  

源代码:

KCode.cpp

  1 #include "stdafx.h"
  2 #include "KCode.h"
  3
  4 MyKCode_T gMyKCode[KLD_KCODE_SYSTEM] =
  5 {
  6     {0, ‘0‘},
  7     {1, ‘1‘},
  8     {2, ‘2‘},
  9     {3, ‘3‘},
 10     {4, ‘4‘},
 11     {5, ‘5‘},
 12     {6, ‘6‘},
 13     {7, ‘7‘},
 14     {8, ‘8‘},
 15     {9, ‘9‘},
 16     {10,‘a‘},
 17     {11,‘b‘},
 18     {12,‘c‘},
 19     {13,‘d‘},
 20     {14,‘e‘},
 21     {15,‘f‘},
 22     {16,‘g‘},
 23     {17,‘h‘},
 24     {18,‘i‘},
 25     {19,‘j‘},
 26     {20,‘k‘},   // no L
 27     {21,‘m‘},
 28     {22,‘n‘},   // no character O
 29     {23,‘p‘},
 30     {24,‘q‘},
 31     {25,‘r‘},
 32     {26,‘s‘},
 33     {27,‘t‘},
 34     {28,‘u‘},
 35     {29,‘v‘},
 36     {30,‘w‘},
 37     {31,‘x‘},
 38     {32,‘y‘},
 39     {33,‘z‘},
 40 };
 41
 42 BOOL ConvertDuFenMiaoToDu(double dLatLonDu,double dLatLonFen,double dLatLonMiao,double &dLatLon)
 43 {
 44     BOOL bRet = TRUE;
 45
 46     // 输入有效性判断
 47     {
 48     }
 49
 50     dLatLon = dLatLonDu + (dLatLonFen + (dLatLonMiao / 60.0)) / 60.0;
 51
 52     return bRet;
 53 }
 54
 55 BOOL ConvertTo34System2(DWORD dwNumber,TCHAR *pKCode,BOOL bNegative)
 56 {
 57     BOOL bRet = TRUE;
 58     DWORD dwDivideBy34 = dwNumber;
 59     int iModeOf34 = 0;
 60     int iCount = 0;
 61     int i = 0;
 62
 63     // dwDivideBy34 = 1260000;
 64
 65     do
 66     {
 67         iModeOf34 = dwDivideBy34 % 34;
 68         dwDivideBy34 = dwDivideBy34 / 34;
 69
 70         for(i = 0;i < KLD_KCODE_SYSTEM;i++)
 71         {
 72             if(iModeOf34 == gMyKCode[i].iIndex)
 73             {
 74                 pKCode[iCount] = gMyKCode[i].cKCode;
 75                 iCount++;
 76                 if(1 == iCount && bNegative)
 77                 {
 78                     pKCode[0]--;
 79                 }
 80
 81                 break;
 82             }
 83         }
 84
 85     }while(dwDivideBy34 > 0);
 86
 87     return bRet;
 88 }
 89
 90 BOOL ConvertTo34System(DWORD dwNumber,TCHAR *pKCode,BOOL bNegative)
 91 {
 92     BOOL bRet = TRUE;
 93     DWORD dwDivideBy34 = dwNumber;
 94     int iModeOf34 = 0;
 95     int iCount = 0;
 96
 97     do
 98     {
 99         iModeOf34 = dwDivideBy34 % 34;
100         dwDivideBy34 = dwDivideBy34 / 34;
101
102         if(iModeOf34 <= 9)
103         {
104             pKCode[iCount] = ‘0‘ + iModeOf34;
105         }
106         else if(iModeOf34 >= 10 && iModeOf34 <= 20)
107         {
108             pKCode[iCount] = ‘a‘ + (iModeOf34 - 10);
109         }
110         else if(iModeOf34 >= 21 && iModeOf34 <= 22)
111         {
112             pKCode[iCount] = ‘m‘ + (iModeOf34 - 21);
113         }
114         else if(iModeOf34 >= 23 && iModeOf34 <= 33)
115         {
116             pKCode[iCount] = ‘p‘ + (iModeOf34 - 23);
117         }
118         iCount++;
119         if(1 == iCount && bNegative)
120         {
121             pKCode[0]--;
122         }
123
124     }while(dwDivideBy34 > 0);
125
126     return bRet;
127 }
128
129 /*
130  * 说明: iKCodeSize 的大小包含最后的 NULL
131 */
132 BOOL KCodeToZeroPoint(double dLat,double dLon,TCHAR *pKCode,int iKCodeSize)
133 {
134     BOOL bRet = TRUE;
135     DWORD dwTmpLat = 0;
136     DWORD dwTmpLon = 0;
137     BOOL bIsNegative = FALSE;
138     TCHAR pKCodeLat[KOCDE_MAX_LENGTH + 1];
139     TCHAR pKCodeLon[KOCDE_MAX_LENGTH + 1];
140
141     // 输入有效性判断
142     {
143         if(iKCodeSize < (2 * KOCDE_MAX_LENGTH + 1))
144         {
145             return bRet;
146         }
147         if(NULL == pKCode)
148         {
149             bRet = FALSE;
150             return bRet;
151         }
152     }
153
154     ZeroMemory(pKCodeLat,sizeof(TCHAR) * (KOCDE_MAX_LENGTH + 1));
155     ZeroMemory(pKCodeLon,sizeof(TCHAR) * (KOCDE_MAX_LENGTH + 1));
156
157     if(NULL != pKCodeLat)
158     {
159         double dDiff = (dLat - KCODE_CENTER_LAT);
160
161         if(dDiff < 0)
162         {
163             bIsNegative = TRUE;
164             dDiff = -dDiff;
165             dwTmpLat = (DWORD)((dDiff * 3600) * 10);        // 以 0.1 秒为单位
166             dwTmpLat = KCODE_X_Y_MAX_NAGATIVE - dwTmpLat;
167         }
168         else
169         {
170             bIsNegative = FALSE;
171             dwTmpLat = (DWORD)((dDiff * 3600) * 10);        // 以 0.1 秒为单位
172         }
173         ConvertTo34System(dwTmpLat,pKCodeLat,bIsNegative);
174     }
175
176     if(NULL != pKCodeLon)
177     {
178         double dDiff = (dLon - KCODE_CENTER_LON);
179
180         if(dDiff < 0)
181         {
182             bIsNegative = TRUE;
183             dDiff = -dDiff;
184             dwTmpLon = (DWORD)((dDiff * 3600) * 10);        // 以 0.1 秒为单位
185             dwTmpLon = KCODE_X_Y_MAX_NAGATIVE - dwTmpLon;
186         }
187         else
188         {
189             bIsNegative = FALSE;
190             dwTmpLon = (DWORD)((dDiff * 3600) * 10);        // 以 0.1 秒为单位
191         }
192         ConvertTo34System(dwTmpLon,pKCodeLon,bIsNegative);
193     }
194
195     if(KCODE_CENTER_LAT == dLat || KCODE_CENTER_LON == dLon)
196     {
197         if(KCODE_CENTER_LAT == dLat && KCODE_CENTER_LON == dLon)
198         {
199             pKCode[0] = ‘5‘;
200         }
201         else if(KCODE_CENTER_LAT == dLat)
202         {
203             if(dLon > KCODE_CENTER_LON)
204             {
205                 pKCode[0] = ‘6‘;
206             }
207             else
208             {
209                 pKCode[0] = ‘8‘;
210             }
211         }
212         else if(KCODE_CENTER_LON == dLon)
213         {
214             if(dLat > KCODE_CENTER_LAT)
215             {
216                 pKCode[0] = ‘5‘;
217             }
218             else
219             {
220                 pKCode[0] = ‘7‘;
221             }
222         }
223     }
224     else
225     {
226         if(dLat > KCODE_CENTER_LAT)
227         {
228             if(dLon > KCODE_CENTER_LON)
229             {
230                 pKCode[0] = ‘5‘;
231             }
232             else
233             {
234                 pKCode[0] = ‘6‘;
235             }
236         }
237         else
238         {
239             if(dLon > KCODE_CENTER_LON)
240             {
241                 pKCode[0] = ‘8‘;
242             }
243             else
244             {
245                 pKCode[0] = ‘7‘;
246             }
247         }
248     }
249     wcscat_s(pKCode,iKCodeSize,pKCodeLon);
250     wcscat_s(pKCode,iKCodeSize,pKCodeLat);
251     printf("K Code is: %s\r\n",pKCode);
252
253     return bRet;
254 }  

说明:以下是后补的:

 1 // P76-P79行和P119-P122行存在边界值错误的问题。
 2 // 修改为:
 3 if(1 == iCount && bNegative)
 4 {
 5     if(0 == pKCode[0])
 6     {
 7         pKCode[0] = ‘z‘;
 8     }
 9     else if(‘a‘ == pKCode[0])
10     {
11         pKCode[0] = ‘9‘;
12     }
13     else if(‘m‘ == pKCode[0])
14     {
15         pKCode[0] = ‘k‘;
16     }
17     else if(‘p‘ == pKCode[0])
18     {
19         pKCode[0] = ‘n‘;
20     }
21     else
22     {
23         pKCode[0]--;
24     }
25 }
26 // 但此算法只是猜的,不知真正的实现是否是样。
27 // 有待后继实际数值来验证。
时间: 2024-11-02 23:23:12

经纬度转凯立德 K 码的相关文章

拿到凯立德 小米要给车联网下个定义

几乎可以将此视为又一个小米手环形态,拥有同行所有功能但价格低到极点.匹配小米手机而形成更广大应用.植入小米应用生态圈,逐步拓展出各种O2O场景,一旦装车量巨大,则小米模块将成为O2O各种服务的必选植入内容. 文/张书乐 刊载于<计算机应用文摘>2014年第24期 当10月份小米全资子公司以8400万入股凯立德之时,业内的声音大多集中在一直做硬件的小米,想要用地图作为入口,真正切入到软件世界里,收复当年米聊被微信驱逐后的失地.可答案真的这么简单吗? 拿下凯立德 只为O2O? 雷军作为一个极其智慧

皮克斯的能力受到了家 会更好凯立德

http://www.houzz.com/ideabooks/38903913/thumbs/ http://www.houzz.com/ideabooks/38903914/thumbs/ http://www.houzz.com/ideabooks/38903916/thumbs/ http://www.houzz.com/ideabooks/38903917/thumbs/ http://www.houzz.com/ideabooks/38903921/thumbs/ http://www

一个IT人的立功,立言,立德三不朽

最近几个月很忙,忙着当奶爸,忙着做加班狗,忙着补裤裆学知识……以至于快忘了要思考程序人生了! 古人立志追求“立功”,“立言”,“立德”,以求不朽,为后世所景仰,为子孙所崇拜. 原文地址:https://www.cnblogs.com/andy-songwei/p/12074742.html

【程序人生】一个IT人的立功,立言,立德三不朽

最近几个月很忙,忙着当奶爸,忙着做加班狗,忙着补裤裆学技术……以至于快忘了要思考人生了! 古人立志穷极一生追求“立德”,“立功”,“立言”,以求不朽,为万世所景仰,为后人所传颂,实现人生的意义.立德者,为生民立命,为天地立心:如周公旦,周公吐哺,天下归心:如苏武,北海牧羊.持节不屈:如诸葛亮,鞠躬尽瘁,死而后已:如周恩来,克己奉公,爱民如子.立功者,为万世开太平:如秦始皇,横扫六合,书同文,车同轨:如汉武帝,开疆扩土,大汉扬威:如唐太宗,大唐盛世,光芒万丈:如毛主席,开天辟地,恢复中华.立言者,

IT人的立功,立言,立德三不朽

最近几个月很忙,忙着当奶爸,忙着做加班狗,忙着补裤裆学技术……以至于快忘了要思考人生了! 古人立志穷极一生追求“立德”,“立功”,“立言”,以求不朽,为万世所景仰,为后人所传颂,实现人生的意义.立德者,为生民立命,为天地立心:如周公旦,周公吐哺,天下归心:如苏武,北海牧羊.持节不屈:如诸葛亮,鞠躬尽瘁,死而后已:如周恩来,克己奉公,爱民如子.立功者,为万世开太平:如秦始皇,横扫六合,书同文,车同轨:如汉武帝,开疆扩土,大汉扬威:如唐太宗,大唐盛世,光芒万丈:如毛主席,开天辟地,恢复中华.立言者,

【转】高通平台android 环境配置编译及开发经验总结

原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流程分析 qcril 流程分析,设置sim卡锁 python scons 语法学习 Python 语言之 scons 工具流程分析: 1.2 搭建高通平台环境开发环境 高通and

2016中国APP分类排行榜参选入围产品公示

2016中国APP分类排行榜参选入围产品公示 由中国科学院<互联网周刊>.中国社会科学院信息化研究中心.eNet硅谷动力共同主办的2016中国APP分类排行榜发布暨颁奖晚宴即将举行.此次颁奖晚宴主题是:惊喜的构想只需要1分钟,而惊人的产品却需要许多共性内涵--天下高见,多有相合.此次将要发布的APP分类排行榜,深刻剖析市场动态,解读新时代创新定义,分析用户真实需求,从不同的角度以产品实例为众人作答.以下为迄今的入围产品名单(注:现仍在查遗补缺中). 2016中国APP分类排行榜参选入围产品公示

20150311+微信-02

五.微信的3大发送接口 1.文本消息回复接口 文本XML模板 参考实例代码: 1)组装XML 2)使用文本消息回复 2.音乐回复接口 1)音乐消息接口XML模板: 2)使用音乐接口发送消息 效果: 扩展案例:在线音乐平台(作业) 思路: 关键词:音乐(文本消息接口) 如果是音乐回复,那么必须采用音乐回复接口: 重点有4个参数:标题\描述\标准链接\高清链接 3.图文接口(重点) 1)创建图文接口模板信息 2)使用单图文消息回复 3)使用多图文消息回复 效果如下: 六.订阅接口 微信5秒: 订阅接

ios开发 app的分类

移动应用目前主要有哪些分类?其实,移动应用的范畴甚是广泛.其中,移动客户端.APP客户端,APP软件开发等.龙腾天下认为这仅是移动应用的一部分! 什么是移动应用? 移动应用MobileApplication的缩写是:MA.广义移动应用包含个人以及企业级应用.狭义移动应用指企业级商务应用.简而言之,移动应用是指能够将我们的生活搬到移动WAP手 机上用移动程序来完成操作的应用. 移动应用程序从表现形式上,分为以下几类: 1.APP客户端形式在手 机上安装完方可使用,未来主要在iOS/Android