使用java+geoserver自动发布影像服务和postgis表,超简洁,一目了然。

前言

本文将两种自动发布写成了工具类,至于接口封装,如有需要可留言。

所需依赖如下:

<!--geoserver自动发布服务-->
        <dependency>
            <groupId>nl.pdok</groupId>
            <artifactId>geoserver-manager</artifactId>
            <version>1.7.0-pdok2</version>
        </dependency>
 <repositories>
        <repository>
            <id>GeoSolutions</id>
            <url>http://maven.geo-solutions.it/</url>
        </repository>
    </repositories>       

1.自动发布影像服务

代码如下(示例):

public class testpublicimage {
    
    
    public static void main(String[] args) throws Exception {
    
    
        String wsName="publictif";
        String layerPath="C:\\Users\\Administrator\\Desktop\\shuju\\result.tif";
        String layerCode="geotif";
        boolean publishImageLayer = publishImageLayer(wsName, layerPath, layerCode);
        System.out.println(publishImageLayer);
    }
    public static boolean publishImageLayer(String wsName, String layerPath, String layerCode) throws Exception {
    
    
        String gsImageUrl="http://localhost:8080/geoserver";
        String gsImageUser= "admin";
        String  gsImagePwd="geoserver";
        GeoServerRESTManager geoServerRESTManager = new GeoServerRESTManager(new URL(gsImageUrl), gsImageUser, gsImagePwd);
        GeoServerRESTPublisher geoServerRESTPublisher = geoServerRESTManager.getPublisher();
        GeoServerRESTReader geoServerRESTReader=geoServerRESTManager.getReader();

        // 判断workspace是否存在,不存在则创建
        List<String> workspaces = geoServerRESTReader.getWorkspaceNames();
        if (!workspaces.contains(wsName)) {
    
    
            boolean isCreateWs =geoServerRESTPublisher.createWorkspace(wsName);
            log.info("Create ws : {}" , isCreateWs);
        } else {
    
    
            log.info("Workspace already exist, workspace :{}" , wsName);
        }
        // String fileName = layerPath.split("/")[layerPath.split("/").length-1];
//        String storeName = fileName.substring(0, fileName.length()-4);
        String storeName = layerCode;
//        if("basemap".equals(layerCode)) {
    
    
//            storeName = "raster_basemap";
//            // todo 判断raster_basemap是否存在,如果存在,则不发布。return true
//        }
        RESTDataStore restStore = geoServerRESTReader.getDatastore(wsName, storeName);
        if(restStore == null) {
    
    
            GSGeoTIFFDatastoreEncoder gtde = new GSGeoTIFFDatastoreEncoder(storeName);
            gtde.setWorkspaceName(wsName);
            gtde.setUrl(new URL("file:" + layerPath));
            boolean createStore = geoServerRESTManager.getStoreManager().create(wsName, gtde);
            log.info("Create store (TIFF文件创建状态) : " + createStore);
        }else {
    
    
//            if("raster_basemap".equals(storeName)){
    
    
//                // todo 图层组已存在返回true,否则重新发布
                raster_basemap已存在,返回true
//                return true;
//            }
        }

        boolean isPublished =geoServerRESTPublisher.publishGeoTIFF(wsName, storeName, new File(layerPath));
        log.info("publish (TIFF文件发布状态): " + isPublished);
        return isPublished;
    }

}

2.自动发布PostGIS表

代码如下(示例):

