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中幾個重要的類對象
- GeoServerRESTManager該對象是一個最大的管理者可以獲取以下兩個對象,創建數據存儲
- GeoServerRESTPublisher,發布對象,用來發布各種數據和創建工作空間(主要用來創建對象)
- 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 @強
