经纬度坐标与瓦片坐标转换推导
[1]经纬度坐标与瓦片坐标的转换
选定转换的经纬度坐标与瓦片坐标(这里选4326地理坐标与谷歌XYZ规范的瓦片坐标:Z表示缩放层级,从0开始;
XY
的原点在左上角,X
从左向右,Y
从上向下)将地理坐标系转为投影坐标系(单位:经纬度=>米)例如将4326=>web墨卡托3857,该坐标系的范围(米为单位)
x[-20037508.3427892, 20037508.3427892]
,范围y同样是[-20037508.3427892, 20037508.3427892]
W e b M e r c a t o r X = l n g ( π 180 ) r W e b M e r c a t o r Y = r 2 l o g 1 + s i n ( l a t ∗ ( π 180 ) ) 1 − s i n ( l a t ∗ ( π 180 ) ) WebMercatorX=lng(\frac{\pi}{180})r\\ WebMercatorY=\frac{r}{2log_{\frac{1+sin(lat * (\frac{\pi}{180}))}{1-sin(lat * (\frac{\pi}{180}))}}} WebMercatorX=lng(180π)rWebMercatorY=2log1−sin(lat∗(180π))1+sin(lat∗(180π))r// 地球半径 const r = 6378137 // 4326转3857 const lngLatMercator = (lng, lat) => {//注意先转为为弧度制,弧度=角度*Math.PI/180,弧长=弧度*半径 let x = lng * (Math.PI / 180) * r;let rad = lat * (Math.PI / 180)let sin = Math.sin(rad)let y = r / 2 * Math.log((1 + sin) / (1 - sin))return [x, y] }
计算任意层级 z z z下的分辨率(分辨率:一个像素宽所代表的实际长度,这里假设每张瓦片的大小为 256 ∗ 256 256*256 256∗256)
r e s o l u t i o n X = C 256 ∗ 2 z r r e s o l u t i o n Y = C 256 ∗ 2 z resolutionX=\frac{C}{256*2^{z}}\\ rresolutionY=\frac{C}{256*2^{z}} resolutionX=256∗2zCrresolutionY=256∗2zC
// 地球周长 const C = 2 * Math.PI * 6378137 // 瓦片像素 const titleSize = 256 // 获取某一层级下的分辨率(X,Y方向适) const getResolution = (n) => {const tileNums = Math.pow(2, n)const tileTotalPx = tileNums * titleSizereturn C / tileTotalPx }
计算像素/屏幕坐标(以为web墨卡托默坐标原点在经纬度为0的地方,而屏幕坐标原点位于屏幕左上角,所以这里需要先进行转换)
p i x e l C o o r X = W e b M e r c a t o r X + C / 2 r e s o l u t i o n X p i x e l C o o r Y = C / 2 − W e b M e r c a t o r X r e s o l u t i o n Y pixelCoorX=\frac{WebMercatorX+C/2}{resolutionX}\\ pixelCoorY=\frac{C/2-WebMercatorX}{resolutionY} pixelCoorX=resolutionXWebMercatorX+C/2pixelCoorY=resolutionYC/2−WebMercatorX
计算瓦片坐标(行列号)
t i l e C o o r X = p i x e l C o o r X 256 t i l e C o o r Y = p i x e l C o o r Y 256 tileCoorX=\frac{pixelCoorX}{256}\\ tileCoorY=\frac{pixelCoorY}{256} tileCoorX=256pixelCoorXtileCoorY=256pixelCoorY// 根据像素坐标及缩放层级计算瓦片行列号 const getTileRowAndCol = (x, y, z) => \\因为3857与4326坐标原点位于经纬度为零的地方,而瓦片坐标原点位于左上角,所以需要将3857坐标原点转到左上角x += C / 2 y = C / 2 - ylet resolutionX = getResolution(z)//获取某一层级z下的分辨率let row = Math.floor(x / resolutionX / tileSize)let col = Math.floor(y / resolutionY / tileSize)return [row, col] }
根据上面的推导可得出经纬度坐标 ( l n g , l a t ) (lng, lat) (lng,lat)互转瓦片坐标 ( r o w , c o l ) (row, col) (row,col)总公式:
一些切片工具的工作原理也大致如此,输入你需要切片的数据及要切片的参数(如切片最大、最小层级,瓦片大小等),输出相应目录规范的XYZ切片数据,以供直接调用。
[2]瓦片服务准备
完成经纬度坐标转为瓦片坐标后便可以使用一些切片工具(geoserver等)切一些瓦片然后发布为服务或直接调用在线瓦片服务,在或者直接调用离线瓦片(注意命名规范)
[3]前端瓦片拼接显示
对于生成的栅格瓦片服务或离线瓦片,可以根据瓦片采用的规则以及切片的参数,采用canvas渲染拼接或采用基于canvas的地图库渲染即可。
可采用leaflet和opnelayers来调用瓦片服务并再前端渲染(openlayers不需要写经纬度坐标转瓦片坐标等代码实现,直接调用即可),不过为了学习的话可以使用canvas来实现瓦片地图的加载。但是使用canvas来渲染的话还会遇到许多需要优化东西:比如瓦片的加载顺序(怎么实现先加载屏幕中间的瓦片),缩放时瓦片的更新方式,平滑移动效果,瓦片的缓存机制等
经纬度坐标与瓦片坐标转换推导相关推荐
- c语言经纬度和大地坐标转换,经纬度坐标与大地坐标转换表
*子午线角度值纬度值b经度值l角度值角度值f2-b2 114114 114114 114114 114114 1 234.565411113.59429634.94836113.9953-0.0047 ...
- 天地图根据经纬度坐标计算瓦片行列号(python)
def get_tianditu_info(rect_pts, zoom):"""根据经纬度计算行列号:param rect_pts: 矩形框坐标 例[a,b,c,d]左 ...
- 【精准三点定位求解汇总】利用Python或JavaScript高德地图开放平台实现精准三点定位(经纬度坐标与平面坐标转换法求解、几何绘图法求解)
[精准三点定位求解汇总]利用Python或JavaScript高德地图开放平台实现精准三点定位(经纬度坐标与平面坐标转换法求解.几何绘图法求解) 众所周知,如果已知三个点的坐标,到一个未知点的距离,则 ...
- 屏幕距离和坐便转换工具_地图经纬度坐标与屏幕坐标的转换(android版)
我们在开发GIS系统的时候,首先要解决的就是地图的可视化问题,这个问题的关键就在于如何把地图的坐标转换成屏幕坐标,然后才到渲染着色.标注等.以下以wgs84经纬度坐标为基准,介绍一下地图经纬度坐标与屏 ...
- 经纬度转直角坐标c语言,坐标转换从经纬度坐标到大地坐标及源码(7页)-原创力文档...
PAGE PAGE #/ 7 坐标转换从经纬度坐标到大地坐标及源码 利用网络上开源的资料,可以很容易的实现从经纬度坐标向各种投影坐标 的转换,美国地质调查局开发 USGS勺GCTP就是很好的东西之一, ...
- 经纬度坐标转换成px_经纬度坐标转像素坐标
"```\n// 经纬度坐标转像素坐标\nfunction latlng2px(lat, lng) {\n var LatLng = (function(){\n function LatL ...
- WGS84经纬度坐标转北京54高斯投影地方坐标流程
坐标系统之间的坐标转换既包括不同的参心坐标之间的转换,或者不同的地心坐标系之间的转换,也包括参心坐标系与地心坐标系之间的转换以及相同坐标系的直角坐标与大地坐标之间的坐标转换,还有大地坐标与高斯平面坐标 ...
- PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例
PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例 原文:PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例 <!--小幅的坐标转换点位程 ...
- 局部(x,y)坐标 转 WGS84经纬度坐标
局部坐标转WGS84坐标 背景: 最近在做一个小项目,其中需要把局部坐标转换成wgs84坐标.我的局部地图是用激光雷达扫出来的一张图,就是下面这张图 用激光雷达建好图以后,就知道图上每一个点的局部坐标 ...
最新文章
- ACL 2020 | 用于链接预测的开放知识图谱嵌入
- Alarm Clocks Everywhere
- 浅述WinForm多线程编程与Control.Invoke的应用
- 使用IntelliJ调试Java流
- 前端学习(355):小练习
- 用计算机打出二分之一,win10手机计算器怎么输入二分之一?
- mongodb在aggregate lookup 进行分页查询,获得记录总数
- 云南林业计算机单招试题,2016年云南林业职业技术学院单招的模拟题含解析-.docx...
- Oracle 20c 新特性:表空间缺省加密算法 TABLESPACE_ENCRYPTION_DEFAULT_ALGORITHM
- leetcode 410. 分割数组的最大值(二分法)
- html登录选项卡实例,html+JQuery登录实例
- Linux高性能server规划——多线程编程(在)
- Entity Framework之IQueryable和list本地集合
- kinect相机标定参考教程
- 西北工业大学noj数据结构实验003稀疏矩阵转置
- PS抠图滤镜Topaz ReMask白纱透明抠图法
- 访问计算机需要用户名密码,访问局域网电脑提示需要用户名和密码该怎么办
- 巅峰之战,一“码”当先!第三届“先导杯”强势来袭
- 二维数组的花式遍历技巧盘点
- ROS出现“Couldn't find executable named listener below //home/xxx/catkin_ws/src/mypack”问题
热门文章
- linux icon图标大小,适用于Linux的5款最佳桌面图标集
- 江苏省计算机二级基础部分,江苏省计算机二级-基础知识部分.doc
- 阿里云服务器安装配置nginx
- ProjectCenter项目管理工具(8)
- Vue 3 + TypeScript + Vite创建项目并安装常用插件
- 官方12月CISA认证考试报名已正式开始
- ArcGIS读取天地图出现错位的情况
- CS_2021_11_log
- 国内android应用商城中程序隐私泄露分析,基于网络流量的安卓应用隐私泄露分析...
- 【三】3D匹配Matching之可变形曲面匹配Deformable Surface——serialize_deformable_surface_model()算子