天天看点

基于nodejs实现geoserver发布服务(tif,shp)一、使用REST接口操作Geoserver二、基于nodejs实现geoserver发布影像服务

一、使用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)一、使用REST接口操作Geoserver二、基于nodejs实现geoserver发布影像服务

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

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)一、使用REST接口操作Geoserver二、基于nodejs实现geoserver发布影像服务

在geoserver中查看操作结果:

基于nodejs实现geoserver发布服务(tif,shp)一、使用REST接口操作Geoserver二、基于nodejs实现geoserver发布影像服务
基于nodejs实现geoserver发布服务(tif,shp)一、使用REST接口操作Geoserver二、基于nodejs实现geoserver发布影像服务

发布成功的tif影像:

基于nodejs实现geoserver发布服务(tif,shp)一、使用REST接口操作Geoserver二、基于nodejs实现geoserver发布影像服务

发布出来的shp:

基于nodejs实现geoserver发布服务(tif,shp)一、使用REST接口操作Geoserver二、基于nodejs实现geoserver发布影像服务

继续阅读