美文网首页
Openlayers问题及 openlayer详解

Openlayers问题及 openlayer详解

作者: 莫soso | 来源:发表于2020-01-07 16:58 被阅读0次

    壹、 常见问题

    备注:

    如同现openlayer官网的实例代码所以用的是VectorLayer的格式,项目是在该页面上引用的ol;

    项目在全局引用了ol,所以用的ol.layer.Vector这样的格式;

    部分代码是在word里改的可能有错误,粘贴复制需要检查。

    1、 tilelayer与vectorlayer

    tilelayer为瓦片数据,获取到的数据是以图片的形式展示的,所以无法获取包含的属性值;

      var imgayer = new TileLayer({

            source: new TileWMS({

              url: 'http://xx.xxx.xxxx /geoserver/'testosmmap /wms',

              params:{

     LAYERS: 'testosmmap:xxxx,

                TILED: true,

                VERSION: '1.1.0'

    },

              serverType: 'geoserver',

              wrapX: false,

    })

    })

    vectorlayer获取到的为矢量数据,openlayer默认的样式:点为中间白色边框为蓝色的圆圈,线为蓝色,面为中间白色边框蓝色;在添加矢量数据的时候可以根据自己想要的样子修改vectorlayer里的style,改变其样式。

    var style = new ol.style.Style({

            fill: new ol.style.Fill({

              color: 'RGBA(27,84,146,0.3)'

    }),

            stroke: new ol.style.Stroke({

              width: 4,

              color: 'RGBA(27,84,146,1)'

    }),

            image: new ol.style.Icon({

              anchor: [0.5, 30],

              anchorXUnits: 'fraction',

              anchorYUnits: 'pixels',

              opacity: 0.95,

              src: that.point_icon //图片src

    }),

            text: new ol.style.Text({

              font: 'bold 15px "Open Sans", "Arial Unicode MS", "sans-serif"',

              placement: 'point',

              fill: new ol.style.Fill({

                color: 'black'

    }),

              offsetY: 5,

    })

    })

          //点线面要素图层

      // 这里的arr为要素集

          Var vectorsource1 = new ol.source.Vector({

            features: arr

    })

          Var vectorlayer1 = new ol.layer.Vector({

            source: vectorsource1,

     //要素的name值显示在要素上

            style: function (feature) {

              style.getText().setText(feature.get('name'))

              return style

    }

    })

    通过geoserver添加vectorlayer矢量数据:

            Var vectorsource= new VectorSource({ 

             //geoserver下预览选择geojson格式的url 

              url: 'http://xx.xxx.xxxx/geoserver/testosmmap/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=testosmmap%3Apeople_point&maxFeatures=50&outputFormat=application%2Fjson',

              format: new GeoJSON()

    })

            Var vectorlayer = new VectorLayer({

              source: vectorsource_

              style: new Style({

                image: new Icon({

                  src: people

    })

    })

    })

    2、 获取矢量要素的属性值getProperties()及几何信息getGeometry()

     var features = vectorsource.getFeatures()

            for (var m = 0; m < feature.length; m++) {

     var prop = features[m].getProperties()

     var geom = features[m].getGeometry()

    }

    3、 获取当前的zoom比例缩放值

    当我们要根据其zoom的值来改变一些地图上的东西时,这时候就要监听zoom的变化,实时获取当前的zoom值:(在moveend,缩放结束时获取当前地图的缩放比例)

    map.on('moveend', function (event) {

            var zoom = map.getView().getZoom()

    })

    4、 获取当前地图的范围,并根据当前范围设置中心点,定位功能

    比如说根据一个点击事件,定位到该要素,将该要素设为中心点:(通过getGeomety()获取该要素的几何信息,再根据几何信息获取该要素的范围,最后设置地图的视图即可)

     var geometry = feature.getGeometry();

    var extent = geometry.getExtent();

        map.getView().fit(extent, map.getSize());

    5、 Drawend事件,绘制点线面结束事件

    绘制结束后,获取本次绘制的要素feature

    draw.on('drawend', function (event) {

            that.feature = event.feature

     //获取feature的坐标点

            var coordinate = event.feature.getGeometry().getCoordinates()

            map.removeInteraction(draw)

    }) 

    6、 添加select选中事件,Selected选中后触发事件

     var select = new ol.interaction.Select()

          map.addInteraction(select)

          select.on('select', function (evt) {

     //选中的要素

            var feature = evt.selected[0]

    })

    7、 地图点击事件,click、doubleclick、pointermove、pointerdrag、pointerdown

    //单击事件

    map.on('click', function (evt) {

         var feature1 = map.forEachFeatureAtPixel(evt.pixel, function (feature){

              return feature

    })

    })

    //鼠标移动事件

    map.on("pointermove", function(e) {

      varfeature1 = map.forEachFeatureAtPixel(e.pixel, function (feature){

              return feature

    })

    });

    //双击事件

    map.on("doubleclick", function(e) {

      varfeature1 = map.forEachFeatureAtPixel(e.pixel, function (feature){

              return feature

    })

    });

    //鼠标拖拽事件

    //(拖拽时改变鼠标样式的操作)

      map.on('pointerdrag', function (evt) {

            $('#map').removeClass('mapup')

            $('#map').addClass('mapdown')

    })

          map.on('pointerup', function() {

            $('#map').addClass('mapup')

    })

    8、 添加超图服务器上的data数据即矢量数据,sql查询、几何查询添加数据

    //通过sql查询

    var geometryParam = new SuperMap.GetFeaturesBySQLParameters({

                queryParameter:{

                  name: 'abc'

    },

     //abc为data的数据源名称;xyz为数据集名称

                datasetNames: ['abc: xyz'],

                toIndex: 20000,

                maxFeatures: 20000

    })

    var url = 'http://xxx.xxx.xxxx/iserver/services/xxx/rest/data'

              var icon = that.icon1

              that.adddata(url, geometryParam, icon)

    //添加的方法

    adddata (url, geometryParam, icon) {

          let that = this

          new ol.supermap.FeatureService(url).getFeaturesBySQL(

            geometryParam,

            function (serviceResult) {

              var features = new ol.format.GeoJSON().readFeatures(

                serviceResult.result.features

    )

              var vectorSource = new ol.source.Vector({

                features: features,

                wrapX: false

    })

              var style = new ol.style.Style({

                image: new ol.style.Icon({

                  anchor: [0.5, 30],

                  anchorXUnits: 'fraction',

                  anchorYUnits: 'pixels',

                  opacity: 0.95,

                  src: icon

    }),

                text: new ol.style.Text({

                  font: 'bold 15px "Open Sans", "Arial Unicode MS", "sans-serif"',

                  placement: 'point',

                  fill: new ol.style.Fill({

                    color: 'black'

    }),

                  offsetY: 5,

    })

    })

              var resultLayer = new ol.layer.Vector({

                source: vectorSource,

                // style: style

                style: function (feature) {

                  style.getText().setText(feature.get('NAME'));

                  return style

    }

    })

              map.addLayer(resultLayer)

              // }

    })

    },

    //通过几何查询

    var geometryParam = new SuperMap.GetFeaturesByGeometryParameters({

    //abc为data的数据源名称;xyz为数据集名称

          datasetNames: [abc:xyz],

          geometry: polygon,

          spatialQueryMode: 'INTERSECT'

    })

    var url = 'http://xxx.xxx.xxxx/ iserver/services/xxxx /rest/maps/xxxx'

            new ol.supermap.FeatureService(url).getFeaturesByGeometry(geometryParam, function (serviceResult) {

          getdata = serviceResult

          var vectorSource = new ol.source.Vector({

            features: (new ol.format.GeoJSON()).readFeatures(serviceResult.result.features),

            wrapX: false

    })

                var resultLayer = new ol.layer.Vector({

            source: vectorSource

    })

                resultLayer.setProperties({

            'layerType': 'query_result'

    })

                map.addLayer(resultLayer)

    })

    }

    9、 想到别的再写

    貳、 Openlayer详解

    等下次再写,困了。

    相关文章

      网友评论

          本文标题:Openlayers问题及 openlayer详解

          本文链接:https://www.haomeiwen.com/subject/bexdactx.html