Openlayers3自定义鹰眼地图

标签: Openlayers 分类: Gis 创建时间:2020-08-24 02:33:56 更新时间:2024-11-15 10:49:43

参考文章1写的很详细了,都没有必要进行补充了。

不过我还是要补充,补充的地方就是上面没有实现的功能,就是拖动鹰眼中的地图和鹰眼中的矩形框,主地图跟着移动。

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
var overviewMap=new TMap('overviewmap',[120.349,30.34],18,'emp'); //初始化鹰眼地图,这是一个自定义的地图类
this.overviewMap=overviewMap;
var map=this.mainmap; // 对主地图的引用

var mainview=map.getView(); // 主视图
var overviewView=overviewMap.getView(); //鹰眼视图


// 增加缩略图框
var extent = map.getView().calculateExtent(map.getSize());
var coor=[[[extent[0],extent[1]],[extent[2],extent[1]],[extent[2],extent[3]],[extent[0],extent[3]],[extent[0],extent[1]]]];
// 鹰眼中可移动要素
var polygonFeature = new ol.Feature(new ol.geom.Polygon(coor));

// 鹰眼中可移动图层
var vectorSource = new ol.source.Vector({
features: [polygonFeature]
});
var vectorLayer = new ol.layer.Vector({
source:vectorSource,
style: new ol.style.Style({
fill: new ol.style.Fill({color: 'rgba(56,166,230,0.4)'}),
stroke: new ol.style.Stroke({
color: 'white', width: 2
})
}),
zIndex:1000
});
overviewMap.addLayer(vectorLayer);


// 设置主地图和鹰眼图互动,主地图移动,鹰眼地图跟着移动


// 下面这两个参数,其实是为了解决循环调用的问题,比如同时定义了主地图的分辨率改变事件,和鹰眼地图的分辨率改变事件,
// 如果不进行区分,在主地图分辨率改变的同时,就应该调用鹰眼,改变鹰眼地图的分辨率
// 同理在改变鹰眼地图的分辨率的同时也应该改变主地图的分辨率,这就会造成一个循环的调用,出现内存问题
// 最本质的就是,就是改变主分辩率的时候,只改变一次鹰眼分辨率,在触发鹰眼分辨率改变事件的时候,不要再次触发主地图分辨率事件的改变,
// 同理在处理鹰眼分别率改变事件的时候也是如此,
// 还有就是主地图和鹰眼地图的地图中心改变事件也是同样的道理。
var overviewMapActiveFlag=false;
var mapActiveFlag=false;


// 主地图分辨率改变了,鹰眼地图的地图中心也应该跟着改变
mainview.on("change:center",function(){
if(!overviewMapActiveFlag&&!mapActiveFlag){
overviewMapActiveFlag=true;
var extent = map.getView().calculateExtent(map.getSize());
var coor=[[[extent[0],extent[1]],[extent[2],extent[1]],[extent[2],extent[3]],[extent[0],extent[3]],[extent[0],extent[1]]]];
vectorLayer.getSource().getFeatures()[0].getGeometry().setCoordinates(coor);
setTimeout(function(){
overviewMap.getView().setCenter(map.getView().getCenter());
},300);
}
mapActiveFlag=false;

});

// 鹰眼地图的中心改变了,主地图的中心也应该跟着改变
overviewView.on("change:center",function(){
// 激活主地图
if(!mapActiveFlag&&!overviewMapActiveFlag){
mapActiveFlag=true;
mainview.setCenter(overviewView.getCenter());
}
overviewMapActiveFlag=false;

});


// 主地图分辨率改变
var overChangeFlag=false;
var mapChangeFlag=false;
mainview.on("change:resolution",function(){
if(!overChangeFlag&&!mapChangeFlag){
overChangeFlag=true;
var zoom=mainview.getZoom();
zoom=zoom-3<0?0:zoom-3;
overviewMap.getView().setZoom(zoom);

}
mapChangeFlag=false;

});
// 鹰眼地图分辨率改变
overviewView.on("change:resolution",function(){
if(!mapChangeFlag&&!overChangeFlag){
mapChangeFlag=true;
var zoom=overviewView.getZoom();
zoom=zoom+3>20?20:zoom+3;
mainview.setZoom(zoom);
}
overChangeFlag=false;
});


// 鹰眼图鼠标样式
overviewMap.on('pointermove', function (evt) {
overviewMap.getTargetElement().style.cursor = 'pointer';
});

// 鹰眼图点击
overviewMap.on('click',function(e){
var coor = e.coordinate;
map.getView().setCenter(coor);
});

// 关闭鹰眼
$(".overviewmap-wrap .overviewmap-close").on("click",function(){
var $this=$(this);
if($this.hasClass("open")){
$this.removeClass("open");
$(".overviewmap-wrap .overviewmap").hide();
$this.html("&#xe647;");
}else{
$this.addClass("open");
$(".overviewmap-wrap .overviewmap").show();
$this.html("&#xe60f;");
}

})

// 增加鹰眼地图可移动的事件
var translateInteraction=new ol.interaction.Translate({
features:new ol.Collection([polygonFeature])
});
translateInteraction.on("translateend",function(){
// 获取图形的中心
var ext=polygonFeature.getGeometry().getExtent();
var center=ol.extent.getCenter(ext);
// 调整主地图的中心
map.getView().setCenter(center);
});
overviewMap.addInteraction(translateInteraction);
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 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.
幸福是年华的沉淀,微笑是寂寞的悲伤。