本地shpfile 在geoserver发布地图服务

简要说明

	一般不建议调用geoserver-manager的发布接口,将shpfile的压缩包上传到geoserver的服务器进行发布,这样时效比较慢,建议被发布的文件和geoserver的站点在同一台服务器或者可以让geoserver站点读取到的挂载目录等

maven依赖

			<dependency>
                <groupId>com.github.dov-vlaanderen</groupId>
                <artifactId>geoserver-manager</artifactId>
                <version>1.8</version>
            </dependency>

样例代码

封装的入参实体

@Data
public class ReqDTO {

    /**
     * 站点地址
     */
    private String serverUrl;

    /**
     * 站点用户名称
     */
    private String userName;

    /**
     * 站点密码
     */
    private String passWord;

    /**
     * 工作区名称
     */
    private String workspaceName;

    /**
     *文件路径
     */
    private String dataPath;
   /**
     *图层名称
     */
    private String layerName;

    /**
     *样式名称
     */
    private String styleName;

    /**
     *样式文件路径,若有样式文件,会注册样式
     */
    private String styleFilePath;
}

辅助方法

/**
     * 获取geoserver管理器
     *
     * @param serverUrl
     * @return
     */
    public GeoServerRESTManager getManager(String serverUrl, String userName, String passWord) {
        try {
            GeoServerRESTManager manager = new GeoServerRESTManager(new URL(serverUrl), userName, passWord);
            System.out.println("连接geoserver服务器成功!");
            return manager;
        } catch (MalformedURLException e) {
            System.out.println("连接geoserver服务器失败");
        }
        return null;
    }
/**
     * 工作空间是否存在  不存在则创建工作空间
     *
     */
    private boolean judgeWorkspace(GeoServerRESTManager manager, String wokeSpaceName) {
        boolean wsFlag = false;
        GeoServerRESTPublisher publisher = manager.getPublisher();
        GeoServerRESTReader reader = manager.getReader();
        wsFlag = reader.existsWorkspace(wokeSpaceName);
        //判断工作空间是否存在
        if (!wsFlag) {
            System.out.println("工作空间不存在,创建工作空间");
            //创建一个新的存储空间
            wsFlag = publisher.createWorkspace(wokeSpaceName);
            return wsFlag;
        } else {
            System.out.println("工作空间已存在");
        }
        return wsFlag;
    }
/**
     * 判断或注册样式
     *
     * @param
     * @return
     */
    private boolean judgeStyleOrCreate(GeoServerRESTManager manager, GeoServerRESTReader reader, String styleName, File styleFile, Boolean localFlag) {
        if (StringUtils.isEmpty(styleName) && Objects.isNull(styleFile)) {
            return false;
        }
        if (!StringUtils.isEmpty(styleName) && Objects.isNull(styleFile)) {
            boolean styleValidateFlag = styleValidate(reader, styleName);
        }
        if (Objects.nonNull(styleFile)) {
            if (StringUtils.isEmpty(styleName)) {
                String styleFileName = styleFile.getName();
                styleName = styleFileName.substring(0, styleFileName.indexOf("."));
            }
            System.out.println("发布样式");
            publishSldFile(manager, styleFile, styleName);
            if (!localFlag) {
                //不是本地文件,即为上传的
                FileUtil.del(styleFile);
            }
            return true;
        }
        return false;
    }

/**
     * sld文件发布
     *
     */
    private void publishSldFile(GeoServerRESTManager manager, File styleFile, String styleName) {
        GeoServerRESTStyleManager styleManager = manager.getStyleManager();
        boolean result = false;
        //判断style是否已经存在,不存在则创建
        boolean existsStyle = styleManager.existsStyle(styleName);
        if (!existsStyle) {
            //不基于工作空间发布 true成功false失败
            result = styleManager.publishStyle(styleFile, styleName);
        } else {
            System.out.println("该样式已经存在");
        }
        return;
    }

