地图投影转换公式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
地面分辨率和地图比例尺之间的关系
缩百度文库级别
1 2 3 4 5
地图宽高(像素)
512 1,024 2,048 4,096 8,192
地面分辨率(米/像素)
78,271.5170 39,135.7585 19,567.8792 9,783.9396 4,891.9698
地图比例尺(96dpi 为例,米/英寸)
tileX = floor(pixelX / 256) tileY = floor(pixelY / 256)
为了简化索引和存储地图图片,每个 tile 的二维 XY 值被转换成一维字串,即四叉树键值 (quardtree key,简称 quadkey)。每个 quadkey 独立对应某个放大级别下的一个 tile,并且 它可以被用作数据库中 B-tree 索引值。为了将坐标值转换成 quadkey,需要将 Y 和 X 坐标二进制 值交错组合,并转换成 4 进制值及对应的字符串。例如,假设在放大级别为 3 时,tile 的 XY 坐标 值为(3,5),quadkey 计算如下:
地理经度的取值范围是[-180,180],纬度不可能到达 90°,通过纬度取值范围 ys 反解计算可 得到纬度值为 85.05112877980659。因此纬度取值范围是 lats。因此,地理坐标系(经纬度) 对应的范围是,最小地理坐标 minPoint,最大地理坐标 maxPoint。
1/8
bbirdsky 笔记
比例尽计算公式
dot = 256 * 2level / 0.0254 / dpi // 地面分辨率 length = (cos(latitude * PI / 180) * 2 * PI * 6378137) // 实际长度 mapscale = dot / length mapscale = 1 : resolution * dpi / 0.0254 // 单位米/英尺 比例尺= 1 : (length * dpi) / (256 * 2level * 0.0254)
经纬度展开计算公式:
r = 6378137
// 地球半径(单位米)
c = 2 * PI * r = 20037508.3427892 * 2
// 地球周长
xs = [-20037508.3427892,20037508.3427892] // x 方向取值范围
ys = [-20037508.3427892,20037508.3427892] // y 方向取值范围
18
67,108,864
0.5972
19
134,217,728 0.2986
20
268,435,456 0.1493
21
536,870,912 0.0746
22
1,073,741,824 0.0373
23
2,147,483,648 0.0187
地图投影公式转换
1 : 9,244,667.36 1 : 4,622,333.68 1 : 2,311,166.84 1 : 1,155,583.42 1 : 577,791.71 1 : 288,895.85 1 : 144,447.93 1 : 72,223.96 1 : 36,111.98 1 : 18,055.99 1 : 9,028.00 1 : 4,514.00 1 : 2,257.00 1 : 1,128.50 1 : 564.25 1 : 282.12 1 : 141.06 1 : 70.53
returnMath.Min(Math.Max(n, minValue), maxValue); } publicstaticuintMapSize(intlevelOfDetail) {
return (uint) 256 <<levelOfDetail; } /// Determines the ground resolution (in meters per pixel) at a specified /// latitude and level of detail.
像素级别计算公式
mapWidth = mapHeight = 256 * 2level pixels
四、地图比例尺(Map Scale)
地图比例尺是指测量相同目标时,地图上距离与实际距离的比例。通过地图分辨率在计算可知 由 Level 可得到图片的像素大小,那么需要把其转换为以米为单位的距离,涉及到 DPI(dot per inch),暂时可理解为类似的 PPI(pixel per inch),即每英寸代表多少个像素。256 * 2level / DPI 即得到相应的英寸 inch,再把英寸 inch 除以 0.0254 转换为米。实地距离仍旧是:length。
三、地面分辨率(Ground Resolution)
地面分辨率是以一个像素(pixel)代表的地面尺寸(米)。以微软 Bing Maps 为例,当 Level 为 1 时,图片大小为 512*512(4 个 256 像素的 Tile),那么赤道空间分辨率为:赤道周长/512。 其他纬度的空间分辨率则为纬度圈长度/512,极端的北极则为 0。Level 为 2 时,赤道的空间分辨
由于赤道半径为 r(6378137 米),则赤道周长为 c(2*PI*r),x 轴的取值范围为 xs。当纬度 φ 接近两极,即 90°时 y 值趋向于无穷。因此通常 y 轴的取值范围与 x 轴相同。因此在墨卡托投影展 开的全局坐标系(米)下的坐标范围是:最小坐标值为 minExtent,最大坐标为 maxExtent。
墨卡托投影以整个世界范围,赤道作为标准纬线,本初子午线作为中央经线,两者交点为坐标 原点,向东向北为正,向西向南为负。南北极在地图的正下、上方,而东西方向处于地图的正右、 左。由于墨卡托投影在两极附近是趋于无限值,因此它并没完整展现了整个世界,地图上最高纬度 是 85.05 度。为了简化计算,我们采用球形映射,而不是椭球体形状。虽然采用 Mercator Projection 只是为了方便展示地图,需要知道的是,这种映射会给 Y 轴方向带来 0.33%的误差。
9
131,072
305.7481
10
262,144
152.8741
11
524,288
76.4370
12
1,048,576
38.2185
13
2,097,152
19.1093
14
4,194,304
9.5546
15
8,388,608
4.7773
16
16,777,216
2.3887
17
33,554,432
1.1943
1 : 295,829,355.45 1 : 147,914,677.73 1 : 73,957,338.86 1 : 36,978,669.43 1 : 18,489,334.72
3/8
bbirdsky 笔记
6
16,384
2,445.9849
7
32,768
1,222.9925
8
65,536
611.4962
墨卡托投影正反解公式
墨卡托投影正解公式:(B,L)→(X,Y),标准纬度 B0,原点纬度 0,原点经度 L0
墨卡托投影反解公式:(X,Y) →(B,L),标准纬度 B0,原点纬度 0,原点经度 L0
公式中 EXP 为自然对数底,纬度 B 通过迭代计算很快就收敛了。 弧度角度的转换公式
弧度转角度: (180* rad)/PI 角度转弧度: PI*((double)degree/180d)
2/8
bbirdsky 笔记
地图投影公式转换
率为赤道周长/1024,其他纬度为纬度圈长度 1024。很明显,地面分辨率(Ground Resolution) 取决于两个参数,缩放级别 Level 和纬度 latitude ,Level 决定像素的多少,latitude 决定地面距 离的长短。
地面分辨率的公式
tileX = 3 = 011(二进制) tileY = 5 = 101(二进制) quadkey = 100111(二进制)= 213(四进制)= “213”
4/8
bbirdsky 笔记
地图投影公式转换
Quadkey 还有其他一些有意思的特性。第一,quadkey 的长度等于该 tile 所对应的放大级别; 第二,每个 tile 的 quadkey 的前几位和其父 tile(上一放大级别所对应的 tile)的 quadkey 相同, 下图中,tile 2 是 tile 20 至 23 的父 tile,tile 13 是 tile 130 至 133 的父级;最后,quadkey 提供的一维索引值通常显示了两个 tile 在 XY 坐标系中的相似性。换句话说,两个相邻的 tile 对应 的 quadkey 非常接近。这对于优化数据库的性能非常重要,因为相邻的 tile 通常被同时请求显示, 因此可以将这些 tile 存放在相同的磁盘区域中,以减少磁盘的读取次数。
五、Bing Maps 像素坐标系和地图图片编码 为了优化地图系统性能,提高地图下载和显示速度,所有地图都被分割成 256 x 256 像素大小
的正方形小块。由于在每个放大级别下的像素数量都不一样,因此地图图片(Tile)的数量也不一 样。每个 tile 都有一个 XY 坐标值,从左上角的(0, 0)至右下角的(2level–1, 2level–1)。例如在 3 级放 大级别下,所有 tile 的坐标值范围为(0, 0)至(7, 7),已知一个像素的 XY 坐标值时,我们很容易得 到这个像素所在的 Tile 的 XY 坐标值:
minExtent = (-20037508.3427892, -20037508.3427892) // 左下角坐标(最小坐标)
maxExtent = (20037508.3427892, 20037508.3427892) // 右上角坐标(最大坐标)
二、地理坐标系(Geographical coordinates)
下面是微软 Bing Maps 的 TileSystem 相关算法: using System; usingSystem.Text;
namespaceMicrosoft.MapPoint {
staticclassTileSystem {
privateconstdoubleEarthRadius = 6378137; privateconstdoubleMinLatitude = -85.05112878; privateconstdoubleMaxLatitude = 85.05112878; privateconstdoubleMinLongitude = -180; privateconstdoubleMaxLongitude = 180; privatestaticdouble Clip(double n, doubleminValue, doublemaxValue) {
bbirdsky 笔记
地图投影公式转换
地图投影公式转换
一、墨卡托投影坐标系(Mercator Projection)
墨卡托投影(Mercator Projection),又称为“等角正轴圆柱投影”,是一种“等角正切圆柱 投影”,荷兰地图学家墨卡托(Mercator)在 1569 年拟定,假设地球被围在一个中空的圆柱里,其 赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体 展开,这就是一幅标准纬线为零度(即赤道)的“墨卡托投影”绘制出的世界地图。
地面分辨率 = (cos(latitude * PI/180) * 6378137 meters)* 2 * PI / (256 * 2level pixels) 简易公式:地面分辨率 = 2 * PI * r / 256 * 2level
最低地图放大级别(1 级),地图是 512 x 512 像素。每下一个放大级别,地图的高度和宽度 分别乘于 2:2 级是 1024 x 1024 像素,3 级是 2048 x 2048 像素,4 级是 4096 x 4096 像素, 等等。通常而言,地图的宽度和高度可以由以下式子计算得到:
地图投影公式转换
lats = [-85.05112877980659,85.05112877980659] // 纬度取值范围
minPoint = (-180, -85.05112877980659)
// 左下角经纬度坐标
maxPoint = (180, 85.05112877980659)
// 右上角经纬度坐标
相关文档
最新文档