本文基于openlayers2现有api扩展html5的支持绘制10W+的四边形,当然样式简单死板,只为说明通过H5也
可以为ol带来不菲的性能(默认自带vector图层中添加feature超过2K+数据后就会出现卡顿)。
-- 2017-04-13 :GridLayer.Source天假bc属性为格子边框颜色,如果存在边框颜色则绘制边框
废话不多说直接上代码,
1、创建一个对象,标明每个待绘制元素的基本信息,目前主要包含左上和右下的经纬度还有待显示的颜色:
/**
* Class: GridLayer.Source
创建一个数据源的类型,一个格子中需要包含左上右下的经纬度还有要显示的颜色
*/
GridLayer = {};
/**
* Class: GridLayer.Source
*/
GridLayer.Source = OpenLayers.Class({
/**
* 左上经纬度
* {OpenLayers.LonLat} 左上经纬度
*/
l: null,
/**
* 栅格右下角经纬度
*/
r:null ,
/**
* 栅格显示颜色
*/
c:null ,
/**
* 边框显示颜色
*/
bc:null,
initialize: function(leftLonLat, rightLonLat ,color,boderColor ) {
this.l = leftLonLat;
this.r = rightLonLat;
this.c = color ;
this.bc = boderColor;
},
CLASS_NAME: 'GridLayer.Source'
});
/**
* Class: GridLayer.Layer
* 栅格图层
* Inherits from:
* - <OpenLayers.Layer>
*/
GridLayer.Layer = OpenLayers.Class(OpenLayers.Layer, {
/**
* Property: 所有的格点信息
* {Array(<GridLayer.Source>)} internal coordinate list
*/
points: null,
/**
* Property: H5画布
* {DOMElement} Canvas element.
*/
canvas: null,
/**
* Constructor: GridLayer.Layer
* Create a GridLayer layer.
*
* Parameters:
* name - {String} Name of the Layer
* options - {Object} Hashtable of extra options to tag onto the layer
*/
initialize: function(name, options) {
OpenLayers.Layer.prototype.initialize.apply(this, arguments);
this.points = [];
this.canvas = document.createElement('canvas');
this.canvas.style.position = 'absolute';
// For some reason OpenLayers.Layer.setOpacity assumes there is
// an additional div between the layer's div and its contents.
var sub = document.createElement('div');
sub.appendChild(this.canvas);
this.div.appendChild(sub);
},
/**
* APIMethod: addSource
* 添加一个格子元素
*
* Parameters:
* source - {<GridLayer.Source>}
*/
addSource: function(source) {
this.points.push(source);
},
/**
* 添加所有的数据源
*/
putSource: function(sources) {
this.points = sources ;
},
clear:function() {
this.points = [];
},
/**
* 删除一个格子元素
* Parameters:
* source - {<GridLayer.Source>}
*/
removeSource: function(source) {
if (this.points && this.points.length) {
OpenLayers.Util.removeItem(this.points, source);
}
},
/**
* Method: moveTo
* 地图移动时候回重绘地图,主要方法
* Parameters:
* bounds - {<OpenLayers.Bounds>}
* zoomChanged - {Boolean}
* dragging - {Boolean}
*/
moveTo: function(bounds, zoomChanged, dragging) {
OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
if (dragging)
return;
//偏移
var someLoc = new OpenLayers.LonLat(0,0);
var offsetX = this.map.getViewPortPxFromLonLat(someLoc).x -
this.map.getLayerPxFromLonLat(someLoc).x;
var offsetY = this.map.getViewPortPxFromLonLat(someLoc).y -
this.map.getLayerPxFromLonLat(someLoc).y;
var w = this.map.getSize().w;
var h = this.map.getSize().h ;
this.canvas.width = w;
this.canvas.height = h;
var ctx = this.canvas.getContext('2d');
ctx.save(); // Workaround for a bug in Google Chrome
ctx.fillStyle = 'transparent';
ctx.fillRect(0, 0, w, h);
ctx.restore();
//得出当前画布的左上右下经纬度数据 对于超过这个界限的数据 当前画布忽略绘制
var left = new OpenLayers. Pixel(0,0);
var right = new OpenLayers. Pixel(w,h);
var leftlonlat = this.map.getLonLatFromPixel(left);
var rightlonlat = this.map.getLonLatFromPixel(right);
for (var i in this.points) {
var src = this.points[i];
//判断数据是否已经超越当前canvas 如果超越 直接跳过
if(src.r.lon < leftlonlat.lon || src.r.lat > leftlonlat.lat
|| src.l.lon > rightlonlat.lon || src.l < rightlonlat .lat) {
continue;
}
//坐标
var leftpos = this.map.getLayerPxFromLonLat(src.l);
var rightpos = this.map.getLayerPxFromLonLat(src.r);
if(leftpos == null || rightpos == null) continue ;
var minlon = leftpos.x ;
var maxlat = leftpos.y;
var maxlon = rightpos.x;
var minlat = rightpos.y;
var x = maxlon - minlon ;
var y = minlat - maxlat ;
//颜色
//判断是否为shuzi
ctx.fillStyle= src.c;
ctx.fillRect(minlon + offsetX ,maxlat + offsetY,x ,y );
ctx.fillStyle = 'transparent';
//判断是否有边框颜色,如果有则绘制边框
if(src.bc) {
//border
ctx.strokeStyle = src.bc ;
ctx.strokeRect(minlon + offsetX ,maxlat + offsetY,x ,y );
ctx.strokeStyle = 'transparent';
}
}
var dat = ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
ctx.putImageData(dat, 0, 0);
this.canvas.style.left = (-offsetX) + 'px';
this.canvas.style.top = (-offsetY) + 'px';
},
/**
* 图层extent
* Returns:
* {<OpenLayers.Bounds>}
*/
getDataExtent: function () {
var maxExtent = null;
if (this.points && (this.points.length > 0)) {
var maxExtent = new OpenLayers.Bounds();
for(var i = 0, len = this.points.length; i < len; ++i) {
var point = this.points[i];
maxExtent.extend(point.l);
}
}
return maxExtent;
},
CLASS_NAME: 'GridLayer.Layer'
});
3、 调用
调用的时候直接引用后提供带渲染的数据即可,例如:
var gridLayer = new GridLayer.Layer("grid");
var index = 0 ;
//循环经度
for(var i = 120 ; i<121.1 ; i+=0.002) {
var lon = i;
//循环纬度
for(var j = 30 ; j < 30.5 ; j+=0.002) {
var lat = j ;
var leftlonlat = new OpenLayers.LonLat(lon,lat);
//根据中心点偏移左上和右下
var rightlonlat = new OpenLayers.LonLat(lon + 0.001, lat - 0.001);
//坐标系
leftlonlat.transform(map.displayProjection, map.projection);
rightlonlat.transform(map.displayProjection, map.projection);
//一个datasource
var grid = new GridLayer.Source(leftlonlat, rightlonlat , '#FF0000' );
gridLayer.addSource(grid);
index++;
}
}
console.log('size : ' + index);
//设置图层透明度
gridLayer.setOpacity(0.5);
//加入map
map.addLayer(gridLayer);
4、 说明
实际使用中数据如果从后台查询过来的话可能加载不了这么大的数据量,另外实际业务中的应用一般比这个复杂,此次扩展主要针对应用简单的业务(和我们当前公司业务很类似,N多个经纬度直接打在地图上,按照规则渲染颜色)。
5、 实际效果如图:
相关推荐
总之,"基于openlayers和canvas绘制海量数据的实现"是一个高效处理和展示地理信息的技术方案,它结合了OpenLayers的灵活性和Canvas的高性能渲染能力,为开发者提供了强大的工具来应对大数据挑战。通过理解和掌握这些...
在手写openlayers6 绘制扇形及环形源码的过程中会摘取openlayers中的核心逻辑,简化代码实现过程,保留核心功能,例如:vue3接入openlayers openlayers绘制环形 openlayers绘制扇形 适合人群:具备一定编程基础,...
OpenLayers 是一个专为Web GIS 客户端开发提供的JavaScript 类库包,用于实现标准格式发布的地图数据访问,echarts是百度的开源js图表库,该示例实现了在openlayers的地图‘贴’上echarts的图表,具体可参见我的博客...
**OpenLayers 在线绘制详解** OpenLayers 是一个流行的开源JavaScript库,用于在Web浏览器中创建交互式的地图应用。它支持多种地图服务,包括WMS、WMTS等,并且提供了丰富的功能,如图层管理、投影转换、以及我们...
在OpenLayers 3及以上版本中,地图右键功能的实现是一项关键操作,它允许用户与地图交互并执行特定任务,如获取地图上的坐标、测量距离、添加标记等。本篇文章将详细探讨如何在OpenLayers中自定义地图右键菜单,以...
它支持多种数据源,包括WMS、WMTS等,并且能够处理矢量数据,实现地图的动态绘制。在这个主题中,我们将深入探讨如何利用OpenLayers 3在WebGIS中绘制各种特殊的图形,如进攻方向、自由地、分队战斗、弓形、扇形、...
OpenLayers是一个强大的JavaScript库,用于在网页上展示和操作地理信息系统(GIS)的矢量和栅格数据。 首先,我们来理解什么是OpenLayers扩展。扩展是为OpenLayers添加新功能或修改现有功能的一种方式,它可以是新...
它结合了OpenLayers的核心库、风场图层扩展、数据文件、用户交互界面和高效的Web服务器部署策略,为用户呈现了一个动态、可交互的风场地图应用。开发者可以借此学习如何在OpenLayers中创建自定义图层,以及如何利用...
总之,OpenLayers 5 提供了强大的地图绘制能力,允许开发者轻松地在Web应用中创建交互式地图,并且支持自定义样式和多种几何类型,极大地扩展了地图的可用性。通过深入理解这些概念并实践,你可以构建出具有高度可...
离线地图的实现主要依赖于将在线地图数据预先下载并存储在本地,然后通过OpenLayers来读取和渲染这些存储的数据。在这个DEMO中,我们重点关注两个关键点:地图瓦片的组织和OpenLayers的配置。 1. **地图瓦片的组织*...
"OpenLayers扩展右键菜单"是一个项目,旨在帮助开发者为他们的OpenLayers地图应用添加自定义的右键上下文菜单。这个扩展允许用户在地图上点击右键时触发特定的操作,例如测量距离、添加图层、获取地图坐标等。 开发...
而ol-ext是针对OpenLayers的一个扩展插件,它增加了许多额外的功能和视觉效果,使得地图开发更为便捷和美观。 在2022年4月发布的ol-ext版本v3.2.23中,我们关注以下几个关键知识点: 1. **图形和符号**:ol-ext...
OpenLayers 是一个强大的开源JavaScript库,用于在Web浏览器中创建交互式地图。...OpenLayers的灵活性和强大功能使其成为WebGIS开发的首选工具之一,对于绘制和动态回放轨迹数据,提供了丰富的API和示例供开发者参考。
OpenLayers可以方便地处理GeoJSON格式的数据,通过`ol.source.Vector`和`ol.layer.Vector`组合实现: ```javascript var vectorSource = new ol.source.Vector({ url: 'data.geojson', format: new ol.format....
通过OpenLayers,开发者可以轻松地加载各种地图服务,如WMS、WMTS、TMS等,并支持矢量数据的展示和操作。 **ArcGIS 10.1** ArcGIS是由Esri公司开发的一套全面的GIS软件解决方案,涵盖了数据创建、编辑、分析、发布...
基于openlayers+geoserver+ssm+webgis的道路缓冲区分析系统源码+全部资料齐全.zip基于openlayers+geoserver+ssm+webgis的道路缓冲区分析系统源码+全部资料齐全.zip 【备注】 1、该项目是个人高分项目源码,已获导师...
OpenLayers 是一个强大的开源JavaScript库,用于在网页上创建交互式的地图应用。它支持多种地图服务,包括WMS、WMTS等,并可以处理各种地理数据格式。在"openlayers 态势箭头、进击箭头等"这个主题中,我们将深入...
做 gis 项目的朋友应该对 OpenLayer 都很熟悉了...虽然有很多优点,但是其并没有像 百度、搞的一样提供内部带箭头线条的绘制API,因此需要手动完成这个功能,这里我写了一个完成此功能的完整 DEMO,各位可以参考下载。
OpenLayers 是一个开源的JavaScript库,用于在网页上展示地理空间数据。它支持多种地图服务,包括WMS、WMTS等,同时也提供了丰富的交互功能和地图操作选项。本篇文章将详细探讨OpenLayers的扩展机制,特别是针对描述...