地图组件Leaflet地图偏移问题

2024-05-15 18:58

本文主要是介绍地图组件Leaflet地图偏移问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://blog.csdn.net/liufeng0209/article/details/41896935

Leaflet的好处就不多说了,简单的几点:轻量、支持HTML5、插件多,在与图形组件(如HT组件)结合后,可以开发出丰富的GIS应用,可以说几乎所有的GIS场景都能支持。

在使用GIS的时候,想必有个问题一直困扰开发者,就是我们的底图基本上都是有偏移的,如果使用GPS采集的资源(真实经纬度)叠加到底图上,与底图有很大的偏移,叠加不上。从测试上来说,高德的底图,偏差可达到20公里。

处理偏移问题,一般有两个思路:

第一个是将真实的经纬度按照偏移算法(一般底图供应商会提供)偏移到加密的地图上,从而达到叠加效果。这样的问题是相当于将错就错,如果从地图上去采集经纬度就是偏移的,最后还得纠偏回去。而纠偏又是一个大问题,几乎所有的底图供应商都不提供纠偏算法,单单这个问题,都可以再写一篇文章。

第二个是改造地图组件,将底图进行反向偏移,这样GPS采集的经纬度可以无缝的叠加上,在地图上采集的经纬度都是无需纠偏的。进行底图偏移的前提是,需要知道偏移量offset,如果是线性偏移,这个offset就是个常量,如果不是线性偏移,则这个offset是依赖于视窗中心点的变量。

笔者查看Leaflet的源码,其中并没有对偏移的处理方法,在阅读源码并经过反复测试后,获得了以下的思路:

1.在获取切片的时候,计算切片X,Y值的时候增加上偏移量;

_update: function () {//hqj增加偏移支持 startif (!this._map) { return; }var map = this._map,bounds = map.getPixelBounds(),zoom = map.getZoom(),tileSize = this._getTileSize(),sw = map.unproject(bounds.getBottomLeft()),//获取左下角经纬度ne = map.unproject(bounds.getTopRight());//获取右上角经纬度if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {  return;  }     var offsetX = this.options.offsetX;//经度偏移量  var offsetY = this.options.offsetY;//纬度偏移量  if(offsetX != null  && offsetY != null)  {  sw = new L.LatLng(sw.lat - parseFloat(offsetY),sw.lng - parseFloat(offsetX));//增加偏移量  ne = new L.LatLng(ne.lat - parseFloat(offsetY),ne.lng - parseFloat(offsetX));  var swPoint = map.project(sw);//将经纬度进行投影 var nePoint = map.project(ne);  bounds = L.bounds(swPoint,nePoint);  }  var tileBounds = L.bounds(bounds.min.divideBy(tileSize)._floor(),bounds.max.divideBy(tileSize)._floor());this._addTilesFromCenterOut(tileBounds);if (this.options.unloadInvisibleTiles || this.options.reuseTiles) {this._removeOtherTiles(tileBounds);}//hqj增加偏移支持 end/*if (!this._map) { return; }var map = this._map,bounds = map.getPixelBounds(),zoom = map.getZoom(),tileSize = this._getTileSize();if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {return;}					var tileBounds = L.bounds(bounds.min.divideBy(tileSize)._floor(),bounds.max.divideBy(tileSize)._floor());this._addTilesFromCenterOut(tileBounds);if (this.options.unloadInvisibleTiles || this.options.reuseTiles) {this._removeOtherTiles(tileBounds);}*/},

2.在显示图片的时候,图片位置减去偏移量;

_addTile: function (tilePoint, container) {var tilePos = this._getTilePos(tilePoint);//hqj增加偏移支持 startvar offsetX = this.options.offsetX;  var offsetY = this.options.offsetY;  if(offsetX != null  && offsetY != null)  {  var latLng = this._map.layerPointToLatLng(tilePos);  tilePos = this._map.latLngToLayerPoint(new L.LatLng(latLng.lat + parseFloat(offsetY),latLng.lng + parseFloat(offsetX)));  }  //hqj增加偏移支持 end// get unused tile - or create a new tilevar tile = this._getTile();/*Chrome 20 layouts much faster with top/left (verify with timeline, frames)Android 4 browser has display issues with top/left and requires transform instead(other browsers don't currently care) - see debug/hacks/jitter.html for an example*/L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome);this._tiles[tilePoint.x + ':' + tilePoint.y] = tile;this._loadTile(tile, tilePoint);if (tile.parentNode !== this._tileContainer) {container.appendChild(tile);}},

这篇关于地图组件Leaflet地图偏移问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992647

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2