JAVA集成GeoServer

引入依赖包

<mirror>
  <id>GeoSolutions</id>
  <mirrorOf>*</mirrorOf>
  <name>GeoSolutions</name>
  <url>http://maven.geo-solutions.it/</url>
</mirror>
或者
<repository>
  <id>GeoSolutions</id>
  <url>http://maven.geo-solutions.it/</url>
</repository>

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

工具类

GeoServerUtils

import com.alibaba.csp.sentinel.util.StringUtil;
import it.geosolutions.geoserver.rest.GeoServerRESTManager;
import it.geosolutions.geoserver.rest.decoder.RESTDataStore;
import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder;
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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;

@Slf4j
public class GeoServerUtils {

    /**
     * 获取geoserver图层管理
     *
     * @param address  geoserver服务地址
     * @param account  账号
     * @param passWord 密码
     * @return it.geosolutions.geoserver.rest.GeoServerRESTManager
     **/
    public static GeoServerRESTManager getManager(String address, String account, String passWord) throws MalformedURLException {
        URL u = new URL(address);
        //获取管理对象
        return new GeoServerRESTManager(u, account, passWord);
    }

    /**
     * 创建数据库存储
     *
     * @param manager  geoserver管理类
     * @param workArea 工作区
     * @param dataPool 数据存储
     **/
    public static boolean createDBDataPool(GeoServerRESTManager manager, String workArea, String dataPool, String dbHost, int dbPort, String dbUser, String dbPassWord, String dbDataBase, String dbSchema) {
        RESTDataStore restStore = manager.getReader().getDatastore(workArea, dataPool);
        if (restStore == null) {
            GSPostGISDatastoreEncoder store = new GSPostGISDatastoreEncoder(dataPool);
            store.setHost(dbHost);//设置url
            store.setPort(dbPort);//设置端口
            store.setUser(dbUser);// 数据库的用户名
            store.setPassword(dbPassWord);// 数据库的密码
            store.setDatabase(dbDataBase);// 那个数据库;
            store.setSchema(dbSchema); //当前先默认使用public这个schema
            store.setConnectionTimeout(20);// 超时设置
            store.setMaxConnections(20); // 最大连接数
            store.setMinConnections(1);     // 最小连接数
            store.setExposePrimaryKeys(true);
            boolean createStore = manager.getStoreManager().create(workArea, store);
            System.out.println("create store : " + createStore);
            return createStore;
        }
        return true;
    }

    /**
     * 创建shp数据存储
     *
     * @param manager  geoserver图层管理类
     * @param workArea 工作区间
     * @param dataPool 数据存储
     * @param geoPath  图层服务存放地址
     * @param shpName  shp文件名称
     **/
    public static boolean createShpDataPool(GeoServerRESTManager manager, String workArea, String dataPool, String geoPath, String shpName) throws MalformedURLException {
        String fileUrl = "file://" + geoPath + "/" + workArea + "/" + dataPool + "/" + shpName;
        URL urlShapeFile = new URL(fileUrl);
        boolean existsDatastore = manager.getReader().existsDatastore(workArea, dataPool);
        if (!existsDatastore) {
            //创建shape文件存储
            GSShapefileDatastoreEncoder store = new GSShapefileDatastoreEncoder(dataPool, urlShapeFile);
            store.setCharset(Charset.forName("GBK"));
            boolean createStore = manager.getStoreManager().create(workArea, store);
            return createStore;
        }
        return true;
    }

    /**
     * 创建工作区间
     *
     * @param manager  geoserver图层管理类
     * @param workArea 工作区间
     * @return boolean
     **/
    public static boolean createWorkArea(GeoServerRESTManager manager, String workArea) {
        boolean existsWorkspace = manager.getReader().existsWorkspace(workArea);
        //判断工作空间是否存在
        if (!existsWorkspace) {
            //创建一个新的存储空间
            boolean createWs = manager.getPublisher().createWorkspace(workArea);
            System.out.println("create ws : " + createWs);
            return createWs;
        }
        return true;
    }

