Openlayer若干问题汇总二

标签: 无 分类: 未分类 创建时间:2021-08-26 10:39:02 更新时间:2025-01-20 09:45:24

1.修改绘图时鼠标的样式

默认的绘图时,是有一个蓝点放在了箭头鼠标的下面,我想自定义这个样式,比如换成一个十字形,找来找去,没有地方可以设置,最后通过重载了Draw这个类实现了相关的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import {
Draw as DrawInteraction,
} from 'ol/interaction';
/**
* 自定义了绘图方法,主要是为了去掉绘图时默认的鼠标样式
*/
export default class Draw extends DrawInteraction {
constructor(option) {
super(option);
// 鼠标移动时的样式
this.createOrUpdateSketchPoint_=function(){
return true;
}
}
}

这样重载后,就可以去掉随鼠标移动的那个蓝点了,但是其他的使用方法和原有的Draw是一样的,同时可以通过修改 地图div 的鼠标样式,自定义鼠标样式,比如:

1
2
let element=this.map.getTargetElement();
element.style.cursor="crosshair";
参考文章:
1.源码

2.getCoordinateFromPixel不同

这个问题比较奇怪,就是同一个地图,同一个坐标系,在windows上和mac上,返回的坐标不一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 生成地图
var extent = [0, 0, 1024, 968];
var projection = new Projection({
code: 'draw',
units: 'pixels',
extent: extent,
});

let mainmap=new Map({
target: 's-map',
view: new View({
center: [0, 0],
zoom: 0,
projection: projection
}),
});

// 同为火狐浏览器
// windwos上返回的内容为 Array [254,330]
// mac上返回的内容是 Array [568,214]
mainmap.on("postcompose",()=>{
let xpixel=582;
let ypixel=303;
let coor=mainmap.getCoordinateFromPixel([xpixel,ypixel]);
console.log(coor);
});

// 使用这种方式也不行
var size = map.getSize();
var extent = this.calculateExtent(size);
var coordinate = [
extent[0] + (extent[2]-extent[0]) * pixel[0]/size[0],
extent[1] + (extent[3]-extent[1]) * (size[1]-pixel[1])/size[1]
];

经过测试,不同的分辨率下会出现坐标不一样的情况,同时,在地图中心变化的时候,也会出现不一样的情况。

3.拖动元素到地图上,目标不一样

这个问题真是挺蛋疼的,主要就是在mac系统上。我新建了一个应用,使用html5的拖放操作,将右侧的图标,通过拖动的方式拖动到地图上,我先是监听了drop事件,获取到拖动结束的像素坐标x,y,然后转换成地理坐标,创建一个Feature将图标放到相应的地理坐标上,这样的逻辑本来是没有问题的。但是一个比较奇特的问题,就是在mac系统上,使用的e.clientX会比windows上的坐标值大两倍,在其他的非mac电脑上,也有时候会出现这个问题,就是屏幕分辨率不同的时候会出现的问题。

1
2
3
// 获取放置点的x,y坐标
let xpixel=e.clientX/2;
let ypixel=e.clientY/2;

后来我以为是offset便宜量多问题,于是就使用了下面的函数进行差异的消解,但是出现的新的奇怪的问题,就是第一次获取到地理坐标是正确的,但是第二次获取到的地理坐标就不正确了。

1
2
3
4
5
6
7
8
9
10
11
12
13
/** 获取屏幕的坐标 */
export function getOffsetX(e){
var e =e||window.event;
var srcObj = e.target || e.srcElement;
if (e.offsetX){
return e.offsetX;
}else{
var rect = srcObj.getBoundingClientRect();
var clientx = e.clientX;
return clientx - rect.left;
}
}

后来我经过打印,发现第一次拖动元素到地图上的触发目标,是ol-layers,以后的目标就是ol-layers下面的canvas了,这样在计算 clientx - rect.left 的时候,就有可能不正确了。

于是我想着,既然第一次和第二次的target目标不同,那就让它们都相同不就好了?把目标要素定位成地图的targetElement,这样不就行了吗?

1
2
3
4
5
6
7
8
// 获取偏移量
export function getOffsetX(e,map){
var srcObj=map.getTargetElement();
var rect = srcObj.getBoundingClientRect();
var clientx = e.clientX;
srcObj=null;
return clientx - rect.left;
}

经过一番测试,还真是可以的。终于解决了我两天都没有解决的坐标计算差异问题。

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中。

6.加载Mapbox底图

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。