Java實現GeoServer通過rest發布shp至WMS服務


 

Java實現GeoServer通過rest發布shp至WMS服務

項目中遇到需要GeoTools發布shp至GeoServer,特此記錄。

一、添加依賴

    <dependency>
      <groupId>org.geotools</groupId>
      <artifactId>gt-shapefile</artifactId>
      <version>${geotools.version}</version>
    </dependency>
    <dependency>
      <groupId>org.geotools</groupId>
      <artifactId>gt-api</artifactId>
      <version>${geotools.version}</version>
    </dependency>
    <dependency>
      <groupId>org.geotools</groupId>
      <artifactId>gt-wms</artifactId>
      <version>${geotools.version}</version>
    </dependency>

因為剛學習geoserver,具體需要哪些依賴我也記不清了。geotools的jar拉取不下來,需要在maven中添加geo的倉庫。

 <repositories>
    <repository>
      <id>osgeo</id>
      <name>OSGeo Release Repository</name>
      <url>https://repo.osgeo.org/repository/release/</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <enabled>true</enabled>
      </releases>
    </repository>
    <repository>
      <id>osgeo-snapshot</id>
      <name>OSGeo Snapshot Repository</name>
      <url>https://repo.osgeo.org/repository/snapshot/</url>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
      <releases>
        <enabled>false</enabled>
      </releases>
    </repository>
  </repositories>

此處還需要用geoserver-manager的依賴

<dependency>
    <groupId>it.geosolutions</groupId>
    <artifactId>geoserver-manager</artifactId>
    <version>1.7.0</version>
  </dependency>

我在網上找了各種依賴拉取,都是失敗。最后找的源碼,自己打包引入的項目。

geoserver-manager 地址: https://github.com/geosolutions-it/geoserver-manager

二、Java代碼

前一篇文章講了GeoServer的web管理端發布WMS服務,Java發布服務與管理端流程一致。

public class PublishWms {
 
    public static void main(String[] args) {
        System.out.println("====================開始發布服務");
        publishShape();
        System.out.println("====================發布服務完成");
    }
 
}

1. geoserver創建連接信息

 // geoServer信息
        String url = "http://localhost:8080/geoserver";
        String user = "admin";
        String password = "geoserver";
 
        // 連接geoServer
        GeoServerRESTManager geoServerRESTManager = null;
        try {
            geoServerRESTManager = new GeoServerRESTManager(new URL(url), user, password);
        } catch (Exception e) {
            System.out.println("遠程連接GeoServer失敗...");
            e.printStackTrace();
        }

2. manager中重要的幾個類對象

geoserver-manager中幾個重要的類對象

  1. GeoServerRESTManager該對象是一個最大的管理者可以獲取以下兩個對象,創建數據存儲
  2. GeoServerRESTPublisher,發布對象,用來發布各種數據和創建工作空間(主要用來創建對象)
  3. GeoServerRESTReader,獲取數據存儲、圖層、樣式、圖層組等(主要用來獲取信息)

 

 // shp讀寫和發布
        assert geoServerRESTManager != null;
        GeoServerRESTReader restReader = geoServerRESTManager.getReader();
        GeoServerRESTPublisher restPublisher = geoServerRESTManager.getPublisher();

 

3. 創建工作區

// 工作區
        String workSpace = "spacetest2";
        // 存在相應的工作區
        if (!restReader.existsWorkspace(workSpace)) {
            restPublisher.createWorkspace(workSpace);
        }

4. 添加style樣式

// style樣式
        String styleName = "styletest2";
        String styleSld;
        // 判斷是否已經發布了style
        if (!restReader.existsStyle(workSpace, styleName)) {
            String styleFilePath = "Z:\\GIStone\\SuperMap\\Server\\webapps\\iserver\\WEB-INF\\config\\region.sld";
            File styleFile = new File(styleFilePath);
            restPublisher.publishStyleInWorkspace(workSpace, styleFile, styleName);
        }
        styleSld = restReader.getSLD(workSpace, styleName);

style樣式引入的sld文件。SLD是風格化圖層描述器(Styled Layer Descriptor)的簡稱。SLD描述了如何在WMS規范的基礎上進行擴展使之支持用戶對要素數據進行自定義的符號化顯示。SLD是一種基於XML語言的OGC標准。這表示SLD文件會被GeoServer創建並且能夠被任何一種支持WMS的服務器軟件所支持。我們不想限制大家渲染地圖的方式,因此我們使用OGC標准規定的SLD作為GeoServer的渲染系統的核心。

