Geoserver + Openlayers 拉框查询

栏目: 编程工具 · 发布时间: 5年前

内容简介:这一部分是主要针对用户做此功能的时候,遇到的问题进行总结在引入 Openlayers 的 JS 文件的时候,注意版本号,5.0+ 的版本中大量应用了ES6 的最新特性,如果直接引入 5.0+ ,可能与前期的项目有所冲突,所以这里建议使用低版本,同样能完成拉框查询这里主要通过 Draw 对象进行框选的,Draw 的本质是在图层上兴建 Shape ,那么在下一次框选的时候,需要把上次 Draw 的框去掉:(回答了网上用户的提问:openlayers 在重新画图(圆或矩形)如何清除之前的图,Openlayer删除
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>OpenLayers</title>
    <link rel="stylesheet" href="geoserver/ol.css" type="text/css">
    <script src="geoserver/ol.js"></script>
    <script src="bower_components/jquery/dist/jquery.min.js"></script>
    <link rel="stylesheet" href="plugins/layui-v2.4.3/layui/css/layui.css">
    <script src="plugins/layui-v2.4.3/layui/layui.js" charset="utf-8"></script>
    <link rel="stylesheet" href="https://openlayers.org/en/v3.20.1/css/ol.css" type="text/css">
    <#--注意openlayer的版本号,高版本存在es6中新语法不兼容的情况-->
    <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script>
    <script src="https://openlayers.org/en/v3.20.1/build/ol.js"></script>
</head>
<style>
    #map {
        height: 600px;
        /*width: 1024px;*/
        /* float: left;*/
    }
</style>
<body>
<div id="map">
<form class="form-inline">
    <label>查询类型</label>
    <select id="type">
        <option value="None">None</option>
        <option value="Point">点击</option>
        <option value="Polygon">多边形</option>
        <option value="Circle">拉框</option>
    </select>