    /**
     *  创建样式
     * @param manager geoserver图层管理类
     * @param obj    反射所需类
     * @param styleName 样式名称
     * @param geoStylePath
     * @return
     */
    public static boolean createStyle(GeoServerRESTManager manager, Object obj, String styleName, String geoStylePath) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        boolean existsStyle = manager.getReader().existsStyle(styleName);
        if (!existsStyle) {
            //获取样式格式
            String style = FileUtils.readFileToString(new File(geoStylePath));
            Class clazz = obj.getClass();
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                //获取属性名
                String fieldName = field.getName();
                //首字母转大写
                fieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                Method m = clazz.getMethod("get" + fieldName);  // 获取getter方法
                // 执行方法提提取数值
                if (m.invoke(obj) == null) {
                    style = style.replaceAll("@" + fieldName.toLowerCase(), "");
                } else {
                    String value = m.invoke(obj).toString();    // 执行获取数值
                    // 将对应的样式格式,设置为提取到的数值
                    style = style.replaceAll("@" + fieldName.toLowerCase(), value);
                }
            }
            //设置样式名称
            style = style.replaceAll("@sldName", styleName);
            //创建样式
            existsStyle = manager.getPublisher().publishStyle(style);
        }
        return existsStyle;
    }

    /**
     * 发布数据库图层 === 发布数据库
     *
     * @param manager    geoserver图层管理
     * @param workArea   工作区间
     * @param dataPool   数据存储
     * @param styleName  样式名称
     * @param name       图层标题名称
     * @param nativeName 图层名称
     * @param srs        坐标系
     **/
    public static boolean publishDBLayer(GeoServerRESTManager manager, String workArea, String dataPool, String styleName, String name, String nativeName, String srs) throws Exception {
        boolean existsLayer = manager.getReader().existsLayer(workArea, name);
        if (!existsLayer) {
            GSLayerEncoder layerEncoder = new GSLayerEncoder();
            layerEncoder.setEnabled(true);
            //设置图层默认样式
            layerEncoder.setDefaultStyle(styleName);
            GSFeatureTypeEncoder gsFeatureTypeEncoder = new GSFeatureTypeEncoder();
            if (StringUtil.isBlank(name) && StringUtil.isBlank(nativeName)) {
                throw new Exception("表名和标识码为空!");
            } else if (StringUtil.isNotBlank(name) && StringUtil.isNotBlank(nativeName)) {
                gsFeatureTypeEncoder.setName(name);
                gsFeatureTypeEncoder.setNativeName(nativeName);
            } else if (StringUtil.isNotBlank(name)) {
                gsFeatureTypeEncoder.setName(name);
                gsFeatureTypeEncoder.setNativeName(name);
            } else {
                gsFeatureTypeEncoder.setName(nativeName);
                gsFeatureTypeEncoder.setNativeName(nativeName);
            }
            gsFeatureTypeEncoder.setSRS(srs);
            boolean publish = manager.getPublisher().publishDBLayer(workArea, dataPool, gsFeatureTypeEncoder, layerEncoder);
            return publish;
        }
        return true;
    }



    /**
     * 发布shp图层=====shp文件
     *
     * @param manager   geoserver图层管理类型
     * @param zipFile   zip文件
     * @param workArea  工作区间
     * @param dataPool  数据存储
     * @param styleName 样式名称
     * @param layerName 图层名称
     * @param srs       坐标系
     **/
    public static boolean publishShpLayer(GeoServerRESTManager manager, File zipFile, String workArea, String dataPool, String styleName, String layerName, String srs)  {
        boolean existsLayer = manager.getReader().existsLayer(workArea, layerName);
        if (!existsLayer) {
            boolean publish = false;
            try {
                publish = manager.getPublisher().publishShp(workArea, dataPool, layerName, zipFile, srs, styleName);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            return publish;
        }
        return true;
    }
}

工作区测试

// createWorkAreaTest
boolean res = GeoServerUtils.createWorkArea(GeoServerUtils.getManager(addr, account, pass), "JavaTest");
log.info("ccreateWorkAreaTest res is " + res);

创建DB数据

boolean createDBDataPoolTestRes = GeoServerUtils.createDBDataPool(GeoServerUtils.getManager(addr, account, pass), workArea, "dbTest",
        dbHost, dbPort, dbUser, dbPass, dbName, dbSchema);

log.info("createDBDataPoolTest res is " + createDBDataPoolTestRes);

图层发布

boolean publishDBLayerTestRes = GeoServerUtils.publishDBLayer(manager, workArea, "dbTest", "bse_station_gis", "bse_station_gis", "bse_station_gis", "EPSG:4326");
log.info("publishDBLayerTest res is " + publishDBLayerTestRes);

注意:数据源为PostGis时,图层名称默认为数据库表名,nativeName值一定要与表名一致。

样式文件

因为样式文件涉及到效果原因,暂不通过Java上传,直接使SLD相关工具编辑上传即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
springboot是一个非常流行的Java开发框架,它提供了开发和部署Java应用程序的便利性。而GeoServer是一个开源的地理信息系统服务器,它允许用户共享、处理和编辑地理空间数据。将这两者集成在一起可以很好地完成空间数据服务的开发和部署。 首先,我们需要在springboot项目中引入geoserver的相关依赖,可以使用Maven或Gradle来管理依赖。随后,我们需要配置geoserver的连接信息,比如geoserver的地址、用户名、密码等。这些信息可以写在springboot的配置文件中,也可以通过环境变量来配置。 在配置好连接信息之后,我们可以使用geoserver的REST API来实现对地理空间数据的操作。比如创建、删除、查询地图图层,叠加地图图层等等。这些操作可以通过http请求来实现,springboot可以很方便地使用RestTemplate或Feign来发送这些请求。 另外,我们也可以使用geoserver提供的地图发布服务来将地理空间数据发布为地图服务,供其他应用程序调用。通过springboot来集成这些服务也是非常方便的,我们可以将地图服务的访问地址直接暴露给其他应用程序调用。 最后,由于springboot是一个非常灵活和易于集成的框架,因此集成geoserver也是非常方便的。它可以帮助我们更好地完成地理空间数据服务的开发和部署,使得应用程序可以更方便地使用和展示地理空间数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值