欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于nodejs实现geoserver发布服务(tif,shp)

程序员文章站 2024-02-04 08:09:10
...

 

一、使用REST接口操作Geoserver

Geoserver有REST接口, 通过调用它的REST接口,可以实现在外部程序中对Geoserver的发布服务、数据管理操作。rest 接口使用HTTP调用的方式,无需登录Web管理界面就可以对GeoServer进行简单的调用和配置。

Geoserver官网的REST API使用教程(CURL对rest接口的调用):https://docs.geoserver.org/stable/en/user/rest/index.html

先要下载安装curl,地址:https://curl.haxx.se/download.html或者百度网盘链接: https://pan.baidu.com/s/1D3G-nCFfZZzdHAulqN3WpQ 提取码: x8zn,解压文件,将curl-7.61.1-win64-mingw\bin目录下 curl.exe 复制到C:\Windows\System32目录下即可。

先列出curl调用geoserver的rest接口命令:

新建工作区:

curl -v -u admin:geoserver -X POST -H "Content-type: text/xml" -d "<workspace><name>' + namespace + '</name></workspace>" http://localhost:8080/geoserver/rest/workspaces

上传tif影像:

curl -u admin:geoserver -XPUT -H "Content-type:image/tiff" --data-binary @' + tifpname + ' http://localhost:8080/geoserver/rest/workspaces/' + namespace + '/coveragestores/' + layername+ '/file.geotiff

上传shp:

curl -u admin:geoserver -X PUT -H "Content-type: application/zip" --data-binary @' + shppname + ' http://localhost:8081/geoserver/rest/workspaces/' + namespace + '/datastores/' + datastoresName+ '/file.shp

其中,namespace为工作区名称,tifpname为tif影像本地路径,layername为上传tif影像后的图层名,shppname为shp本地路径,datastoresName为shp上传后图层名。

二、基于nodejs实现geoserver发布影像服务

1、导入工具包

nodejs调用curl这里使用的是child_process包,通过开启子进程,实现在终端调用curl。

npm i child_process

引用安装好的child_process包:

let exec = require('child_process').exec;

定义工作区名称和上传的shapefile文件图层名:

let namespace = "china";
let datastoresName = "chinaLatest";

Tif文件和shp文件路径:

let tifpname = "D:/apache-tomcat-8.5.37/webapps/geoserver/data/data/TJ3.tif"  //tif文件路径
let shppname = "C:/Users/xxxx/Downloads/china-latest-free.shp.zip"  //shp文件路径

此处需要注意的是,shapefile必须要先打包成zip,不是将所有shapefile放入文件夹后大包,而是直接选中一系列文件后右键添加到压缩文件…”而不是把shapefile放到文件夹中再压缩。

基于nodejs实现geoserver发布服务(tif,shp)

本次从文件路径分别截取部分字段作为文件名或图层名,其实这里可以随意定义:

let tiflen = tifpname.split("/").length
let layername = tifpname.split("/")[tiflen - 1].split(".")[0]  //获取tif文件名
let tifname = tifpname.split("/")[tiflen - 1]  //获取tif文件名
let shplen = shppname.split("/").length
let shpname = shppname.split("/")[shplen - 1].split(".")[0]  //获取shp文件名

接下来将需要执行的curl命令结合以上定义好的字段,拼成相应的命令句子: 

 let mkspacestr = 'curl -v -u admin:geoserver -XPOST -H "Content-type: text/xml" -d "<workspace><name>' + namespace + '</name></workspace>" http://localhost:8080/geoserver/rest/workspaces'     //创建工作区的命令句子
let publishTifStr = 'curl -u admin:geoserver -XPUT -H "Content-type:image/tiff" --data-binary @' + tifpname + ' http://localhost:8080/geoserver/rest/workspaces/' + namespace + '/coveragestores/' + layername + '/file.geotiff'     //上传tif文件的命令句子
let publishShpStr = 'curl -u admin:geoserver -XPUT -H "Content-type: application/zip" --data-binary @' + shppname + ' http://localhost:8080/geoserver/rest/workspaces/' + namespace + '/datastores/' + datastoresName + '/file.shp'   //上传shp文件的命令句子

此处需要注意的是,datastoresName不能与tif影像的layername相同,因为一旦上传tif影像成功,生成相应的图层,则该数据存储类型已经被定义为GeoTIFF,此时如果将shp上传的图层名也命名为一样的名字,则会上传失败。

开始调用子进程,执行以上创建工作区、发布tif影像、发布shp:

exec(mkspacestr, function (err, stdout, stderr) {

  if (err) {

    console.log('make space error:' + stderr);

  } else {

    console.log("make new space " + namespace + " success!")    //提示工作区新增成功

    // 将影像文件路径名放入curl的put方法中发布影像

    exec(publishTifStr, function (err, stdout, stderr) {

      if (err) {

        console.log('publish error:' + stderr);      //提示错误信息

      } else {

        console.log("publish new tiff " + tifname + " success!")     //提示tif影像上传成功

        exec(publishShpStr, function (err, stdout, stderr) {

          if (err) {

            console.log('publish error:' + stderr);

          } else {

            console.log("publish new shapefile " + shpname + " success!")    //提示shapefile上传成功

          }

        })

      }

    })

  }

});

控制台打印结果:

基于nodejs实现geoserver发布服务(tif,shp)

在geoserver中查看操作结果:

基于nodejs实现geoserver发布服务(tif,shp)

基于nodejs实现geoserver发布服务(tif,shp)

发布成功的tif影像:

基于nodejs实现geoserver发布服务(tif,shp)

 

发布出来的shp:

 

 

基于nodejs实现geoserver发布服务(tif,shp)