/**
     * 本地shpfile 数据存储区判断和创建
     */
    private boolean dataValidateOrCreate(GeoServerRESTManager manager,GeoServerRESTReader reader, String workspaceName, File shpFile) {
        String shpFileName = shpFile.getName();
        String dsName = shpFileName.substring(0, shpFileName.indexOf("."));
        boolean existsDatastore = reader.existsDatastore(workspaceName, dsName);
        if (!existsDatastore) {
            //创建shape文件存储
            try {
                //shp文件所在的位置
                String urlDataStorePath = shpFile.getPath();
                // 数据存储需要的文件
                String shpFilePath = String.format("file://%s", urlDataStorePath);
                URL urlShapeFile = new URL(shpFilePath);
                // 创建数据集
                GSShapefileDatastoreEncoder datastoreEncoder = new GSShapefileDatastoreEncoder(dsName, urlShapeFile);
                existsDatastore = manager.getStoreManager().create(workspaceName, datastoreEncoder);
            } catch (Exception e) {
                System.out.println("创建shp存储区异常");
            }
        }
        return existsDatastore;
    }

主体发布代码

private void publishShpfileLocal(ReqDTO reqDTO) {
        //发布的结果
        boolean result = false;
        //获取管理器
        GeoServerRESTManager manager = getManager(reqDTO.getServerUrl(), reqDTO.getUserName()
                    , reqDTO.getPassWord());
        System.out.println("工作空间是否存在");
        //工作空间是否存在  不存在则创建工作空间
        boolean wsFlag = judgeWorkspace(manager, reqDTO.getWorkspaceName());
       GeoServerRESTPublisher publisher = manager.getPublisher();
       GeoServerRESTReader reader = manager.getReader();
       //判断是否要注册样式
       File styleFile = null;
       if (!StringUtil.isEmpty(reqDTO.getStyleFilePath())) {
             styleFile = new File(reqDTO.getStyleFilePath());
             if(!styleFile.exists()) {
             		System.out.println("样式文件不存在");
             		return;
             }
        }
        boolean styleFlag = judgeStyleOrCreate(manager, reader, reqDTO.getStyleName(), styleFile , Boolean.TRUE);
        //若有样式,重新设置值
        if (styleFlag) {
             String styleName = reqDTO.getStyleName();
             if (StringUtil.isEmpty(styleName) && Objects.nonNull(styleFile)) {
                  String styleFileName = styleFile.getName();
                  styleName = styleFileName.substring(0, styleFileName.indexOf("."));
                    localFilePublishReqDTO.setStyleName(styleName);
                }
            }
            //判断存储区是否存在,没有就创建
            boolean dsFlag = dataValidateOrCreate(manager, reader,reqDTO.getWorkspaceName(), shpFile);
            if(!dsFlag){
            	System.out.println("数据存储区创建失败");
            	return;
            }

            //判断图层是否已经存在,不存在则创建并发布
            String layerName = reqDTO.getLayerName;
            RESTLayer layer = reader.getLayer(reqDTO.getWorkspaceName(), layerName);
            if (Objects.isNull(layer)) {
                GSFeatureTypeEncoder gsFeatureTypeEncoder = new GSFeatureTypeEncoder();
                gsFeatureTypeEncoder.setTitle(layerName);
                gsFeatureTypeEncoder.setName(layerName);
                GSLayerEncoder gsLayerEncoder = new GSLayerEncoder();
                if (styleFlag) {
                    gsLayerEncoder.setDefaultStyle(reqDTO.getStyleName());
                }
                String shpFileName = shpFile.getName();
                String dsName = shpFileName.substring(0, shpFileName.indexOf("."));
                result = publisher.publishDBLayer(reqDTO.getWorkspaceName(), dsName, gsFeatureTypeEncoder, gsLayerEncoder);
            } else {
                System.out.println("shp图层已经发布过了");
            }
       
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值