Openlayers学习之调用Geoserver发布的地图服务(一)

一、openlayers引用

首先引用js文件,在官网下载类库的压缩包,解压缩在项目目录下。在html文件中引用。

 <link rel="stylesheet" href="../plugins/openlayers4/css/ol.css" type="text/css">
    <script src="../plugins/openlayers4/build/ol.js"></script>

二、创建地图容器

创建dom对象作为地图容器,以承载地图。

<div id="map" class="map">
var viewMap = new ol.View({
    projection: projection,					//地图的投影
});
var map = new ol.Map({
    layers: layers,			//要加载的图层
    target: 'map',			//绑定dom对象
    controls: new ol.control.defaults({
        attribution: false              //去掉右下角Logo
    }),
    view: viewMap					
});

三、加载Geoserver发布的地图服务

在这里使用的地图是EPSG:4528投影,由于openlayers默认支持的投影只有4326和3587,除此之外的投影都需要我们自己定义,这里有两种定义方法:
1、引用proj4.js文件,在http://epsg.io搜索我们需要的地图投影(地图投影可在geoserver中查看),将定义复制在proj4.defs中。

proj4.defs("EPSG:4528", "+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");        //必须引用proj4
var projection = ol.proj.get("EPSG:4528");

2、不需要引用proj4.js,直接定义(在geoserver预览地图的页面查看源码看到的投影定义方法)

//不需要再引用proj4
var projection = new ol.proj.Projection({
    code: 'EPSG:4528',
    units: 'm',
    axisOrientation: 'neu',
    global: false
});

定义好投影之后,定义要加载的图层,由于调用geoserver的地图需要跨域,所以我们要定义跨域声明。

var format = 'image/png';
var bounds = [40454494.66562566, 3936507.0527703143,
    40530793.66562566, 4002807.0527703143];
var layers = [
    new ol.layer.Image({
        source: new ol.source.ImageWMS({
            ratio: 1,
            url: 'http://localhost:8081/geoserver/test/wms',
            crossOrigin: 'anonymous',           //跨域声明
            params: {
                'FORMAT': format,
                'VERSION': '1.1.1',             //很重要!!!!!!
                "exceptions": 'application/vnd.ogc.se_inimage',
                "LAYERS": 'test:3702110101'
            }
        })
    })
];

四、Geoserver跨域

经过前面的步骤,我们发现仍然存在跨域问题,这是因为我们的geoserver没有设置允许跨域访问,下面我们配置geoserver跨域。首先查看geoserver目录下的lib包下的jetty-serverlets版本,将其copy至Geoserver\webapps\geoserver\WEB-INF\lib下。
在这里插入图片描述
下载对应版本的jetty-http和jetty-util包,放至同一路径。下载地址:http://central.maven.org/maven2/org/eclipse/jetty/jetty-servlets/
在这里插入图片描述
打开Geoserver\webapps\geoserver\WEB-INF\web.xml文件,搜索cross-origin,找到其所在位置,将相应的跨域设置代码解开注释,同时添加一段设置。

 <!-- Uncomment following filter to enable CORS -->
   <filter>
        <filter-name>cross-origin</filter-name>
        <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
       <init-param>
           <param-name>chainPreflight</param-name>
           <param-value>false</param-value>
       </init-param>
       <init-param>
           <param-name>allowedOrigins</param-name>
           <param-value>*</param-value>
       </init-param>
       <init-param>
           <param-name>allowedMethods</param-name>
           <param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</param-value>
       </init-param>
       <init-param>
           <param-name>allowedHeaders</param-name>
           <param-value>*</param-value>
       </init-param>
    </filter>
   
//需要手动添加的
	<filter-mapping>
        <filter-name>cross-origin</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

保存之后,重启geoserver。这样就解决了跨域问题。

五、View设置

设置一下地图中心点和缩放等级。

var viewMap = new ol.View({
    projection: projection,
    center: [40492644.16562566, 3969657.0527703143],			//自定义地图显示时的中心点
    zoom: 15			//自定义当前视图的缩放等级
});

