学习利用Java发布geoserver 文件过程以及demo

geoserver 部署

下载geoserver 链接 http://geoserver.org/download/
将war包放在tomcat下的webapp文件下,点击tomcat目录下bin/startup.bat文件运行tomcat
访问 http://localhost:8080/geoserver/ 直接进入geoserver页面

java调用geoserver rest api 发布地图服务以tif,shp,PostGIS为例

首先环境搭建 spring-boot + geoserver 引入pom

    <properties>
        <java.version>1.8</java.version>
        <springfox-version>3.0.0</springfox-version>
    </properties>

    <dependencies>
        <!--    spring boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>${springfox-version}</version>
        </dependency>
        <dependency>
            <groupId>it.geosolutions</groupId>
            <artifactId>geoserver-manager</artifactId>
            <version>1.7.0</version>
        </dependency>
        <dependency>
            <groupId> nl.pdok</groupId>
            <artifactId>geoserver-manager</artifactId>
            <version>1.7.0-pdok2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <!-- 注意这里仓库需要指定 -->
    <repositories>
        <repository>
            <id>GeoSolutions</id>
            <url>http://maven.geo-solutions.it/</url>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

之后是java代码

package org.zkkj.geodemo.action;

import it.geosolutions.geoserver.rest.GeoServerRESTManager;
import it.geosolutions.geoserver.rest.GeoServerRESTPublisher;
import it.geosolutions.geoserver.rest.GeoServerRESTReader;
import it.geosolutions.geoserver.rest.decoder.RESTDataStore;
import it.geosolutions.geoserver.rest.decoder.RESTDataStoreList;
import it.geosolutions.geoserver.rest.decoder.RESTLayer;
import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder;
import it.geosolutions.geoserver.rest.encoder.datastore.GSGeoTIFFDatastoreEncoder;
import it.geosolutions.geoserver.rest.encoder.datastore.GSPostGISDatastoreEncoder;
import it.geosolutions.geoserver.rest.encoder.datastore.GSShapefileDatastoreEncoder;
import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

/**
 * \* author: 田展硕
 * \* data: 2021/7/17  15:23
 * \* description:
 * \
 */
public class MyFirstGeoServer {

    public static void main(String[] args) throws IOException {
        //GeoServer的连接配置
        String url = "http://localhost:8080/geoserver";
        String username = "admin";
        String password = "geoserver";

//        GeoserverPublishTiffData(url, username, password);
        GeoserverPublishShapefileData(url, username, password);  //发布shp数据
        // GeoserverPublishPostGISData(url, username, passwd);
    }

    /**
     * 发布tif格式数据
     * @param url
     * @param username
     * @param password
     * @throws IOException
     */
    private static void GeoserverPublishTiffData(String url, String username, String password)
            throws IOException {
        String workspace_name = "myFirstWorkspaceOfTif";
        String store_name = "myFirstStoreOfTif";
        String file_name = "D:\\dev\\Data\\栅格\\20210418-lfkfq【2m】\\GF6_PMS_E117.0_N39.5_20210418_L1A1120098132.tif";

        GeoServerRESTManager geoServerRESTManager = new GeoServerRESTManager(new URL(url), username, password);
        GeoServerRESTPublisher publisher = geoServerRESTManager.getPublisher();
        GeoServerRESTReader reader = geoServerRESTManager.getReader();
        /**
         * 获取reader 和 publisher的另一种方式
         * GeoServerRESTPublisher geoServerRESTPublisher = new GeoServerRESTPublisher(url, username, passwd);
         * GeoServerRESTReader geoServerRESTReader = new GeoServerRESTReader(url, username, passwd);
         *
         */
        // 检查workspace 若不存在,创建workspace
        List<String> workspaceNames = reader.getWorkspaceNames();
        if (!workspaceNames.contains(workspace_name)) {
            boolean publisherWorkspace = publisher.createWorkspace(workspace_name);
            System.out.println("create workspace_name : " + publisherWorkspace);
        } else {
            System.out.println("workspace已经存在了,workspace_name name :" + workspace_name);
        }
        /*
        //store是否存在,不存在则新建并发布数据。
        RESTDataStoreList datastoresList = reader.getDatastores(workspace_name);
        List<String> datastoreNameList = datastoresList.getNames();
        boolean storeNull = !datastoreNameList.contains(store_name);
        if (storeNull) {
            boolean result = publisher.publishGeoTIFF(workspace_name, store_name, new File(file_name));
            //converageName可以理解为图层名字 方法重载的两种方式
            // boolean result = publisher.publishGeoTIFF(workspace_name, store_name, "coverageName*", new File(file_name));
            System.out.println("数据发布是否成功:" + result);
        } else {
            System.out.println("数据已经发布过了,不能重复发布!");
        }*/
        RESTDataStore restStore = reader.getDatastore(workspace_name, store_name);
        if (restStore == null) {
            GSGeoTIFFDatastoreEncoder gsGeoTIFFDatastoreEncoder = new GSGeoTIFFDatastoreEncoder(store_name);
            gsGeoTIFFDatastoreEncoder.setWorkspaceName(workspace_name);
            gsGeoTIFFDatastoreEncoder.setUrl(new URL("file:" + file_name));
            boolean createStore = geoServerRESTManager.getStoreManager().create(workspace_name, gsGeoTIFFDatastoreEncoder);
            System.out.println("create store (TIFF文件创建状态) : " + createStore);

            boolean publish = geoServerRESTManager.getPublisher().publishGeoTIFF(workspace_name, store_name, new File(file_name));
            System.out.println("publish (TIFF文件发布状态) : " + publish);

        } else {
            System.out.println("数据存储已经存在了,store:" + store_name);
        }
    }

