博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何开发自己的电子地图系统 web版 单机或联网
阅读量:5064 次
发布时间:2019-06-12

本文共 3032 字,大约阅读时间需要 10 分钟。

电子地图一般可以使用Baidu api等其他的API来制作,优点功能强大,但缺点是需要连接官方服务器,且难以定制自己的内容.

 现制作简单的电子地图,不用依赖其他API,而且方便自己扩展,流程如下:

1选择开发语言as3 

 

2地图投影

 

为了电子地图影像无缝拼接起来,整个地球必须使用一个投影.一般选择墨卡托投影(Mercator projection),下图:

在墨卡托投影下,比例和面积明显扭曲了 (特别是在两极附近的地区).

为了简化计算,我们使用球面投影的形式,而不是椭圆形的形式。由于投影是仅用于地图显示,而不是显示数字坐标,我们不需要额外的椭圆投影的精度。使用球面投影的原因大约有0.33%规模扭曲在Y轴方向,视觉上不明显

                        

 

地面分辨率和地图比例尺

 

除了投影, 渲染地图还需要地面分辨率或地图比例尺。最低水平的缩放级别(1级),地图是512 x 512像素。在每个连续的缩放级别,地图宽度和高度增长的因素2:缩放级别  2级是1024 x 1024像素,三级为2048 x 2048像素,4级是4096 x 4096像素,等等。一般来说,地图的宽度和高度(以像素为单位)可以计算为:

地图宽度=地图高度= 256 * 2水平像素

地面分辨率:地图上一个像素表示的地面距离。例如,在地面分辨率10米/像素,每个像素代表一个地面10米的距离。地面分辨率取决于缩放级别和它的纬度。使用一个地球半径6378137米,地面分辨率(米/像素)可以计算为:

地面分辨率= cos(纬度* pi / 180)*地球周长/地图宽度

=(cos(纬度* pi / 180)* 2 * pi * 6378137米)/(256 * 2水平像素)

地图比例尺:在相同的单位下,地图距离和地面距离之间的比率。例如,地图比例尺为1:100000,地图上的每一英寸代表一个地面100000英寸的距离。类似地面分辨率,地图比例尺取决于纬度和缩放级别,它可以通过地面分辨率计算出来,比如给点每英寸的屏幕分辨率,通常96 dpi:

地图比例尺= 1:地面分辨率*屏幕dpi / 0.0254米/英寸

= 1:(cos(纬度* pi / 180)* 2 * pi * 6378137 *屏幕dpi)/(256 * 2 * 0.0254)

 

下表列出每个缩放级别(在赤道来衡量)。(注意,地面分辨率和地图比例尺也取决于纬度,上述方程所示,但不包括下表所示。)

 

缩放级别

地图宽度和高度(象素)

地面分辨率 (米 / 象素)

地图比例尺(96 dpi)

1

512

78,271.5170

1 : 295,829,355.45

2

1,024

39,135.7585

1 : 147,914,677.73

3

2,048

19,567.8792

1 : 73,957,338.86

4

4,096

9,783.9396

1 : 36,978,669.43

5

8,192

4,891.9698

1 : 18,489,334.72

6

16,384

2,445.9849

1 : 9,244,667.36

7

32,768

1,222.9925

1 : 4,622,333.68

8

65,536

611.4962

1 : 2,311,166.84

9

131,072

305.7481

1 : 1,155,583.42

10

262,144

152.8741

1 : 577,791.71

11

524,288

76.4370

1 : 288,895.85

12

1,048,576

38.2185

1 : 144,447.93

13

2,097,152

19.1093

1 : 72,223.96

14

4,194,304

9.5546

1 : 36,111.98

15

8,388,608

4.7773

1 : 18,055.99

16

16,777,216

2.3887

1 : 9,028.00

17

33,554,432

1.1943

1 : 4,514.00

18

67,108,864

0.5972

1 : 2,257.00

19

134,217,728

0.2986

1 : 1,128.50

20

268,435,456

0.1493

1 : 564.25

21

536,870,912

0.0746

1 : 282.12

22

1,073,741,824

0.0373

1 : 141.06

23

2,147,483,648

0.0187

1 : 70.53

 

像素坐标

已经在每个缩放级别的细节有了投影和比例尺,我们可以将地理坐标转换成像素坐标。由于地图宽度和高度是在不同的缩放级别,像素坐标也是如此。像素在地图的左上角像素坐标总是 (0,0)。像素在地图右下角的像素坐标是(width-1 height-1),或在前面的小节方程(256 * 2level–1, 256 * 2level–1)。例如,在3级,像素坐标范围从(0,0)到(2047、2047),如下:

 

有了经度,纬度和缩放级别,像素XY坐标可以如下计算:

sinLatitude = sin(latitude * pi/180)

pixelX = ((longitude + 180) / 360) * 256 * 2 level

pixelY = (0.5 – log((1 + sinLatitude) / (1 – sinLatitude)) / (4 * pi)) * 256 * 2 level

纬度和经度使用WGS 84坐标系。虽然地图使用球面投影,重要的是将所有的地理坐标转换成一个共同的坐标系,都转成WGS 84坐标系。假设经度范围从-180 到 180度,纬度范围必须裁剪,从-85.05112878到85.05112878。 这避免了在两极出现异常,使投影地图为矩形。

 

Tile坐标和Quadkeys

为优化地图的检索和显示性能,地图每Tile被分割成256 x 256像素的块。像素的数量在每个缩放级别下都不同,瓷砖的数量:

地图宽度=地图高度= 2 level tiles

每个Tile的XY坐标系范围从左上角(0,0),到右下角(2level–1, 2level–1)。例如,在第三级的Tile坐标范围从(0,0)到(7,7)如下:

 

给出一对像素XY坐标,可以很容易地确定TileY坐标:

tileX = floor(pixelX / 256)

tileY = floor(pixelY / 256)

为了优化Tiles的索引和存储, 组合二维TileXY坐标系进入一维的字符串被称为四叉树Key,或简称为“quadkeys”。在每个缩放级别,每个quadkey唯一标识一个tile。给定一个在缩放级别为3级的TileXY坐标系(3,5),quadkey确定如下:

tileX = 3 = 011 2

tileY = 5 = 101 2

quadkey = 100111 2 = 213 4 = " 213 "

 

 

3,下载地图数据

测试数据可从google地图下载。

 

4、显示结果如下

5,应用显示GPS坐标

导入地名坐标数据入库,建webservice,查询结果如下

 

 

 

6,应用,地形图划分,浏览。

 

 

转载于:https://www.cnblogs.com/hyg290/p/3871239.html

你可能感兴趣的文章
查询数据表结构并查出结构的结构信息
查看>>
Oracle设置权限和还原数据库
查看>>
泛型应用
查看>>
前端vue项目执行npm install 报错cd() never called()
查看>>
sonarqube执行命令遇上的小问题
查看>>
出现 HTTP 错误 500.19 错误代码 0x800700b7
查看>>
git初使用(本地创建后第一次提交到git)
查看>>
pygame外星人
查看>>
pygame外星人2
查看>>
【python】闭包
查看>>
【python】再说装饰器与闭包的写法
查看>>
【python】装饰器
查看>>
gitlab 修改git clone地址为指定域名
查看>>
SparkStreaming “Could not read data from write ahead log record” 报错分析解决
查看>>
闲聊位置之 POI数据
查看>>
团队冲刺个人总结7
查看>>
你不知道的JS(this)---#
查看>>
安装关系型数据库MySQL 安装大数据处理框架Hadoop
查看>>
随机函数rand()算法
查看>>
hdu 3661 Assignments
查看>>