• 【07】openlayers 矢量图层


    创建地图:

    //创建地图
    var map = new ol.Map({
        //设置显示地图的视图
        view: new ol.View({
            center: [0, 0],//义地图显示中心于经度0度,纬度0度处
            zoom: 1 //定义地图显示层级为1
        }),
        //创建地图图层
        layers: [
            //创建一个使用Open Street Map地图源的瓦片图层
            new ol.layer.Tile({
                source: new ol.source.OSM()
            })
        ],
        //让id为map的div作为地图的容器
        target: 'map'
    });

    创建矢量图层:

    //矢量图层vectorlayer
    let vectorlayer = new ol.layer.Vector({
        source:source,//矢量图层源
        style:style,//矢量图层样式
        opacity:1,//透明度,默认为1
        visible:true,//是不显示,默认true
        extent:[100,34,103,36],//可选参数,图层渲染范围,[minLon,minLat,maxLon,maxLat]
        zIndex:1,//图层渲染索引,默认是按加载顺序叠加
    })
    map.addLayer(vectorlayer)

    矢量图层关于map的方法:

    //添加矢量图层
    map.addLayer(vectorlayer)
    //删除切片图层
    map.removeLayer(vectorlayer)

    矢量图层自身方法:

    //矢量图层的常用方法
    //获取-设置,图层的可见范围
    vectorlayer.getExtent();
    vectorlayer.setExtent([100,34,103,36]);
    //获取-设置,图层最大缩放级别
    vectorlayer.getMaxZoom()
    vectorlayer.setMaxZoom(18)
    //获取-设置,图层最小缩放级别
    vectorlayer.getMinZoom()
    vectorlayer.setMinZoom(2)
    //获取-设置,图层的不透明度
    vectorlayer.getOpacity()
    vectorlayer.setOpacity(1)
    //获取-设置,图层源
    vectorlayer.getSource()
    vectorlayer.setSource(new ol.source.OSM())
    //获取-设置,图层的可见性
    vectorlayer.getVisible()
    vectorlayer.setVisible(true)
    //获取-设置,图层的Z索引
    vectorlayer.getZIndex()
    vectorlayer.setZIndex(2)
    //绑定事件-取消事件 type事件类型,listener函数体
    vectorlayer.on(type,listener)
    vectorlayer.un(type,listener)
    
    //获取与视口上给定像素相交的最高要素
    vectorlayer.getFeatures([200,600])
    //获取-设置,图层样式
    vectorlayer.getStyle()
    vectorlayer.setStyle(style)

    下面重点介绍:矢量图层样式(style) 和 矢量图层源(source)

    矢量样式:style

    let style = new ol.style.Style({
        //填充样式(面)
        fill: new ol.style.Fill({
            color: 'rgba(255, 255, 255, 0.2)'
        }),
        //描边样式(线)
        stroke: new ol.style.Stroke({
            color: '#ffcc33',
             2
        }),
        //图像样式
        image:image,
        //文字样式
        text:new ol.style.Text({
            font:'20px sans-serif',//字体大小,样式
            offsetX:0,//水平文本偏移量(以像素为单位)
            offsetY:0,//垂直文本偏移量(以像素为单位)
            scale:1,//字体放大倍数
            rotation:(Math.PI/180)*30,//旋转角度(顺时针旋转)
            text:'哇哈哈',//文字内容
            textAlign:'center',// 文字对齐方式 'left','right','center'
            fill:new ol.style.Fill({//文字填充颜色
                color: 'green'
            }),
            stroke: new ol.style.Stroke({//描边样式
                color: '#fff',
                 2
            }),
            padding:[0,0,0,0],//在文本周围填充像素
        })
    })

    矢量样式里的图像样式:image

    //图像样式(点)
    let image = new ol.style.Circle({
        radius: 10, 
        fill: new ol.style.Fill({
            color: 'red'
        }),
        stroke: new ol.style.Stroke({
            color: '#ffcc33',
             2
        })
    })
    //如果是图标
    let image = new ol.style.Icon({
        src:'',//图片来源
        color:'',//图标颜色,
        opacity:1,//透明度
        scale:1,//放大缩小倍数
        rotation:(Math.PI/180)*deg,//旋转角度,顺时针旋转
    })
    //如果是正方形
    let image = new ol.style.RegularShape({
        fill: new ol.style.Fill({
            color: 'red'
        }),//填充色
        stroke: new ol.style.Stroke({
            color: '#ffcc33',
             2
        }),//边线样式
        points: 4,//边数
        radius: 10,//半径
        angle: (Math.PI/4),//形状的角度(弧度单位)
        rotation:(Math.PI/180)*deg,//旋转角度
        rotateWithView:false,//是否跟随视图旋转形状
    })
    //如果是五角星
    let image = new ol.style.RegularShape({
        fill: new ol.style.Fill({
            color: 'red'
        }),//填充色
        stroke: new ol.style.Stroke({
            color: '#ffcc33',
             2
        }),//边线样式
        points: 5,//边数
        radius: 10,//半径
        radius2: 4,//内半径
        angle: 0//形状的角度(弧度单位)
    })
    //如果是三角形
    let image = new ol.style.RegularShape({
        fill: new ol.style.Fill({
            color: 'red'
        }),//填充色
        stroke: new ol.style.Stroke({
            color: '#ffcc33',
             2
        }),//边线样式
        points: 3,//边数
        radius: 10,//半径
        rotation: (Math.PI/180)*deg,//旋转角度
        angle: 0//形状的角度(弧度单位)
    })
    //如果是十字
    let image = new ol.style.RegularShape({
        fill: new ol.style.Fill({
            color: 'red'
        }),//填充色
        stroke: new ol.style.Stroke({
            color: '#ffcc33',
             2
        }),//边线样式
        points: 4,//边数
        radius: 10,//半径
        radius2: 0,//内半径
        angle: 0//形状的角度(弧度单位)
    })
    //如果是X型
    let image = new ol.style.RegularShape({
        fill: new ol.style.Fill({
            color: 'red'
        }),//填充色
        stroke: new ol.style.Stroke({
            color: '#ffcc33',
             2
        }),//边线样式
        points: 4,//边数
        radius: 10,//半径
        radius2: 0,//内半径
        angle: (Math.PI/4)//形状的角度(弧度单位)
    })

    矢量样式style的方法:

    //克隆
    style.clone()
    //获取
    style.getFill()
    style.getStroke();
    style.getImage();
    style.getText();
    //设置
    style.setFill(fill)
    style.setImage(image)
    style.setStroke(stroke)
    style.setText(text)    

    矢量图层源:point,line,polygon,wkt

    //矢量图层源 :point,line,polygon,wkt
    let source = new ol.source.Vector({
        features:[point,line,polygon,wkt]//矢量
    })
    //矢量点 - 图标
    let point = new ol.Feature(
            new ol.geom.Point([108,34])
        )
    //矢量 线
    let line = new ol.Feature(
            new ol.geom.LineString([[108,34],[100,34],[100,40]])
        )
    //矢量面
    let polygon = new ol.Feature(
            new ol.geom.Polygon([[[90,34],[108,34],[90,40]]])
        )
    //wkt
    let wktData = 'POLYGON((10.689 -25.092, 34.595 ' +
          '-20.170, 38.814 -35.639, 13.502 ' +
          '-39.155, 10.689 -25.092))';
    let wkt = (new ol.format.WKT()).readFeature(wktData, {
        dataProjection: 'EPSG:4326',//数据的投影
        featureProjection: 'EPSG:3857'//创建的要素几何的投影
    })

    矢量图层源:geojson

    //矢量图层源:geojson
    //加载方法一
    let source = new ol.source.Vector({
        url:'data.geojson',//geojson 路径
        format: new ol.format.GeoJSON({
            dataProjection:'EPSG:4326',//默认数据投影'EPSG:4326'
        })
    })
    //加载方法二
    let source = new ol.source.Vector({
        features: (new ol.format.GeoJSON()).readFeatures(geojsonData)
    })

    矢量图层源:topjson

    //矢量图层源:topjson
    let source = new ol.source.Vector({
        url: 'topjson.json',//路径
        format: new ol.format.TopoJSON({
            layers: ['countries'] //子级名称
        }),
        overlaps: false,//该源可能具有重叠的几何形状,是否重叠
    })

    矢量图层源:kml

    //矢量图层源:kml
    let source = new ol.source.Vector({
        url: "data.kml",
        format: new ol.format.KML({
            extractStyles:true,//从KML中提取样式
            showPointNames:true,//将名称显示为包含点的地标的标签
            writeStyles:true,//将样式写入KML
        })
    })

    矢量图层源:gpx

    let source = new ol.source.Vector({
        // GPX数据路径
        url: 'data.gpx',
        // 指定数据格式为GPX
        format: new ol.format.GPX()
    })

    矢量图层源:mvt

    let source = new ol.source.VectorTile({
        format: new ol.format.MVT(),
        url: '',//数据路径
    })

    矢量图层源 source 的自身方法:

    //source 方法
    //添加-删除feature
    source.addFeature(feature)
    source.removeFeature(feature)
    source.addFeatures(features)
    //遍历feature
    source.forEachFeature(callback)
    //获取
    source.getFeatureById(id)
    source.getFeatures()
    //绑定事件-取消事件 type事件类型,listener函数体
    source.on(type,listener)
    source.un(type,listener)

    矢量点聚合Cluster

    //点聚合Cluster
    let clusterSource = new ol.source.Cluster({
      distance:20,//间隔最小距离,默认20像素
      source: source,//资源,点
    });
    //设置距离
    clusterSource.setDistance(10)
  • 相关阅读:
    Python学习笔记10:上下文协议
    Python学习笔记9:类
    使用率激增250%,这份报告再将 Serverless 推向幕前
    国内首篇云厂商 Serverless 论文入选全球顶会:突发流量下,如何加速容器启动?
    如何评估 Serverless 服务能力?这份报告给出了 40 条标准
    飞猪基于 Serverless 的云+端实践与思考
    Serverless:这真的是未来吗?(二)
    Serverless:这真的是未来吗?(一)
    被解救的代码
    云厂商下一块必争之地就是它了!
  • 原文地址:https://www.cnblogs.com/MaShuai666/p/12495300.html
Copyright © 2020-2023  润新知