</form>
</div>
<script>
    var map = new ol.Map({
        target: 'map',
        view: new ol.View({
            projection: 'EPSG:4326',
            center: [104.07, 30.72],
            zoom: 7
        })
    });
    var wfsParams = {
        service: 'WFS',
        version: '1.1.1',
        request: 'GetFeature',
        typeName: 'map_dz:tl_lx_g',  //图层名称,可以是单个或多个
        outputFormat: 'text/javascript',  //重点,不要改变
        format_options: 'callback:loadFeatures'  //回调函数声明
    };

    var vectorSource = new ol.source.Vector({
        format: new ol.format.GeoJSON(),
        loader: function (extent, resolution, projection) {  //加载函数
            var url = 'http://192.168.1.113:8080/geoserver/map_dz/wms';
            $.ajax({
                url: url,
                data: $.param(wfsParams),   //传参
                type: 'GET',
                dataType: 'jsonp',   //解决跨域的关键
                jsonpCallback: 'loadFeatures'  //回调

            });
        },
        strategy: ol.loadingstrategy.tile(new ol.tilegrid.createXYZ({
            maxZoom: 20
        })),
        projection: 'EPSG:4326'
    });
    //回调函数使用
    window.loadFeatures = function (response) {
        vectorSource.addFeatures((new ol.format.GeoJSON()).readFeatures(response));  //载入要素
    };
    var vectorLayer = new ol.layer.Vector({
        source: vectorSource,
        style: new ol.style.Style({
            stroke: new ol.style.Stroke({
                color: 'rgba(0, 0, 255, 1.0)',
                width: 2
            })
        })
    });
    map.addLayer(vectorLayer);
    var draw;
    var typeSelect = document.getElementById('type');
    var value;
    var num=10;//用于删除之前的框,表示号,随便取一个
    function addInteraction() {
        if (value !== 'None') {
            if (value === 'Polygon') {
                draw = new ol.interaction.Draw({
                    source: vectorLayer.getSource(),
                    style: new ol.style.Style({
                        stroke: new ol.style.Stroke({
                            color: '#ffcc33',
                            width: 2
                        }),
                        image: new ol.style.Circle({
                            radius: 7,
                            fill: new ol.style.Fill({
                                color: '#ffcc33'
                            })
                        })
                    }),
                    type: value
                });
            } else if (value === 'Circle') {
                draw = new ol.interaction.Draw({
                    source: vectorLayer.getSource(),
                    style: new ol.style.Style({
                        stroke: new ol.style.Stroke({
                            color: '#ffcc33',
                            width: 2
                        }),
                        image: new ol.style.Circle({
                            radius: 7,
                            fill: new ol.style.Fill({
                                color: '#ffcc33'
                            })
                        })
                    }),
                    type: value,
                    geometryFunction: ol.interaction.Draw.createBox()
                });
            } else if (value === 'Point') {
                draw = new ol.interaction.Draw({
                    source: vectorLayer.getSource(),
                    style: new ol.style.Style({
                        stroke: new ol.style.Stroke({
                            color: '#ffcc33',
                            width: 2
                        }),
                        image: new ol.style.Circle({
                            radius: 7,
                            fill: new ol.style.Fill({
                                color: '#ffcc33'
                            })
                        })
                    }),
                    type: value
                });
            }

            map.addInteraction(draw);
            //删除之前draw的部分
            draw.on('drawstart',function(evt) {
                var featureAdd=vectorLayer.getSource().getFeatureById(num);
                if(featureAdd!=null){
                    vectorLayer.getSource().removeFeature(featureAdd);
                }
            });
            //绘图结束,处理选中部分
            draw.on('drawend',function(e){
                e.feature.setId(num);
                var geom=e.feature.getGeometry();
                var coor = geom.v;
                mapSelect(coor);
            });
        }
    }
    //选择事件
    typeSelect.onchange = function() {
        value = typeSelect.value;
        map.removeInteraction(draw);
        addInteraction();
    };

    //draw图像与原始数据相交
    function mapSelect(coor) {
        if(value=='Point') {
            coor = [coor[0]-0.0001,coor[1]-0.0001,coor[0]+0.0001,coor[1]+0.0001];
        }
        var FILTER = '<Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"><BBOX><PropertyName>geom</PropertyName><gml:Envelope srsName="EPSG:4326"><gml:lowerCorner>' + coor[0] + '  ' + coor[1] + '</gml:lowerCorner><gml:upperCorner>' + coor[2] + '  ' + coor[3] + '</gml:upperCorner></gml:Envelope></BBOX></Filter>';
        getFeature({
            typename: 'map_dz:tl_lx_g',//查询的服务图层名称
            filter: FILTER,//查询条件
            callback: 'getIdentifyroadGrid'//查询的回调函数
        });
    }
    var selectNum=[];
    var geojsonFormat = new ol.format.GeoJSON({defaultDataProjection: "EPSG:4326"});
    function getIdentifyroadGrid(res) {
        var queryData = [];
        var features = geojsonFormat.readFeatures(res);

       for (var nu = 0; nu<selectNum.length;nu++) {
            var featureSelect=vectorLayer.getSource().getFeatureById(selectNum[nu]);
            if(featureSelect!=null) {
                featureSelect.setStyle(
                        new ol.style.Style({
                            stroke: new ol.style.Stroke({
                                color: 'rgba(0, 0, 255, 1.0)',
                                width: 2
                            })
                        }));
            }
        }
        selectNum=[];
        for (var i = 0; i < features.length; i++) {
            var feature = features[i];
            console.log(feature);
            selectNum.push(feature.f);
            var featureSelectCurrent=vectorLayer.getSource().getFeatureById(feature.f);
            featureSelectCurrent.setStyle(
                    new ol.style.Style({
                        stroke: new ol.style.Stroke({
                            color: '#ff4118',
                            width: 2
                        })
                    }));
            var lxmc = feature.H["lxmc"];
            var ldbm = feature.H["ldbm"];
            var lxbh = feature.H["lxbh"];
            var result = {
                "lxmc": lxmc,
                "ldbm": ldbm,
                "lxbh": lxbh,
                "setindex": i
            };
            queryData.push(result)
        }
        console.log(selectNum);
        var tableIns=null;
        var dataTable = "<table class=\"layui-table\" lay-filter=\"demo\" id=\"joinTab\"></table>";
        layui.use(['table', 'layer'], function () {
            var table = layui.table;
            var layer = layui.layer;
            var index = layer.open({
                type: 1 //Page层类型
                , title: '要素属性'
                , shade: 0 //遮罩透明度
                , anim: 0 //0-6的动画形式,-1不开启
                , content: dataTable
                , offset: ['250px', '290px']
                , zIndex: 1
                , scrollbar: false
                , resize: false
                , skin: 'layui-layer-molv'
                , closeBtn: 2
                , btn: ["关闭"]
                , yes: function (index) {
                    layer.close(index);
                }
                , cancel: function () {
                }
            });
            tableIns = table.render({
                elem: "#joinTab",
                width: "auto",
                height: "auto",
                data: queryData,
                initSort: {field: 'lxbh', type: 'desc'},
                cols: [[
                    {field: 'lxmc', title: '路线名称', width: 150, align: 'center', sort: true},
                    {field: 'ldbm', title: '路线编号', width: 150, align: 'center', sort: true},
                    {field: 'lxbh', title: '路段编码', width: 150, align: 'center', sort: true}
                ]]
            });
            layer.style(index, {
                opacity: 0.8
            });
        });

        if (tableIns) {
            tableIns.reload({
                data: queryData
            });
        } else {
            // console.log("Do Nothing!");
        }
    }

    //请求wfs数据
    function getFeature(options) {
        $.ajax(/*'http://192.168.1.113:8080/geoserver/map_dz/wms', */{
            type: 'GET',
            url: 'http://192.168.1.113:8080/geoserver/map_dz/wms',
            data: {
                service: 'WFS',
                version: '1.1.1',
                request: 'GetFeature',
                typename: options.typename,
                srsname: options.srid,
                outputFormat: 'text/javascript',
                viewparams: options.viewparams,
                bbox: (options.extent === undefined) ? undefined : options.extent.join(',') + ',' + options.srid,
                filter: options.filter
            },
            dataType: 'jsonp',
            jsonp: 'format_options',
            jsonpCallback: 'callback:' + options.callback
        });

    }

