1. 引入geoserver依赖

1
2
3
4
5
6
<!--geoserver依赖-->
<dependency>
    <groupId>nl.pdok</groupId>
    <artifactId>geoserver-manager</artifactId>
    <version>1.7.0-pdok2</version>
</dependency>

2. 流程

(1)创建geoserver连接对象

(2)创建工作区,有则不创建

(3)创建数据源和发布图层服务

(4)mapbox加载WMS服务

3. Java代码

3.1 geoserver创建连接信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
String url = "http://172.21.212.240:8008/geoserver";    //geoserver的地址
String un = "admin";         //geoserver的账号
String pw = "geoserver";     //geoserver的密码

String workspace = "shapefile";     //工作区名称
String storename = "test";     //数据源名称
String layername = "bus_point";     //发布的图层名称,此名称必须和压缩包的名称一致

//shp文件压缩包,必须是zip压缩包,且shp文件(.shp、.dbf、.shx等)外层不能有文件夹,且压缩包名称需要与shp图层名称一致
String zipFilePath = "E:\\GIS_Data\\chengdu\\bus_point.zip";

//  1、获取geoserver连接对象
GeoServerRESTManager manager = null;

try {
    manager = new GeoServerRESTManager(new URL(url) , un , pw);
    System.out.println("连接geoserver服务器成功");
}catch (Exception e){
    e.printStackTrace();
    System.out.println("geoserver服务器连接失败");
    return;
}

3.2 manager中重要的几个类对象

geoserver-manager中几个重要的类对象

1.GeoServerRESTManager该对象是一个最大的管理者可以获取以下两个对象,创建数据存储

2.GeoServerRESTPublisher,发布对象,用来发布各种数据和创建工作空间(主要用来创建对象)

3.GeoServerRESTReader,获取数据存储、图层、样式、图层组等(主要用来获取信息)

1
2
3
GeoServerRESTReader reader = manager.getReader();
GeoServerRESTPublisher publisher = manager.getPublisher();
GeoServerRESTStoreManager storeManager = manager.getStoreManager();

3.3 创建工作区

1
2
3
4
5
6
7
8
9
//  2、判断是否有工作区,没有则创建
boolean b2 = reader.existsWorkspace(workspace);
if(!b2){
    boolean b = publisher.createWorkspace(workspace);
    if(!b){
        System.out.println("工作区创建失败");
        return;
    }
}

3.4 添加style样式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// style样式
String styleName = "styletest";
String styleSld;
// 判断是否已经发布了style
if (!reader.existsStyle(workspace, styleName)) {
    String styleFilePath = "Z:\\GIStone\\SuperMap\\Server\\webapps\\iserver\\WEB-INF\\config\\region.sld";
    File styleFile = new File(styleFilePath);
    publisher.publishStyleInWorkspace(workspace, styleFile, styleName);
}
styleSld = reader.getSLD(workspace, styleName);

style样式引入的sld文件。SLD是风格化图层描述器(Styled Layer Descriptor)的简称。SLD描述了如何在WMS规范的基础上进行扩展使之支持用户对要素数据进行自定义的符号化显示。SLD是一种基于XML语言的OGC标准。这表示SLD文件会被GeoServer创建并且能够被任何一种支持WMS的服务器软件所支持。我们不想限制大家渲染地图的方式,因此我们使用OGC标准规定的SLD作为GeoServer的渲染系统的核心。

3.5 创建数据源

3.6 发布图层服务

创建数据源 和 发布图层服务可以一步进行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
//  3、判断是否有数据源,没有则创建
//  4、发布图层,如果存在就不发布
//  创建数据源 和 发布图层服务可以一步进行
RESTDataStore datastore = reader.getDatastore(workspace, storename);
RESTLayer layer = reader.getLayer(workspace, layername);
if(layer == null && datastore == null){
    File file = new File(zipFilePath);
    // 进行发布;参数依次为:工作区名称、数据源名称、图层名称、shp文件压缩文件对象、坐标系
    boolean b = false;
    try {
        b = publisher.publishShp(workspace , storename , layername , file , GeoServerRESTPublisher.DEFAULT_CRS);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    if(!b){
        System.out.println("shp图层发布失败");
    } else {
        System.out.println("shp图层发布成功");
    }
}

3.7 发布完成

image-20230617151302854

image-20230617151234972

3.8 注意事项

layer图层的名称一定要与shp文件的名称一样。

如果需要用到压缩文件,压缩文件只能为zip格式,不能是rar格式否则会报错,而且压缩文件的路径是全路径。

参考链接

Java将shp文件发布为geoserver服务

Java实现GeoServer通过rest发布shp至WMS服务

4. mapbox加载WMS

WMS服务地址:

workspace:geoserver工作空间

layername:图层名称(与zip包以及其中的shp文件名称一直)

1
"http://localhost:8008/geoserver/" + workspace + "/wms?service=WMS&version=1.1.0&request=GetMap&layers=" + workspace + ":" + layername + "&styles=&bbox={bbox-epsg-3857}&width=256&height=256&srs=EPSG:3857&format=image/png&TRANSPARENT=TRUE"; 

html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>MapBox加载WMS地图服务</title>
    <script src='https://api.mapbox.com/mapbox-gl-js/v0.50.0/mapbox-gl.js'></script>
    <link href='https://api.mapbox.com/mapbox-gl-js/v0.50.0/mapbox-gl.css' rel='stylesheet' />
    <style>
        body { margin:0; padding:0; }
        #map { position:absolute; top:0; bottom:0; width:100%; }
        /*隐藏logo*/
        .mapboxgl-ctrl.mapboxgl-ctrl-attrib{
            display: none !important;
        }
        .mapboxgl-ctrl-logo{
            display: none !important;
        }
    </style>
</head>
<body>
<div id='map'></div>
<script >
    mapboxgl.accessToken = 'pk.eyJ1Ijoid3lqcSIsImEiOiJjbDBnZDdwajUxMXR...BIZtZg';
    var map = new mapboxgl.Map({
        container: 'map',
        style: 'mapbox://styles/mapbox/streets-v10',
        center: [108.438,34.431],
        zoom: 7
    });
    map.on("load",function () {
        map.addLayer({
            'id': 'wms-test-layer',
            'type': 'raster',
            'source': {
                'type': 'raster',
                'tiles': [
                    // "http://127.0.0.1:8008/geoserver/shapefile/wms?service=WMS&version=1.1.0&request=GetMap&layers=shapefile:bus_point&tiled=true&srsname=EPSG:4326"
                    'http://localhost:8008/geoserver/shapefile/wms?service=WMS&version=1.1.0&request=GetMap&layers=shapefile:bus_point&styles=&bbox={bbox-epsg-3857}&width=256&height=256&srs=EPSG:3857&format=image/png&TRANSPARENT=TRUE'
                ],
                'tileSize': 256
            },
            'paint': {}
        });
    })
</script>
</body>
</html>

效果预览

image-20230617154403493

参考链接

MapBox加载GeoServer发布的WMS地图服务

Mapbox GL 加载GeoServer发布的WMS地图服务及点击查询

openLayers 坐标转换 EPSG:3857和EPSG:4326区别