Qt加载离线地图

一、例子

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=2​0​​∗2​0
    层级1的瓦片数是4=2​1​​∗210
    层级n的瓦片数是2​n​​∗2​n
    如果只计算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]
</
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值