赞
踩
在前面的博客中,ol.style
这个类的出镜率很高,但限于篇幅的原因,所以一直没有进行详细介绍,下面就来介绍一下openlayers
中的样式——ol.style
。
一个ol.style.Style
对象一般包含如下属性:
同时,ol.style.Style
类也派生出很多子类,如下所示:
代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>OpenLayers</title> <link href="ol/ol.css" rel="stylesheet" /> <script src="ol/ol.js"></script> </head> <body> <div id="map" style="width:500px;height:500px;"></div> <script> var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], view: new ol.View({ projection: 'EPSG:4326', center: [120, 30], zoom: 10 }) }); createPoint(); createIconPoint(); createPolyline(); createPolygon(); // 创建点 function createPoint() { // 创建样式 var style = new ol.style.Style({ image: new ol.style.Circle({ radius: 20, // 半径 stroke: new ol.style.Stroke({ // 边界样式 color: 'yellow', // 边界颜色 width: 2 // 边界宽度 }), fill: new ol.style.Fill({ // 填充样式 color: 'red' // 填充颜色 }) }) }); // 创建要素 var feature = new ol.Feature({ geometry: new ol.geom.Point([120.0, 30.0]) }); feature.setStyle(style); // 创建数据源 var source = new ol.source.Vector(); source.addFeature(feature); // 创建图层 var layer = new ol.layer.Vector({ source: source }); // 添加图层 map.addLayer(layer) } // 创建图片点 function createIconPoint() { // 创建样式 var style = new ol.style.Style({ image: new ol.style.Icon({ src: 'img/location.png' }) }); // 创建要素 var feature = new ol.Feature({ geometry: new ol.geom.Point([119.8, 30.2]) }); feature.setStyle(style); // 创建数据源 var source = new ol.source.Vector(); source.addFeature(feature); // 创建图层 var layer = new ol.layer.Vector({ source: source }); // 添加图层 map.addLayer(layer) } // 创建线 function createPolyline() { // 创建样式 var style = new ol.style.Style({ stroke: new ol.style.Stroke({ // 边界样式 color: '#0000FF', // 边界颜色 width: 2 // 边界宽度 }), }); // 创建要素 var feature = new ol.Feature({ geometry: new ol.geom.LineString([ [120.10, 30.10], [120.14, 30.30], [120.25, 30.22] ]) }); feature.setStyle(style); // 创建数据源 var source = new ol.source.Vector(); source.addFeature(feature); // 创建图层 var layer = new ol.layer.Vector({ source: source }); // 添加图层 map.addLayer(layer) } // 创建面 function createPolygon() { // 创建样式 var style = new ol.style.Style({ stroke: new ol.style.Stroke({ // 边界样式 color: 'rgba(136,136,136,0.8)', // 边界颜色 width: 2 // 边界宽度 }), fill: new ol.style.Fill({ // 填充样式 color: 'rgba(136,136,136,0.5)' // 填充颜色 }) }); // 创建要素 var feature = new ol.Feature({ geometry: new ol.geom.Polygon([[ [119.80, 29.80], [119.95, 29.80], [119.85, 29.98], [119.80, 29.80], ]]) }); feature.setStyle(style); // 创建数据源 var source = new ol.source.Vector(); source.addFeature(feature); // 创建图层 var layer = new ol.layer.Vector({ source: source }); // 添加图层 map.addLayer(layer) } </script> </body> </html>
运行结果如下图所示:
在上面的代码中,我们创建样式的流程一般是:先定义样式,然后创建要素,最后设置要素的样式。其实我们同样可以在layer
中定义样式,这样就不需要频繁使用setStyle(style)
了。在layer
中声明样式的方法就是定义一个回调函数:style: function(feature, resolution)
,代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>OpenLayers</title> <link href="ol/ol.css" rel="stylesheet" /> <script src="ol/ol.js"></script> </head> <body> <div id="map" style="width:500px;height:500px;"></div> <script> // 创建要素 var source = new ol.source.Vector(); source.addFeature(new ol.Feature({ geometry: new ol.geom.Point([120.0, 30.0]) })); source.addFeature(new ol.Feature({ geometry: new ol.geom.Point([120.4, 30.4]) })); // 创建图层 var layer = new ol.layer.Vector({ source: source, style: function (feature, resolution) { var style = new ol.style.Style({ image: new ol.style.Circle({ radius: 20, fill: new ol.style.Fill({ color: 'red' }), stroke: new ol.style.Stroke({ color: 'red', width: 1 }) }) }) return style; } }); // 创建地图 var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }), layer ], view: new ol.View({ projection: 'EPSG:4326', center: [120, 30], zoom: 7 }) }); </script> </body> </html>
运行结果如下图所示:
下面我们利用ol.style.RegularShape
来实现一个组合样式,代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>OpenLayers</title> <link href="ol/ol.css" rel="stylesheet" /> <script src="ol/ol.js"></script> </head> <body> <div id="map" style="width:500px;height:500px;"></div> <script> // 创建要素 var source = new ol.source.Vector(); source.addFeature(new ol.Feature({ geometry: new ol.geom.Point([120.0, 30.0]) })); source.addFeature(new ol.Feature({ geometry: new ol.geom.Point([120.4, 30.4]) })); // 创建图层 var layer = new ol.layer.Vector({ source: source, style: function (feature, resolution) { var styles = []; styles.push( new ol.style.Style({ image: new ol.style.Circle({ radius: 20, fill: new ol.style.Fill({ color: 'red' }), stroke: new ol.style.Stroke({ color: 'red', width: 1 }) }) }) ); styles.push( new ol.style.Style({ geometry: feature.getGeometry(), image: new ol.style.RegularShape({ radius1: 15, radius2: 10, points: 8, fill: new ol.style.Fill({ color: 'white' }) }) }) ); return styles; } }); // 创建地图 var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }), layer ], view: new ol.View({ projection: 'EPSG:4326', center: [120, 30], zoom: 7 }) }); </script> </body> </html>
运行结果如下图所示:
现有一份浙江省的GeoJSON
格式的数据,我们现在需要把它加载到地图中,然后进行相应配色和文字标注,初始的数据如下图所示:
配色和文字标注代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>OpenLayers</title> <style> html, body, #map { width: 100%; height: 100%; margin: 0; padding: 0; } </style> <link href="ol/ol.css" rel="stylesheet" /> <script src="ol/ol.js"></script> </head> <body> <div id="map"></div> <script> var layer = new ol.layer.Vector({ source: new ol.source.Vector({ projection: 'EPSG:4326', url: 'data/zhejiang.json', format: new ol.format.GeoJSON() }), style: function (feature, resolution) { var name = feature.get('name'); var color = getColor(name); var style = getStyle(name, color); return style; } }); var map = new ol.Map({ target: 'map', layers: [ layer ], view: new ol.View({ center: ol.proj.fromLonLat([120, 30]), zoom: 7 }) }); // 获取颜色 function getColor(name) { var color = 'Red'; switch (name) { case '丽水市': color = 'Red'; break; case '杭州市': color = 'Green'; break; case '温州市': color = 'Yellow'; break; case '宁波市': color = 'Blue'; break; case '舟山市': color = 'Orange'; break; case '台州市': color = 'Pink'; break; case '金华市': color = 'DodgerBlue'; break; case '衢州市': color = 'DarkGoldenRod'; break; case '绍兴市': color = 'Plum'; break; case '嘉兴市': color = 'Khaki'; break; case '湖州市': color = 'Magenta'; break; default: color = 'Red'; break; } return color; } // 获取样式 function getStyle(name, color) { var style = new ol.style.Style({ stroke: new ol.style.Stroke({ // 边界样式 color: color, // 边界颜色 width: 1 // 边界宽度 }), fill: new ol.style.Fill({ // 填充样式 color: color // 填充颜色 }), text: new ol.style.Text({ // 文字样式 text: name, // 文字内容 font: '15px Calibri,sans-serif', // 字体大小 stroke: new ol.style.Stroke({ // 文字边界样式 color: 'white', // 文字边界颜色 width: 1 // 文字边界宽度 }), fill: new ol.style.Fill({ // 文字填充样式 color: 'black' // 文字填充颜色 }) }) }); return style; } </script> </body> </html>
运行结果如下图所示:
在openlayers
中,合理使用样式或样式的组合可以让地图的视觉效果更加突出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。