zoukankan      html  css  js  c++  java
  • Geoserver基本使用、WMS服务发布与OpenLayers测试

    1.Geoserver与OpenLayers的下载

    Geoserver:http://geoserver.org/

    OpenLayers:http://openlayers.org/

    2.安装部署Geoserver

    环境:jdk 1.7,geoserver-2.5

    配置:修改geoserver-2.5/ect/jetty.xml 的端口为8089,避免端口冲突。

     <Call name="addConnector">
          <Arg>
              <New class="org.mortbay.jetty.nio.SelectChannelConnector">
                <Set name="port"><SystemProperty name="jetty.port" default="8089"/></Set>
                <Set name="maxIdleTime">30000</Set>
                <Set name="Acceptors">2</Set>
                <Set name="confidentialPort">8443</Set>
              </New>
          </Arg>
        </Call>

    3.启动、停止Geoserver服务器,准备地图数据

    启动:在geoserver-2.5/bin下启动startup.bat

    停止:在geoserver-2.5/bin下启动shutdown.bat

    数据:可以说数据文件也可以是数据库数据,数据库支持PostGIS、Oralce、Mysql等数据库,这里我们准备的是*.shp数据。

    注:将shp格式数据放在geoserver-2.5/data_dir/data下。

    4.创建工作区

    启动服务器后,使用用户:  admin ,密码:geoserver登录系统创建工作区。

    此处以chinamap为例。

    5.添加数据存储并发布层

    这里的数据存储名称代表一个分层layer,在同一个工作区不允许重复分层名称存在。

    添加数据存储并选择数据类型

    选择对应类型的数据,这里我们选择shp类型的。

    若上面“数据源名称”填写的是poi,那么得到的新建图层就是poi.

    点击“发布”此图层,设置发布参数:

    定义SRS选择数据的EPSG投影类型,这里因为数据的关系我选的是EPSG:4600,点击保存"数据存储"层(layer)发布成功。

    6.Layer Preview地图层预览

    最终加入的数据层可以在此处看到,这里都是添加后的数据层。

    图层(Layers)中也可以看到刚才添加的层.

    另外在系统欢迎界面还可以看到所有的层、商店、工作区的统计视图,点击即可查看详情.

    7.发布geoserverWMS服务

    修改chinamap工作区的参数,勾选WMS服务,修改后点击保存.

    注:这里有个“代理服务器URL",建议先保持为空,不要填写任何内容。

    验证WMS是否发布成功,在浏览器中输入地址:http://192.168.1.147:8089/geoserver/wms,看到如下图所示内容表示发布成功。

    8.Openlayers编写客户端访问WMS服务

    创建一个web项目GisOpenlayersGeoserver,OpenLayers的包添加的时候很多注意不要加入不必要的包。

    创建JSP页面测试地图,index.jsp文件内容如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ include file="/common/taglibs.jsp"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">  
    <html xmlns="http://www.w3.org/1999/xhtml">  
        <head>  
            <title>OpenLayers map preview</title>  
            <!-- Import OL CSS, auto import does not work with our minified OL.js build -->  
            <link rel="stylesheet" type="text/css" href="${ctx}/openlayers/theme/default/style.css"/>  
            <link rel="stylesheet" href="${ctx}/openlayers/theme/default/google.css" type="text/css"/>  
            <!-- Basic CSS definitions -->  
            <style type="text/css">  
                /* General settings */  
                body {  
                    font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;  
                    font-size: small;  
                }  
                /* Toolbar styles */  
                #toolbar {  
                    position: relative;  
                    padding-bottom: 0.5em;   
                     
                }  
                  
                /* The map and the location bar */  
                #map {  
                    clear: both;  
                    position: relative;  
                    width: 100%;  
                    height: 620px;  
                    border: 1px solid black;  
                }  
                  
                #wrapper {  
                    width: 698px;  
                }  
                  
                #location {  
                    float: right;  
                }  
      
                /* Styles used by the default GetFeatureInfo output, added to make IE happy */  
                table.featureInfo, table.featureInfo td, table.featureInfo th {  
                    border: 1px solid #ddd;  
                    border-collapse: collapse;  
                    margin: 0;  
                    padding: 0;  
                    font-size: 90%;  
                    padding: .2em .1em;  
                }  
                  
                table.featureInfo th {  
                    padding: .2em .2em;  
                    text-transform: uppercase;  
                    font-weight: bold;  
                    background: #eee;  
                }  
                  
                table.featureInfo td {  
                    background: #fff;  
                }  
                  
                table.featureInfo tr.odd td {  
                    background: #eee;  
                }  
                  
                table.featureInfo caption {  
                    text-align: left;  
                    font-size: 100%;  
                    font-weight: bold;  
                    text-transform: uppercase;  
                    padding: .2em .2em;  
                }  
            </style>  
            <!-- Import OpenLayers, reduced, wms read only version -->  
           <script src="${ctx}/openlayers/lib/OpenLayers.js" ></script>  
           <script src="${ctx}/jslib/jquery-1.10.2.min.js" ></script>  
           <!--  <script src="http://maps.google.com/maps/api/js?sensor=false"></script>  --> 
            <script defer="defer" type="text/javascript">  
                var map, measureControls;  
                var untiled;  
                var tiled;  
                  
                function init(){  
                    format = 'image/png';  
                    var bounds = new OpenLayers.Bounds(  //地图区域范围  
                        74.137, 6.319,  
                        135.086, 53.558  
                    );  
                    var options = {  
                        controls: [],  
                        maxExtent: bounds,  
                        maxResolution: 0.23808203125,  
                        projection: "EPSG:4600",  
                        numZoomLevels: 15,   
                        units: 'degrees'  
                    };  
                    map = new OpenLayers.Map('map', options);  
              
                   /**********************加载图层 开始*******************************/  
                  /*   tiled = new OpenLayers.Layer.WMS(  //图层组  
                        "基础图层", "http://localhost:8080/geoserver/wms",  
                        {  
                            height: '330',  
                             '698',  
                            layers: 'sf',  
                            styles: '',  
                            srs: 'EPSG:4326',  
                            format: format,  
                            tiled: 'true',  
                            tilesOrigin : map.maxExtent.left + ',' + map.maxExtent.bottom  
                        },  
                        {  
                            buffer: 0,  
                            displayOutsideMaxExtent: true  
                        }   
                    );*/  
                      
                    var streams = new OpenLayers.Layer.WMS(    //图层组  
                        "中国地州界", "http://192.168.1.147:8089/geoserver/wms",  
                        {  
                           height: '330',  
                             '698',  
                            layers: 'chinamap:中国地州界',  
                            styles: '',  
                            srs: 'EPSG:4600',  
                            format: format,  
                            tiled: 'true',  
                            tilesOrigin : map.maxExtent.left + ',' + map.maxExtent.bottom  
                        },  
                        {  
                            buffer: 0,  
                            displayOutsideMaxExtent: true  
      
                        }   
                    );  
                  
                    untiled = new OpenLayers.Layer.WMS(  //单独图层  
                        "省会城市", "http://192.168.1.147:8089/geoserver/wms",  
                        {  
                            height: '330',  
                             '698',  
                            layers: 'chinamap:省会城市',  
                            styles: '',  
                            srs: 'EPSG:4600',  
                            transparent: "true",  
                            format: format  
                        },  
                        {singleTile: true, ratio: 1}   
                    );  
                   //  untiled.setVisibility(false); //设置为不显示  
                   
                    //var gmap = new OpenLayers.Layer.Google("Google Streets", {visibility: false});      
                    /* var dm_wms = new OpenLayers.Layer.WMS( "点图层",  
                    "http://127.0.0.1:8080/geoserver/wms",  
                    {layers: "sf:bugsites,sf:archsites",  
                     transparent: "true", format: "image/png"});*/  
      
                   map.addLayers([streams,untiled]);  
                  /********************END 加载图层*********************************/  
      
                   /************************加载一般的基础控件********************************/     
                    map.addControl(new OpenLayers.Control.PanZoomBar({  //添加平移缩放工具条  
                        position: new OpenLayers.Pixel(2, 15)  
                    }));  
                    map.addControl(new OpenLayers.Control.Navigation());  //双击放大,平移  
                    map.addControl(new OpenLayers.Control.Scale($('scale')));  //获取地图比例尺  
                    map.addControl(new OpenLayers.Control.MousePosition({element: $('location')}));  //获取鼠标的经纬度  
                    map.setCenter(new OpenLayers.LonLat(100.254, 35.25), 1);  //添加平移缩放工具条  
                    map.addControl(new OpenLayers.Control.OverviewMap());  //添加鹰眼图  
                    map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));  //图层切换工具              
                    map.addControl(new OpenLayers.Control.Permalink('xxxx'));  //添加永久链接  
                    //map.addControl(new OpenLayers.Control.MouseToolbar());  
      
                    //map.zoomToMaxExtent();  
                    var zb=new OpenLayers.Control.ZoomBox({out:true});  
                    var panel = new OpenLayers.Control.Panel({defaultControl: zb});  
                    map.addControl(panel);  
                 /************END************加载一般的基础控件********************************/     
      
                   /***********************鼠标点击,获取图层数据*******************************/     
                    map.events.register('click', map, function (e) {  
                        document.getElementById('nodelist').innerHTML = "Loading... please wait...";  
                        var params = {  
                            REQUEST: "GetFeatureInfo",  
                            EXCEPTIONS: "application/vnd.ogc.se_xml",  
                            BBOX: map.getExtent().toBBOX(),  
                            X: e.xy.x,  
                            Y: e.xy.y,  
                            INFO_FORMAT: 'text/html',  
                            QUERY_LAYERS: map.layers[0].params.LAYERS,  
                            FEATURE_COUNT: 50,  
                            Layers: 'ok',  
                            Styles: '',  
                            Srs: 'EPSG:4600',  
                            WIDTH: map.size.w,  
                            HEIGHT: map.size.h,  
                            format: format};  
                        OpenLayers.loadURL("http://192.168.1.147:8089/geoserver/wms", params, this, setHTML, setHTML);  
                        OpenLayers.Event.stop(e);  
                    });  
                  /**************END*********鼠标点击,获取图层数据*******************************/     
      
                /**********************************点、线、面测量开始**********************************************/  
                 var sketchSymbolizers = {  
                    "Point": {  
                        pointRadius: 4,   
                        graphicName: "square",  
                        fillColor: "white",  
                        fillOpacity: 1,  
                        strokeWidth: 1,  
                        strokeOpacity: 1,  
                        strokeColor: "#333333"  
                    },  
                    "Line": {  
                        strokeWidth: 3,  
                        strokeOpacity: 1,  
                        strokeColor: "#666666",  
                        strokeDashstyle: "dash"  
                    },  
                    "Polygon": {  
                        strokeWidth: 2,  
                        strokeOpacity: 1,  
                        strokeColor: "#666666",  
                        fillColor: "white",  
                        fillOpacity: 0.3  
                    }  
                };  
                var style = new OpenLayers.Style();  
                style.addRules([  
                    new OpenLayers.Rule({symbolizer: sketchSymbolizers})  
                ]);  
                 var styleMap = new OpenLayers.StyleMap({"default": style});  
                 measureControls = {  
                    line: new OpenLayers.Control.Measure(  
                        OpenLayers.Handler.Path, {  
                            persist: true,  
                            handlerOptions: {  
                                layerOptions: {styleMap: styleMap}  
                            }  
                        }  
                    ),  
                    polygon: new OpenLayers.Control.Measure(  
                        OpenLayers.Handler.Polygon, {  
                            persist: true,  
                            handlerOptions: {  
                                layerOptions: {styleMap: styleMap}  
                            }  
                        }  
                    )  
                };  
                 var control;  
                for(var key in measureControls) {  
                    control = measureControls[key];
                    control.events.on({  
                        "measure": handleMeasurements,  
                        "measurepartial": handleMeasurements  
                    });  
                    map.addControl(control);  
                }  
                /***************************END************点,线、面积测量*****************************************/  
      
                  //添加点标注的图层  
                  markers = new OpenLayers.Layer.Markers("markers");  
                  map.addLayer(markers);    
                  markers.setZIndex(200);  
                  map.zoomTo(2);  
      
           }  
                  
            //获取面积的结果赋值  
              function handleMeasurements(event) {  
                var geometry = event.geometry;  
                var units = event.units;  
                var order = event.order;  
                var measure = event.measure;  
                var element = document.getElementById('output');  
                var out = "";  
                if(order == 1) {  
                    out += "面积为: " + measure.toFixed(3) + " " + units;  
                } else {  
                    out += "面积为: " + measure.toFixed(3) + " " + units + "<sup>2</" + "sup>";  
                }  
                element.innerHTML = out;  
            }  
            function setHTML(response){  
                document.getElementById('nodelist').innerHTML = response.responseText;  
            };  
            //缩小  
            function zoomOut(){  
                map.zoomOut();  
            }  
            //放大  
            function zoomIn(){  
                map.zoomIn();  
            }  
            //获取地图数据  
            function getSize(){  
                alert(map.getSize()+",高度为="+map.getSize().h);  
            }  
            //切换鼠标事件功能  
            function toggleControl(_value) {  
                  
                for(key in measureControls) {  
                    var control = measureControls[key];  
                    if(_value == key ) {  
                        control.activate();  
                    } else {  
                        control.deactivate();  
                    }  
                }  
            }  
      
            /*********************拉宽并获取经纬度坐标系*********************************/  
            function boxExtend(){  
                var controlBox = new OpenLayers.Control();  
                  OpenLayers.Util.extend(controlBox, {  
                        draw: function () {  
                            this.box = new OpenLayers.Handler.Box( controlBox,  
                                {"done": this.notice},{ "persist": true},  
                                {keyMask:OpenLayers.Handler.MOD_SHIFT });  
                            this.box.activate();  
                        },  
      
                        notice: function (bounds) {       
                            var ll = map.getLonLatFromPixel(new OpenLayers.Pixel(bounds.left, bounds.bottom));   
                            var ur = map.getLonLatFromPixel(new OpenLayers.Pixel(bounds.right, bounds.top));   
                            alert(ll.lon.toFixed(4) + ", " +   
                                  ll.lat.toFixed(4) + ", " +   
                                  ur.lon.toFixed(4) + ", " +   
                                  ur.lat.toFixed(4));  
                        }  
                    });  
                map.addControl(controlBox);  
            }  
            var markers,marker;  
            var markArr=new Array();  
            function addMarker(){  
                 var url = 'http://www.openlayers.org/dev/img/marker.png';  
                    var sz = new OpenLayers.Size(20, 20);  //尺寸大小  
                    var calculateOffset = function(size) {  
                                        return new OpenLayers.Pixel(-(size.w/2), -size.h);  
                                     };  
                    var icon = new OpenLayers.Icon(url, sz, null, calculateOffset);  
                      
                    marker = new OpenLayers.Marker(new OpenLayers.LonLat(113.34851,33.22630), icon);  
                    markers.addMarker(marker);  
      
                   // marker = new OpenLayers.Marker(madrid, icon.clone());  
                   // markers.addMarker(marker);              
            }  
             function removeMarker() {  
                    markers.removeMarker(marker);  
             }  
             /*******************多边形获取经纬度坐标系*************************/  
             function test(){  
                var getpolygonxy = new OpenLayers.Control();  
                OpenLayers.Util.extend(getpolygonxy, {  
                    draw: function() {  
                        this.polygon= new OpenLayers.Handler.Polygon(getpolygonxy ,  
                                { "done": this.notice },{ "persist": true},  
                                { keyMask: OpenLayers.Handler.MOD_SHIFT });  
                        this.polygon.activate();  
                    },  
                    notice: function(bounds) {  
                        alert(bounds);//坐标信息                      
                    }  
                });  
                map.addControl(getpolygonxy);  
             }  
          
            </script>  
        </head>  
        <body onload="init()">  
            <div id="toolbar" style="display:">             
                <input type="button" value="放大" onclick="zoomIn()"/>  
                <input type="button" value="缩小" onclick="zoomOut()"/>  
                <input type="button" value="获取地图大小" onclick="getSize()"/>  
                <input type="button" value="平移" onclick="toggleControl('none')"/>  
                <input type="button" value="线路测量" onclick="toggleControl('line')"/>  
                <input type="button" value="测量面积" onclick="toggleControl('polygon')"/>  
                <input type="button" value="shift拉框" onclick="boxExtend()"/>  
                <input type="button" value="显示标注" onclick="addMarker()"/>  
                <input type="button" value="移除标注" onclick="removeMarker()"/>  
                <input type="button" value="画多边形获取经纬度坐标" onclick="test()"/>  
            </div>  
            <div id="map">  
                 
            </div>  
            <div id="wrapper">  
                <div id="location">经纬度坐标</div>  
                <div id="scale">  
                </div>  
                <div id="output">  
                </div>  
            </div>  
            <div id="xystr"></div>  
            <div id="nodelist">  
                <em>Click on the map to get feature info</em>  
            </div>  
        </body>  
    </html>  
    View Code

    添加项目到Tomcat启动测试,Tomcat端口8090,与geoserver所使用的服务端口不一致。测试效果如下:

    自此,整个搭建过程完成。

  • 相关阅读:
    Vue 路由组件传参的 8 种方式
    JS中通过url动态获取图片大小的方法小结(两种方法)
    基于 Vue.js 实现的精致移动端组件库
    .net core 通过代码创建数据库表
    .net core 框架调用顺序
    POCO的理解
    winform datagridview 同步滚动
    UseIIS
    winform 多个datagridview 之间同步滚动
    winform BackgroundWorker 的用法
  • 原文地址:https://www.cnblogs.com/boonya/p/3897592.html
Copyright © 2011-2022 走看看