Openlayer若干问题汇总二
1.修改绘图时鼠标的样式
默认的绘图时,是有一个蓝点放在了箭头鼠标的下面,我想自定义这个样式,比如换成一个十字形,找来找去,没有地方可以设置,最后通过重载了Draw这个类实现了相关的功能。
1 | import { |
这样重载后,就可以去掉随鼠标移动的那个蓝点了,但是其他的使用方法和原有的Draw是一样的,同时可以通过修改 地图div 的鼠标样式,自定义鼠标样式,比如:
1 | let element=this.map.getTargetElement(); |
1.源码
2.getCoordinateFromPixel不同
这个问题比较奇怪,就是同一个地图,同一个坐标系,在windows上和mac上,返回的坐标不一样。
1 | // 生成地图 |
经过测试,不同的分辨率下会出现坐标不一样的情况,同时,在地图中心变化的时候,也会出现不一样的情况。
1.OpenLayers - Return values of getCoordinateFromPixel stay the same after calling setZoom() on map view 这里提供了一种监听地图 change:resolution 事件,手动计算坐标位置的方案。但是和使用getCoordinateFromPixel得到的结果是一样的。
2.openlayer——分辨率
3.彻底搞懂拖拽——基于鼠标事件的拖拽以及基于HTML5 API的拖拽完整实现
4.js鼠标事件 clientX、clientY、offsetX、offsetY、layerX、layerY、pageX、 pageY、screenX、screenY
3.拖动元素到地图上,目标不一样
这个问题真是挺蛋疼的,主要就是在mac系统上。我新建了一个应用,使用html5的拖放操作,将右侧的图标,通过拖动的方式拖动到地图上,我先是监听了drop事件,获取到拖动结束的像素坐标x,y,然后转换成地理坐标,创建一个Feature将图标放到相应的地理坐标上,这样的逻辑本来是没有问题的。但是一个比较奇特的问题,就是在mac系统上,使用的e.clientX会比windows上的坐标值大两倍,在其他的非mac电脑上,也有时候会出现这个问题,就是屏幕分辨率不同的时候会出现的问题。
1 | // 获取放置点的x,y坐标 |
后来我以为是offset便宜量多问题,于是就使用了下面的函数进行差异的消解,但是出现的新的奇怪的问题,就是第一次获取到地理坐标是正确的,但是第二次获取到的地理坐标就不正确了。
1 | /** 获取屏幕的坐标 */ |
后来我经过打印,发现第一次拖动元素到地图上的触发目标,是ol-layers,以后的目标就是ol-layers下面的canvas了,这样在计算 clientx - rect.left 的时候,就有可能不正确了。
于是我想着,既然第一次和第二次的target目标不同,那就让它们都相同不就好了?把目标要素定位成地图的targetElement,这样不就行了吗?
1 | // 获取偏移量 |
经过一番测试,还真是可以的。终于解决了我两天都没有解决的坐标计算差异问题。
4.根据样式过滤要素
可以参考参考文章。
5.投影和变换
1.Openlayers 投影与坐标转换 空间参考的别名可以使用proj4js的defs()方法添加,ol对于其他空间参考,可以使用proj4js进行自定义。defs()方法定义,register()方法进行注册。
2.openlayers 加载天地图及定义4490坐标系(vue版) 这里使用 proj4 进行了4490的坐标系定义,因为wms服务的1.1.0和1.3.0的BBOX会有xy对换,openlayer已经帮我们处理了这一步,但是这个只是针对neu坐标系,而我们注册的4490如果不重写定义axisOrientation,会被ol默认注册为enu,从而不会触发wms1.3.0的反转xy的操作,导致图层无法加载,所以需要进行projection4490的重写,然后覆盖添加到projection中。