    /***
     * 发布shapefile数据
     * @param url
     * @param username
     * @param password
     * @throws IOException
     */
    public static void GeoserverPublishShapefileData(String url, String username, String password) throws IOException {
        String workspace_name = "myFirstWorkspaceOfShp";     //workspace名称
        String store_name = "myFirstStoreOfShp"; //store名称

        //压缩文件的完整路径
        File zipFile = new File("D:\\dev\\Data\\矢量\\191206-开发区建筑矢量图\\build.zip");
        String layer_name = "build";//图层名称

        GeoServerRESTManager manager = new GeoServerRESTManager(new URL(url), username, password);
        GeoServerRESTPublisher publisher = manager.getPublisher();
        GeoServerRESTReader reader = manager.getReader();

        if (! reader.existsWorkspace(workspace_name)) {
            boolean create_workspace = publisher.createWorkspace(workspace_name);
            System.out.println("create workspace : " + create_workspace);
        } else {
            System.out.println("workspace已经存在了,workspace_name :" + workspace_name);
        }
        //shp文件所在的位置
        String urlDatastore = "file://"+"D:\\dev\\Data\\矢量\\191206-开发区建筑矢量图\\build.shp";
        //判断数据存储(datastore)是否已经存在,不存在则创建
        URL shpFileUrl = new URL(urlDatastore);
        RESTDataStore restStore = reader.getDatastore(workspace_name, store_name);
        if (restStore == null) {
            //创建shape文件存储
            GSShapefileDatastoreEncoder store = new GSShapefileDatastoreEncoder(store_name, shpFileUrl);
            boolean createStore = manager.getStoreManager().create(workspace_name, store);
            System.out.println("create store : " + createStore);
        } else {
            System.out.println("数据存储已经存在了,store:" + store_name);
        }
        //判断图层是否已经存在,不存在则创建并发布
        RESTLayer layer = reader.getLayer(workspace_name, layer_name);
        if (layer == null) {
            //发布图层
            boolean publish = manager.getPublisher().publishShp(workspace_name, store_name, layer_name, zipFile,  GeoServerRESTPublisher.DEFAULT_CRS);
            System.out.println("publish : " + publish);
        } else {
            System.out.println("表已经发布过了,table:" + store_name);
        }
    }

    //发布postgis中的数据
    public static void GeoserverPublishPostGISData(String url, String username, String passwd) throws IOException {
        //postgis连接配置
        String postgisHost = "localhost";
        int postgisPort = 5432;//端口号
        String postgisUser = "postgres";//用户名
        String postgisPassword = "postgres";//用户密码
        String postgisDatabase = "sqlView";//数据库名称

        String ws = "testNew";     //待创建和发布图层的工作区名称workspace
        String store_name = "testGeoserver"; //待创建和发布图层的数据存储名称store
        String table_name = "roa_4m"; // 数据库要发布的表名称,后面图层名称和表名保持一致

        //判断工作区(workspace)是否存在,不存在则创建
        URL u = new URL(url);
        GeoServerRESTManager manager = new GeoServerRESTManager(u, username, passwd);
        GeoServerRESTPublisher publisher = manager.getPublisher();
        List<String> workspaces = manager.getReader().getWorkspaceNames();
        if (!workspaces.contains(ws)) {
            boolean createws = publisher.createWorkspace(ws);
            System.out.println("create ws : " + createws);
        } else {
            System.out.println("workspace已经存在了,ws :" + ws);
        }

        //判断数据存储(datastore)是否已经存在,不存在则创建
        RESTDataStore restStore = manager.getReader().getDatastore(ws, store_name);
        if (restStore == null) {
            GSPostGISDatastoreEncoder store = new GSPostGISDatastoreEncoder(store_name);
            store.setHost(postgisHost);//设置url
            store.setPort(postgisPort);//设置端口
            store.setUser(postgisUser);// 数据库的用户名
            store.setPassword(postgisPassword);// 数据库的密码
            store.setDatabase(postgisDatabase);// 那个数据库;
            store.setSchema("public"); //当前先默认使用public这个schema
            store.setConnectionTimeout(20);// 超时设置
            //store.setName(schema);
            store.setMaxConnections(20); // 最大连接数
            store.setMinConnections(1);     // 最小连接数
            store.setExposePrimaryKeys(true);
            boolean createStore = manager.getStoreManager().create(ws, store);
            System.out.println("create store : " + createStore);
        } else {
            System.out.println("数据存储已经存在了,store:" + store_name);
        }

        //判断图层是否已经存在,不存在则创建并发布
        RESTLayer layer = manager.getReader().getLayer(ws, table_name);
        if (layer == null) {
            GSFeatureTypeEncoder pds = new GSFeatureTypeEncoder();
            pds.setTitle(table_name);
            pds.setName(table_name);
            pds.setSRS("EPSG:4326");
            GSLayerEncoder layerEncoder = new GSLayerEncoder();
            boolean publish = manager.getPublisher().publishDBLayer(ws, store_name, pds, layerEncoder);
            System.out.println("publish : " + publish);
        } else {
            System.out.println("表已经发布过了,table:" + table_name);
        }
    }
}

官方开发文档,包括快速入门
https://docs.geoserver.org/

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容