一、例子
QWebEngineView加载谷歌离线地图
QT_地图导航 源码下载
Graphics View实现简单离线地图
Qt QGraphics类应用——地图缩放选点
Qt QGraphics类应用——图片移动+选点缩放+控制移动区域
QGraphicsView 如何实现百度地图按照鼠标点进行放大缩小效果
二、项目
SELECT * FROM map WHERE TileColumn = 99 and TileRow = 46 and ZoomLevel = 7
DELETE FROM map WHERE TileColumn = 99 and TileRow = 46 and ZoomLevel = 7
1、/QtMapViewer_With_QGraphicsView-master/MapViewer
在线下载瓦片地图,QGraphicsView显示,可以成功运行的。
2、/MapGraphics-master/MapGraphics
在线加载瓦片地图,有方格线
瓦片数据缓存在:C:\Users\xxx\.MapGraphicsCache\OpenStreetMap Tiles
三、基础知识
1、TMS
TMS(Tile Map Service)、WMTS(Web Map Tile Service)瓦片服务
TMS瓦片
瓦片XY的计算
TMS下载文件的排列(TMS和google的区别)
wiki关于瓦片计算的代码
切图工具 MapTiler
2、切片坐标的计算:
(0)墨卡托投影
- X轴:赤道半径为6378137米,则赤道周长为2πr = 20037508.3427892,因此X轴的取值范围:[-20037508.3427892, 20037508.3427892]。
- y轴:本来纬度接近90度的时候,y轴是接近无限,但是为了在web上好计算,y轴的取值范围也定为了[-20037508.3427892, 20037508.3427892] 。
- 由上面的x轴和y轴的取值范围,反计算得到经纬度的取值范围为:
经度: [-180,180]
纬度: [-85.05112877980659,85.05112877980659] - 瓦片个数
层级0的瓦片数是1=20∗20
层级1的瓦片数是4=21∗210
层级n的瓦片数是2n∗2n
如果只计算x轴或y轴一边的瓦片数,就是2n个。
(1)OSM(OpenStreetMap)计算:
①四叉树分割
n = 2zoom
Xtile = ((londeg + 180) / 360) * n
Ytile = (1 + log(tan(latrad) + sec(latrad)) / π) / 2 * n-1
Ytitle = (1 - log(tan(latrad) + 1/cos(latrad))/π) / 2 * n
②0级先二分,后四叉树分割
n = 2 zoom+1
Xtile = ((londeg + 180) / 360) * n
Ytile =((latdeg + 90) / 360) *n
(2)google瓦片X编码与tms一致,Y编码关系为:
Ygoogle= 2zoom - YTMS-1
YGoogle + YTMS = 2zoom - 1
google地图地址中的四个参数(x , y , z , s):
xy为切片坐标,z代表zoom,s =( 3x + y )%8
http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x=420&y=193&z=9&s=Galil
int long2tilex(double lon, int z)
{
return (int)(floor((lon + 180.0) / 360.0 * (1 << z)));
}
int lat2tiley(double lat, int z)
{
double latrad = lat * M_PI/180.0;
return (int)(floor((1.0 - asinh(tan(latrad)) / M_PI) / 2.0 * (1 << z)));
}
double tilex2long(int x, int z)
{
return x / (double)(1 << z) * 360.0 - 180;
}
double tiley2lat(int y, int z)
{
double n = M_PI - 2.0 * M_PI * y / (double)(1 << z);
return 180.0 / M_PI * atan(0.5 * (exp(n) - exp(-n)));
}
(3)转换过程:经纬度 => 米 => 像素坐标 => 瓦片坐标
WebGIS 瓦片地图引擎实现之——地图瓦片加载计算原理介绍

①经纬度 => 米

const LatLongToMeterXY = (longitude: number, latitude: number) => {
// 地球的周长的一半 20037508.342789244 单位米
const circumferenceHalf = Math.PI * 2 * 6378137 / 2.0
const mx = longitude * circumferenceHalf / 180
const temp = Math.log(Math.tan((90 + latitude) * (Math.PI / 360.0))) / (Math.PI / 180.0)
const my = circumferenceHalf * temp / 180
return {
mx, my }
}
// [-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244]
</

1307

被折叠的 条评论
为什么被折叠?