最终显示如下:
在这里插入图片描述

  • 10
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要使用OpenLayers调用GeoServer,您需要遵循以下步骤: 1. 在GeoServer中创建图层并发布它们。 2. 在OpenLayers中创建地图并添加GeoServer图层。 3. 配置OpenLayers以连接到GeoServer。 4. 在OpenLayers中设置样式和交互。 5. 运行OpenLayers应用程序并查看GeoServer图层。 这些步骤需要一些编程知识和经验,但是OpenLayersGeoServer都有详细的文档和示例可供参考。 ### 回答2: OpenLayers是一个用于展示地理空间数据的JavaScript库,而Geoserver则是一个开源的地理空间数据服务器,可以实现地图切片、WMS图层等功能。将二者结合起来,可以实现在OpenLayers中展示Geoserver发布的地理空间数据。 下面是调用Geoserver的基本步骤: 1. 在Geoserver发布地理空间数据,例如发布一个Shapefile文件。 2. 在OpenLayers中定义WMS图层,连接到Geoserver的WMS服务。WMS(Web Map Service)是一种标准的协议,可以实现将地图以图片形式返回给客户端。 下面是一个简单的代码示例,展示如何在OpenLayers调用Geoserver: ``` var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }), new ol.layer.Tile({ source: new ol.source.TileWMS({ url: 'http://localhost:8080/geoserver/wms', params: {'LAYERS': 'workspace:layername'}, serverType: 'geoserver' }) }) ], view: new ol.View({ center: ol.proj.fromLonLat([116.3974, 39.9087]), zoom: 13 }) }); ``` 在这个代码示例中,先创建一个OpenLayers地图对象,并使用OSM作为底图。然后创建一个WMS图层,并使用Geoserver的WMS服务作为数据源。其中,url参数是Geoserver的WMS服务地址,params参数是WMS服务需要的参数,serverType参数指定了数据源是Geoserver。 需要注意的是,其中的workspace和layername应该替换成实际发布的地理空间数据的工作空间名和图层名。 总的来说,使用OpenLayers调用Geoserver可以方便地将地理空间数据展示在网页中,并且在OpenLayers的基础上可以添加更多交互功能,例如绘制、查询等。 ### 回答3: OpenLayers 是一种基于 JavaScript 的开源地图库,可以用来显示并操作地图。而 GeoServer 则是一种基于 Java 的开源地理信息服务器,用于共享空间数据。通过将 OpenLayersGeoServer 结合起来,可以实现动态的地图服务,包括添加、编辑、查询地图数据等。 调用 GeoServerOpenLayers 中的一个常见方式是使用 WMS(Web Map Service)。WMS 是一种用于发布地图数据的标准接口,可以让客户端应用程序按需请求地图图像。在 OpenLayers 中,可以使用 WMS 层从 GeoServer 获取地图图像,并将其显示在地图上。 首先,在 OpenLayers 中创建一个 WMS 图层,需要提供 GeoServer 的 WMS 服务地址以及所需的地图图层。如果 GeoServer 中已经有一些地图图层可用,则可以使用以下代码在 OpenLayers调用对应的图层: ```javascript var wmsLayer = new ol.layer.Tile({ source: new ol.source.TileWMS({ url: 'http://localhost:8080/geoserver/wms', params: {'LAYERS': 'workspace:layername'}, serverType: 'geoserver', }) }); ``` 其中,url 参数指定了 GeoServer 的 WMS 地址,params 参数则指定需要显示的地图图层。此外,serverType 参数也必须设置为 geoserver,以便使用 GeoServer 特有的样式编译参数。 除了 WMS 图层外,还可以使用 WFS(Web Feature Service)从 GeoServer 中获取矢量数据。WFS 可以让客户端应用程序通过 Web 接口获取矢量数据,而不仅仅是地图图像。在 OpenLayers 中,可以使用以下代码获取 GeoServer 中的矢量数据: ```javascript var vectorLayer = new ol.layer.Vector({ source: new ol.source.Vector({ format: new ol.format.WFS(), url: function(extent) { return 'http://localhost:8080/geoserver/wfs?' + 'service=WFS&' + 'version=1.1.0&' + 'request=GetFeature&' + 'typename=workspace:layername&' + 'outputFormat=application/json&' + 'srsname=EPSG:3857&' + 'bbox=' + extent.join(',') + ',EPSG:3857'; }, strategy: ol.loadingstrategy.bbox }) }); ``` 上述代码中,url 参数指定了 GeoServer 的 WFS 地址和请求参数,typename 参数则指定所需的矢量图层。此外,格式参数也必须设置为 ol.format.WFS(),以便正确解析矢量数据。此外,可以使用 ol.loadingstrategy.bbox 策略指定在地图可视区域发生变化时获取数据的范围。 综上所述,通过结合 OpenLayersGeoServer,可以实现灵活的地图服务,包括获取并显示地图图像、获取和编辑矢量数据等。这为开发 Web 地图应用程序提供了很大的灵活性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值