5. 創建數據存儲

 // 數據存儲
        String dataSetName = "datasettest2";
        if (!restReader.existsDatastore(workSpace, dataSetName)) {
            //創建shape文件存儲
            try {
                //shp文件所在的位置
                String urlDataStorePath = file.getPath();
                // 數據存儲需要的文件
                String shpFilePath = String.format("file://%s", urlDataStorePath);
                URL urlShapeFile = new URL(shpFilePath);
                // 創建數據集
                GSShapefileDatastoreEncoder datastoreEncoder = new GSShapefileDatastoreEncoder(dataSetName, urlShapeFile);
                datastoreEncoder.setCharset(Charset.forName("GBK"));
                geoServerRESTManager.getStoreManager().create(workSpace, datastoreEncoder);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
String shpFilePath = String.format("file://%s", urlDataStorePath);

路徑參照web端添加數據源時,需要shp文件的位置參數。我在這里踩了很久的坑................................................

6. 添加圖層layer發布

String layerName = "ne_50m_admin_0_tiny_countries_scale_rank";
        if (!restReader.existsLayer(workSpace, layerName)) {
            try {
                GSFeatureTypeEncoder gsFeatureTypeEncoder = new GSFeatureTypeEncoder();
                gsFeatureTypeEncoder.setTitle(layerName);
                gsFeatureTypeEncoder.setName(layerName);
                gsFeatureTypeEncoder.setSRS(GeoServerRESTPublisher.DEFAULT_CRS);
 
                GSLayerEncoder gsLayerEncoder = new GSLayerEncoder();
                gsLayerEncoder.addStyle(styleSld);
 
                boolean layer = restPublisher.publishDBLayer(workSpace, dataSetName, gsFeatureTypeEncoder, gsLayerEncoder);
                System.out.println("publish layer : " + layer);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

至此,發布完成。

三、web管理查看

四、完整代碼

    private static void publishShape() {
        File file = new File("Z:\\GIStone\\Projects\\tutorial\\document\\data\\50m_cultural\\ne_50m_admin_0_tiny_countries_scale_rank.shp");
        // File zipFile = new File("Z:\\GIStone\\Projects\\tutorial\\document\\data\\50m_cultural\\ne_50m_admin_0_tiny_countries_scale_rank.zip");
 
        // geoServer信息
        String url = "http://localhost:8080/geoserver";
        String user = "admin";
        String password = "geoserver";
 
        // 連接geoServer
        GeoServerRESTManager geoServerRESTManager = null;
        try {
            geoServerRESTManager = new GeoServerRESTManager(new URL(url), user, password);
        } catch (Exception e) {
            System.out.println("遠程連接GeoServer失敗...");
            e.printStackTrace();
        }
 
        // shp讀寫和發布
        assert geoServerRESTManager != null;
        GeoServerRESTReader restReader = geoServerRESTManager.getReader();
        GeoServerRESTPublisher restPublisher = geoServerRESTManager.getPublisher();
 
        // 工作區
        String workSpace = "spacetest2";
        // 存在相應的工作區
        if (!restReader.existsWorkspace(workSpace)) {
            restPublisher.createWorkspace(workSpace);
        }
 
        // style樣式
        String styleName = "styletest2";
        String styleSld;
        // 判斷是否已經發布了style
        if (!restReader.existsStyle(workSpace, styleName)) {
            String styleFilePath = "Z:\\GIStone\\SuperMap\\Server\\webapps\\iserver\\WEB-INF\\config\\region.sld";
            File styleFile = new File(styleFilePath);
            restPublisher.publishStyleInWorkspace(workSpace, styleFile, styleName);
        }
        styleSld = restReader.getSLD(workSpace, styleName);
 
        // 數據存儲
        String dataSetName = "datasettest2";
        if (!restReader.existsDatastore(workSpace, dataSetName)) {
            //創建shape文件存儲
            try {
                //shp文件所在的位置
                String urlDataStorePath = file.getPath();
                // 數據存儲需要的文件
                String shpFilePath = String.format("file://%s", urlDataStorePath);
                URL urlShapeFile = new URL(shpFilePath);
                // 創建數據集
                GSShapefileDatastoreEncoder datastoreEncoder = new GSShapefileDatastoreEncoder(dataSetName, urlShapeFile);
                datastoreEncoder.setCharset(Charset.forName("GBK"));
                geoServerRESTManager.getStoreManager().create(workSpace, datastoreEncoder);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
 
        // 圖層layer
        String layerName = "ne_50m_admin_0_tiny_countries_scale_rank";
        if (!restReader.existsLayer(workSpace, layerName)) {
            try {
                GSFeatureTypeEncoder gsFeatureTypeEncoder = new GSFeatureTypeEncoder();
                gsFeatureTypeEncoder.setTitle(layerName);
                gsFeatureTypeEncoder.setName(layerName);
                gsFeatureTypeEncoder.setSRS(GeoServerRESTPublisher.DEFAULT_CRS);
 
                GSLayerEncoder gsLayerEncoder = new GSLayerEncoder();
                gsLayerEncoder.addStyle(styleSld);
 
                boolean layer = restPublisher.publishDBLayer(workSpace, dataSetName, gsFeatureTypeEncoder, gsLayerEncoder);
                System.out.println("publish layer : " + layer);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
 
        // 發布shape
        /*try {
            boolean shape = restPublisher.publishShp(workSpace, dataSetName, layerName, zipFile, GeoServerRESTPublisher.DEFAULT_CRS);
            System.out.println("publish shape : " + shape);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }*/
 
        /*// 創建發布類
        GeoServerRESTPublisher geoServerRESTPublisher = new GeoServerRESTPublisher(url, user, password);
        try {
            boolean flag = geoServerRESTPublisher.publishShp(workSpace, dataSetName,
                    new NameValuePair[]{new NameValuePair("charset", "GBK")},
                    dataSetName,
                    GeoServerRESTPublisher.UploadMethod.FILE,
                    file.toURI(),
                    GeoServerRESTPublisher.DEFAULT_CRS,
                    styleName);
            System.out.println("publish shp : " + flag);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }*/
    }

五、踩過的坑

1. 在發布shapefile時候創建數據源前面要加“file://”。

2. layer圖層的名稱一定要與shp文件的名稱一樣。

3. 如果需要用到壓縮文件,壓縮文件只能為zip格式,不能是rar格式否則會報錯,而且壓縮文件的路徑是全路徑。

 

 

轉載自:   https://blog.csdn.net/qq_31832209/article/details/111561350    @強


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM