Openlayers3若干问题汇总
我是一个挺伤感挺悲观的人,时不时的就想起了不好的事情。写这篇文章的时候,让我想起了我在面试的时候,没有答上来的一个问题,“openlayers3 不支持4490坐标系怎么办?”,“我都是用的4326的坐标系。”,“叠加4490图层的时候,两个没有差别吗?” “差别很小,完全可以重叠。再说了,同时两个图都进行了便宜,最后这种偏移不就抵消了吗?”
我自认为我回答的很好,面试官也没有给出具体的答案,其实回来仔细想想,同时咨询了一些大牛,其实这样的回答根本就是错误的。没有4490坐标系,应该自定义坐标系啊,惭愧,真是令人惭愧。
1.自定义坐标系
openlayer3 使用proj4进行自定义坐标系的定义,打开 epsg.io ,在输入框中输入4490。
选择CGC2000坐标系。
在页面的底部,可以查看如何用不同的语言定义4490坐标系,这里选择了Proj4js,可以看到定义方法为:proj4.defs(“EPSG:4490”,”+proj=longlat +ellps=GRS80 +no_defs”)。
这样就定义好了,如何在地图上使用呢,可以参考openlayers的一个示例 ,这里介绍了 EPSG:27700 的定义,在epsg.io中输入27700,查询到的定义方式也是这样的。
在epsg.io上的EPSG:27700的定义:
2.自定义平面直角坐标系
上面的定义坐标系,是定义的地理坐标系,如何定义平面直角坐标系呢?直角坐标系的创建也非常的简单:
1 | var extent = [0, 0, 1024, 968]; |
1.Static Image 这是一个加载静态图片的例子,其实也就是无坐标系的情况,定义出来的自然就是平面直角坐标系
2.OpenLayers自定义坐标系 在epsg官网查找相关的定义,然后使用proj4.js进行定义,proj4.defs(“EPSG:4512”,”+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs”);
3.openlayer在方位坐标系下显示北极地区地图 这个例子,是定义了一个在北极上空看地图的视角
4.openlayers自定义坐标系以及坐标转换 使用ol3和proj4.js实现的,其实和参考文章2是一样的
5.OpenLayers 3 自定义坐标系 公瑾的文章,这个人很厉害,盲目崇拜下吧。介绍了自定义地图的加载。
3.关于点的自定义样式
这个其实我觉得有点莫名奇妙,我使用的是4.6版本的,在绘制点的时候,只要是为图层添加了样式,就总是无法出现点。最后总结出来,原来是点的样式要用image来绘制,而不是fill。
1 | // 错误示例,会发现这样是绘制不出来点的 |
最终的结果就是这个样子:
还有一点,就是Feautre里面的是geometry属性而不是geom属性。
4.绘制箭头
1.OpenLayers 6 绘制高德导航路径的蚂蚁线样式并实现箭头动画——VectorContext的重度使用
2.canvas 奇巧淫技(二)绘制箭头路径效果 (最近正好有这个需求,于是就找了这么篇文章,其实写的挺好的)
5.getPositon无法获取坐标
使用ol6.4.3版本,获取overlay的坐标尽然是undefine
1 | overlay.setPosition(coord); |
6.un无法解除事件
这里需要注意的就是,需要是具名函数,并且不能在一个函数内部,也就是不能每次都重写初始化这个函数,换句话来说,其实具名函数,返回的是要一个地址,只有移除相同地址的函数才可以,如果每一次这个具名函数都会初始化,那么就能移除了。
7.常用的空间分析公式
空间分析,其实可以借助于turf.js这个库,但是这个库有一个缺点,就是坐标系只能是地理坐标系,比如是4326坐标系,但是比如我自定义的像素坐标系,可能就不太适合了,比如计算两点之间的距离,计算线上距离起点多长距离的点。
1.常用空间分析函数 这篇文章中的内容很多,好几种公式:点到点的距离、判断两个点集是否相等、点P到直线AB的垂足及最短距离….
2.js求两个线段的交点
3.JavaScript中点到一个直线的最短距离
8.限制只能绘制线段
需求是这样的,限制只能绘制一条线段,也就是点击两个点,就能绘制出来一条线段,而不是绘制的折线或者是多段线。
因为我设置Draw的 finishCondition 不起作用,于是我换了一种方式实现,也就是通过map.click监听,判断绘制了两个点之后,就结束绘制。
1 | // 绘图操作 |
9.绘制带箭头的线
【需求分析】
官方有例子就是在绘制直线的时候,在线段的一个端点处进行箭头的绘制,我这里的需求是更近一步,可不可以从线段的中间进行箭头的绘制呢?
1 | // 设置图层并增加样式 |
10.自定义事件
参考文章中写的挺好
1 | // 监听事件 |
1.自定义事件及应用 feature.dispatchEvent({type: ‘mousemove’, event: event});