添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
踏实的鸡蛋面  ·  SIGIR ...·  1 月前    · 
悲伤的沙滩裤  ·  jQuery之trigger()/trigg ...·  5 月前    · 

在前面的博客中, ol.style 这个类的出镜率很高,但限于篇幅的原因,所以一直没有进行详细介绍,下面就来介绍一下 openlayers 中的样式—— ol.style

2、样式的基本组成

一个 ol.style.Style 对象一般包含如下属性:

  • geometry——地理实体
  • image——常用于设置点要素的样式
  • stroke——常用于设置线要素的样式
  • fill——常用于设置面要素的样式
  • text——常用于设置文字标注的样式
  • 同时, ol.style.Style 类也派生出很多子类,如下所示:

  • ol.style.Circle——用于设置点样式,以圆形显示
  • ol.style.Icon——用于设置点样式,以图片的形式显示
  • ol.style.Stroke——用于设置线样式
  • ol.style.Fill——用于设置面样式
  • ol.style.RegularShape——用于设置星形样式
  • ol.style.Text——用于设置文字样式
  • 3、样式的创建

    代码如下:

    <!DOCTYPE html>
        <meta charset="utf-8" />
        <title>OpenLayers</title>
        <link href="ol/ol.css" rel="stylesheet" />
        <script src="ol/ol.js"></script>
    </head>
        <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>

    运行结果如下图所示:

    4、在要素图层中定义样式

    在上面的代码中,我们创建样式的流程一般是:先定义样式,然后创建要素,最后设置要素的样式。其实我们同样可以在 layer 中定义样式,这样就不需要频繁使用 setStyle(style) 了。在 layer 中声明样式的方法就是定义一个回调函数: style: function(feature, resolution) ,代码如下:

    <!DOCTYPE html>
        <meta charset="utf-8" />
        <title>OpenLayers</title>
        <link href="ol/ol.css" rel="stylesheet" />
        <script src="ol/ol.js"></script>
    </head>
        <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>

    运行结果如下图所示:

    5、样式的组合使用

    下面我们利用 ol.style.RegularShape 来实现一个组合样式,代码如下:

    <!DOCTYPE html>
        <meta charset="utf-8" />
        <title>OpenLayers</title>
        <link href="ol/ol.css" rel="stylesheet" />
        <script src="ol/ol.js"></script>
    </head>
        <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>

    运行结果如下图所示:

    6、一个小实例

    现有一份浙江省的 GeoJSON 格式的数据,我们现在需要把它加载到地图中,然后进行相应配色和文字标注,初始的数据如下图所示:

    配色和文字标注代码如下:

    <!DOCTYPE html>
        <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>
        <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 中,合理使用样式或样式的组合可以让地图的视觉效果更加突出。

    友情连接: 杰凡IT问答 编程自学指导 毕业设计指导 杰凡IT问答 QUX轻设计 开发 by 飞一样的编程

    如涉及侵权,请及时告知,我们会立即处理

    联系方式:飞一样的编程 QQ 1913284695 点击加好友 , 微信 jf3qcom

    桂ICP备2020009361号-2