</script>
</body>
</html>

复制代码

2.代码解释

这一部分是主要针对用户做此功能的时候,遇到的问题进行总结

在引入 Openlayers 的 JS 文件的时候,注意版本号,5.0+ 的版本中大量应用了ES6 的最新特性,如果直接引入 5.0+ ,可能与前期的项目有所冲突,所以这里建议使用低版本,同样能完成拉框查询

Geoserver + Openlayers 拉框查询

这里主要通过 Draw 对象进行框选的,Draw 的本质是在图层上兴建 Shape ,那么在下一次框选的时候,需要把上次 Draw 的框去掉:(回答了网上用户的提问:openlayers 在重新画图(圆或矩形)如何清除之前的图,Openlayer删除上一次绘制的图)

首先记录框选时,增加的框框的ID

Geoserver + Openlayers 拉框查询

然后在下次框选之前,通过 id 找到上次那个 Feature,并删掉

Geoserver + Openlayers 拉框查询

对选中的对象进行重新设置颜色,这里主要通过 Style 属性进行处理:

Geoserver + Openlayers 拉框查询

在下次选中对象的时候,删除上次选中对象的样式 将选中对象的 id 压到数组汇总

Geoserver + Openlayers 拉框查询

在下次设置选中对象的样式之前,遍历数组,对上次选中的feature进行样式设置(设置为原来的样式)

Geoserver + Openlayers 拉框查询

3.结果

Geoserver + Openlayers 拉框查询
Geoserver + Openlayers 拉框查询
Geoserver + Openlayers 拉框查询

参考

https://www.cnblogs.com/kkyyhh96/p/6379515.html https://blog.csdn.net/songjian1314/article/details/17263865 https://blog.csdn.net/shaxiaozilove/article/details/60780175 https://blog.csdn.net/m0_37659871/article/details/80598589 https://openlayers.org/en/latest/examples/draw-features.html https://openlayers.org/en/latest/examples/draw-shapes.html


以上所述就是小编给大家介绍的《Geoserver + Openlayers 拉框查询》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序是怎样跑起来的

程序是怎样跑起来的

[日] 矢泽久雄 / 李逢俊 / 人民邮电出版社 / 2015-4 / 39.00元

本书从计算机的内部结构开始讲起,以图配文的形式详细讲解了二进制、内存、数据压缩、源文件和可执行文件、操作系统和应用程序的关系、汇编语言、硬件控制方法等内容,目的是让读者了解从用户双击程序图标到程序开始运行之间到底发生了什么。同时专设了“如果是你,你会怎样介绍?”专栏,以小学生、老奶奶为对象讲解程序的运行原理,颇为有趣。本书图文并茂,通俗易懂,非常适合计算机爱好者及相关从业人员阅读。一起来看看 《程序是怎样跑起来的》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具