nds坐标获取瓦片编号
Eiffel Tower 2.2945° 48.858222° 27374451 582901293 0x1a1b373 0x22be5e2d
nds使用的是WGS84坐标系统(the World Geodetic System dating from 1984),就是平常我们说的经纬度。当我们说一个具体的位置的时候,就说这个问题位置的经度是多少,纬度是多少,这样就可以唯一的定位到一个精确的点。
nds使用EGM96(the Earth Gravitational Model from 1996)来表示高度信息。EGM96描述的高度信息很好的近似海拔高度,它比WGS84中的高度信息更准确。
规定经度使用32位int编码,可表示范围是[-180,180],纬度使用31位int编码,可表示范围是[-90,90]
例: 艾菲尔铁塔的计算如下(Eiffel Tower 2.2945° 48.858222°)
lon = 2.2945
lon_to_int32 = pow(2, 31) * 2.2945 / 180
= 2147483648 * 2.2945 / 180
= 27374451.279644444444444444444444
= 27374451 (使用向下取整法floor)
= 0x1a1b373 (十六进制)
= 0001101000011011001101110011 (二进制)
lat = 48.858222
lat_to_int32 = pow(2, 30) * 48.858222 / 90
= 1073741824 * 48.858222 / 90
= 582901293.41863253333333333333333
= 582901293 (使用向下取整法floor)
= 0x22be5e2d (十六进制)
= 00100010101111100101111000101101 (二进制)
使用莫顿码(morton code)进行编码
x = x31x30...x1x0
y = y30...y1y0
c = x31y30x30...y1x1y0x0 总长度为63(32+31)位
x = 0x1a1b373 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 1 1 0 1 1 1 0 0 1 1
y = 0x22be5e2d 1 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 1
c = 0x809cea967ad1da7 100000001001110011101010100101100111101011010001110110100111
x = 0x1a1b373 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 1 1 0 1 1 1 0 0 1 1 y = 0x22be5e2d 1 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 1 c = 0x809cea967ad1da7 100000001001110011101010100101100111101011010001110110100111
规整为63位 000100000001001110011101010100101100111101011010001110110100111
故该点在Level10的Tile Number为
Level10 = c.left(2n+1) = c.left(2*10+1) = c.left(21) = 0 0010 0000 0010 0111 0011
= 0x20273
= 131699
故该点在Level13的Tile Number为
Level13 = c.left(2n+1) = c.left(2*13+1) = c.left(27) = 000 1000 0000 1001 1100 1110 1010
= 0x809CEA
= 8428778
1 struct NDSPoint {
2 double dLon;
3 double dLat;
4 int32_t nLon;
5 int32_t nLat;
6 uint64_t Morton;
7
8 NDSPoint(double lon, double lat) : dLon(lon), dLat(lat), nLon(0), nLat(0), Morton(0) {
9 nLon = ToNdsLon(dLon);
10 nLat = ToNdsLat(dLat);
11 Morton = ToMortonCode(nLon, nLat);
12
13 printf("xy:[%10.6lf,%10.6lf], nds:[%12d,%12d] Morton:[%24lu]\n", dLon, dLat, nLon, nLat, Morton);
14 15 16 }
17
18 int32_t ToNdsLon(double lon) {
19 bool positive = true;
20 if (lon < 0) {
21 positive = false;
22 }
23 auto t = pow(2, 31) * lon / 180.0;
24 return positive ? std::floor(t) : std::ceil(t);
25 }
26
27 int32_t ToNdsLat(double lat) {
28 bool positive = true;
29 if (lat < 0) {
30 positive = false;
31 lat += 180.0;
32 }
33 auto t = pow(2, 30) * lat / 90.0;
34 return positive ? std::floor(t) : std::ceil(t);
35 }
36
37 uint64_t ToMortonCode(int32_t iLon, int32_t iLat) {
38 uint64_t MortonCode = 0;
39 for (int i = 0; i < 32; i++) {
40 uint64_t uiTmp64 = 0;
41 uiTmp64 = (iLon >> i) & 0x1;
42 uiTmp64 |= ((iLat >> i) & 0x1) << 1;
43 MortonCode |= (uiTmp64 << 2 * i);
44 }
45
46 return MortonCode;
47 }
48 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人