本文主要是介绍iClient求点所在瓦片行列号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
作者:yangjl
前言
前段时间有客户小伙伴问我如何通过坐标点来获取所在瓦片的行列号,在查看网上博客以及资料后解决了小伙伴的需求并写下这篇文章。首先我们需要理解地图比例尺以及分辨率的意义。分辨率在GIS中可以理解为地面分辨率,或者空间分辨率,其意义表示一个像素代表的地面实际距离,它常用于电子设备屏幕上来衡量实际距离,而比例尺是表示图上距离与实际距离之比。
理论部分
1. 分辨率与比例尺转化
它们之间是有方法来对应与转换,我们这里只讨论经纬度下转换,以下为转换式子
Scale=0.0254/DPI/resolution/Math.PI/2/6378137*360;
其中0.0254代表是每英寸0.0254米,DPI一般为96,可以描述为每英寸96个像素点,在iServer中可以对DPI进行设置,6378137为地球半径。如果小伙伴还想了解平面坐标系的转换可以参考https://www.jianshu.com/p/4ddc870f9528
2. 瓦片行列号换算原理
小伙伴如果网上去查找相关原理其实有很多的方法与说明,大概的意思可以理解为首先算出屏幕上的地理坐标点到瓦片切图原点的实际距离L真实,然后算出一个瓦片的实际长度L瓦片真实。然后用L真实除以L瓦片真实。即可得此时的瓦片行列号。
下面我们直接给出瓦片行列号换算公式
X =((x0 - x)/( tileSize*resolution))
Y=((y0 - y)/( tileSize*resolution))
实操部分
1. 发布ugcv5服务
首先利用iDesktop进行地图切片,本次使用的是wg84的经纬度坐标,epsg4326,使用Word示例数据作图,然后切图,切图参数以下,注意块大小以及dpi为我们可用数据
然后使用iserver发布,发布成功后进行对接出图。如何对接出图以及获取出图参数我在这里不再赘述,之前我写的文章中已经详细说明如何对接出图
https://blog.csdn.net/supermapsupport/article/details/103610851
这是成功对接出图的例子。
1. 计算点所在行列号
现在可用为map对象注册点击事件,获取当前地图的分辨率,以及坐标点位置,
并利用已知的dpi以及当前分辨率通过分辨率比例尺的转换方式得到当前比例尺
map.on('click',(e)=>{var point = new ol.geom.Point(e.coordinate);var iconStyle = new ol.style.Style({image: new ol.style.Icon(({src: '../img/markerbig_select.png'}))});var feature = new ol.Feature(point);feature.setStyle(iconStyle);var pointSource = new ol.source.Vector({features: [feature],wrapX: false});vectorLayer = new ol.layer.Vector({source: pointSource});map.addLayer(vectorLayer);
var scale2=view.getResolution()/(0.0254/96/Math.PI/2/6378137*360)})
现在坐标原点,当前分辨率,点击点的坐标,瓦片大小都已知,最后通过我们提供的瓦片行列号换算计算方法可得到当前分辨率下点击点所在的瓦片行列号
var col=parseInt((-180 - e.coordinate[0])/( 256*view.getResolution()));
var row=parseInt((83.62359619140626 - e.coordinate[1])/( 256*view.getResolution()));
最后,我们可用通用iserver当前瓦片地图服务提供的tileImage操作可进行验证
最后测试与实际情况符合。
总结
通过坐标点来获取当前瓦片的行列号其实不难,通过今天所说的方式得到瓦片行列只是运用的一方面,如果小伙伴感兴趣,可以去尝试自己在当前的地图范围以及比例尺级别下获取所有的瓦片。
这篇关于iClient求点所在瓦片行列号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!