1、前言
最近遇到一个问题:如何在OpenLayers
中高效加载海量的场强点?由于项目中的一些要求,不能使用聚合的方法加载。一番搜索之后发现:OpenLayers
中有一个WebGLPoints
类,使用该类可以轻松应对几十万的数据量,下面开始介绍。
2、使用ol.layer.Vector
ol.layer.Vector
是常用的矢量要素图层,下面这段代码演示了加载100000
个随机点:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebGL</title><style>html,body,#map {width: 100%;height: 100%;margin: 0;padding: 0;}</style><link rel="stylesheet" href="libs/ol/ol.css" /><script src="libs/ol/ol.js"></script>
</head>
<body><div id="map"></div><script>// 创建图层var layer = new ol.layer.Vector({source: new ol.source.Vector(),style: new ol.style.Style({image: new ol.style.Circle({radius: 20,fill: new ol.style.Fill({color: 'red'})})})});// 创建要素var source = layer.getSource();for (var i = 1; i <= 100000; i++) {var coordinates = [120.00 + Math.random(), 30.00 + Math.random()];var feature = new ol.Feature(new ol.geom.Point(coordinates));source.addFeature(feature);}// 创建地图var map = new ol.Map({target: 'map',layers: [layer],view: new ol.View({projection: 'EPSG:4326',center: [120, 30],zoom: 10})});</script>
</body>
</html>
运行程序后可以发现:界面卡顿严重,用户体验较差。
3、使用ol.layer.WebGLPoints
下面使用ol.layer.WebGLPoints
来加载100000
个随机点,需要注意:OpenLayers
的版本从6
开始才支持ol.layer.WebGLPoints
:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebGL</title><style>html,body,#map {width: 100%;height: 100%;margin: 0;padding: 0;}</style><link rel="stylesheet" href="libs/ol/ol.css" /><script src="libs/ol/ol.js"></script>
</head>
<body><div id="map"></div><script>// 创建图层var layer = new ol.layer.WebGLPoints({source: new ol.source.Vector(),style: {symbol: {symbolType: 'circle',size: 20,color: 'red'}}});// 创建要素var source = layer.getSource();for (var i = 1; i <= 100000; i++) {var coordinates = [120.00 + Math.random(), 30.00 + Math.random()];var feature = new ol.Feature(new ol.geom.Point(coordinates));source.addFeature(feature);}// 创建地图var map = new ol.Map({target: 'map',layers: [layer],view: new ol.View({projection: 'EPSG:4326',center: [120, 30],zoom: 10})});</script>
</body>
</html>
运行程序后可以发现:界面无卡顿,用户体验较好。
4、结语
WebGL
由于使用GPU
加速渲染,因此绘图效率较高。在OpenLayers
的开发中,如果遇到加载海量数据点的需求,不妨考虑使用WebGLPoints
实现。