public class testpublicpostgis {
    
    
    public static void main(String[] args) throws Exception {
    
    
        String wsName = "qwe4" ; //待创建和发布图层的workspace
        //String store_name = "lyf" ; //数据库连接要创建的store
        String layerName = "henan_village" ; // 数据库要发布的表名称,后面图层名称和表名保持一致
        boolean publishPostGISLayer = publishPostGISLayer(wsName, layerName);
        if(publishPostGISLayer=false){
    
    
            System.out.println("此Publish layer已存在");
        }
        System.out.println(publishPostGISLayer);
    }
    public static boolean publishPostGISLayer(String wsName, String layerName) throws Exception {
    
    
        //geoserver连接配置
        String url = "http://localhost:8080/geoserver" ;
        String username = "admin" ;
        String passwd = "geoserver" ;
        //postgis连接配置
        String pgHost = "localhost" ;
        int pgPort = 5432;
        String pgUser = "postgres" ;
        String pgPwd = "111111" ;
        String pgSchema="public";
        String pgDatabase="Demo";
//        String ws = "lyf" ; //待创建和发布图层的workspace
//        String store_name = "lyf" ; //数据库连接要创建的store
//        String table_name = "xxx" ; // 数据库要发布的表名称,后面图层名称和表名保持一致
        Boolean isPublished=null;
        GeoServerRESTManager geoServerRESTManager = new GeoServerRESTManager(new URL(url), username, passwd);
        GeoServerRESTPublisher geoServerRESTPublisher = geoServerRESTManager.getPublisher();
        GeoServerRESTReader geoServerRESTReader=geoServerRESTManager.getReader();

        //判断workspace是否存在,不存在则创建
        //创建一个workspace
        List<String> workspaces = geoServerRESTReader.getWorkspaceNames();
        if(!workspaces.contains( wsName)){
    
    
            boolean createws = geoServerRESTPublisher.createWorkspace( wsName);
            System.out.println("create ws : " + createws);
        }else {
    
    
            System.out.println("workspace已经存在了,ws :" +  wsName);

        }
        // 判断数据存储(datastore)是否已经存在,不存在则创建
        String storeName = wsName + "_pg2";
        RESTDataStore restStore =geoServerRESTReader.getDatastore(wsName, storeName);
        if (restStore == null) {
    
    
            GSPostGISDatastoreEncoder store = new GSPostGISDatastoreEncoder(storeName);
            store.setHost(pgHost);
            store.setPort(pgPort);
            store.setUser(pgUser);
            store.setPassword(pgPwd);
            store.setDatabase(pgDatabase);
            store.setSchema(pgSchema);
            store.setConnectionTimeout(300);
            store.setMaxConnections(20);
            store.setMinConnections(1);
            store.setExposePrimaryKeys(true);
            boolean isCreateStore = geoServerRESTManager.getStoreManager().create(wsName,store);
            System.out.println("Create store : " + isCreateStore);
        } else {
    
    
            log.info("DataStore already exist, store:" + storeName);
        }
        RESTLayer layer = geoServerRESTReader.getLayer(wsName, layerName);
        // 若图层已存在,则不发布
        if (layer == null) {
    
    
            // publisher.removeLayer(wsName, layerName);
            geoServerRESTPublisher.unpublishFeatureType(wsName, storeName, layerName);
        }
        GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder();
        fte.setTitle(layerName);
        fte.setName(layerName);
        fte.setSRS("EPSG:4326");
        GSLayerEncoder layerEncoder = new GSLayerEncoder();
        // layerEncoder.setDefaultStyle(layerName); // 样式和图层名字相同
        isPublished = geoServerRESTPublisher.publishDBLayer(wsName, storeName, fte, layerEncoder);
        log.info("Publish layer: " + isPublished);
        System.out.println("Publish layer: " + isPublished);

        return isPublished;
    }
 }


注意

依赖必须为此版本

        <dependency>
            <groupId>nl.pdok</groupId>
            <artifactId>geoserver-manager</artifactId>
            <version>1.7.0-pdok2</version>
        </dependency>

不然import it.geosolutions.geoserver.rest.encoder.datastore.GSGeoTIFFDatastoreEncoder;失败。我试过别的版本,显示没有GSGeoTIFFDatastoreEncoder。

猜你喜欢

转载自blog.csdn.net/qq_37967853/article/details/128582838