当前位置: 首页 > news >正文

网站建设常州麦策电商wordpress 豆瓣fm

网站建设常州麦策电商,wordpress 豆瓣fm,网站建设的核心是什么,只会后端不会前端如何做网站1 NetCDF气象文件自动发布案例 GeoServer是一个地理服务器#xff0c;提供了管理页面进行服务发布#xff0c;样式#xff0c;切片#xff0c;图层预览等一系列操作#xff0c;但是手动进行页面配置有时并不满足业务需求#xff0c;所以GeoServer同时提供了丰富的rest接口…  1 NetCDF气象文件自动发布案例 GeoServer是一个地理服务器提供了管理页面进行服务发布样式切片图层预览等一系列操作但是手动进行页面配置有时并不满足业务需求所以GeoServer同时提供了丰富的rest接口可供用户自己组织业务逻辑进行自动化管理。   本文以气象文件的NetCDF自动化发布的需求阐述如何以rest接口实现用户多样性需求。气象文件特殊性在于几乎每隔一段时间就会更新甚至逐小时或半小时的更新频率用户如果手动发布了气象文件的若干图层作为专题服务一旦获取到最新的气象文件用户希望立马可以看到新的数据源上的专题图而人工即时更新现有的图层服务几乎是不现实的类似这种定时或者即时响应的需求应该交由自动化完成本文实现NetCDF气象文件自动发布便是为了解决此类需求。   1.1 NetCDF插件安装 选择对应版本的下载地址http://geoserver.org/release/2.11.0/ 下载插件解压将jar文件全部复制到geoserver中的webapps\geoserver\WEB-INF\lib目录中重启geoserver即可。 1.2 rest示例 发布nc文件数据存储 将E:\xxx.nc该文件发布成栅格数据存储发布到cite工作区数据存储名称为netcdfstore。 curl -v -u admin:geoserver -XPOST -H Content-type: text/xml -d coverageStorenamenetcdfstore/nametypeNetCDF/typeenabledtrue/enabledworkspacenamecite/name/workspace__defaultfalse/__defaulturlfile://E://xxx.nc/url/coverageStore http://localhost:8090/geoserver/rest/workspaces/cite/coveragestores/netcdfstore注意路径格式是file://E://xxx.nc而不是file://E:\xxx.nc或file://E:\\xxx.nc这应该是该插件的一个bug 修改nc文件数据存储 将netcdfstore的数据存储位置由E:\xxx.nc指向D:\xxv.nc。 curl -v -u admin:geoserver -XPUT -H Content-type: text/xml -d coverageStorenamenetcdfstore/nametypeNetCDF/typeenabledtrue/enabledworkspacenamecite/name/workspace__defaultfalse/__defaulturlfile://D://xxc.nc/url/coverageStore http://localhost:8090/geoserver/rest/workspaces/cite/coveragestores/netcdfstore发布栅格图层 将netcdfstore数据存储中的RH2图层发布 curl -v -u admin:geoserver -XPOST -H Content-type: text/xml -d coveragenativeCoverageNameRH2/nativeCoverageNamenameRH2/name/coverage http://localhost:8090/geoserver/rest/workspaces/cite/coveragestores/netcdfstore/coverages绑定图层样式 将发布的RH2样式绑定已经发布的一个名称叫RH2Style的样式。 curl -v -u admin:geoserver -XPUT -H Content-type: text/xml -d layer defaultStylenameRH2Style/name/defaultStyle/layer http://localhost:8090/geoserver/rest/layers/RH21.3 自动化发布 Node.js var child_process require(child_process); var async require(async); //构造一个netcdf管理类 function NetCDFManager(options){this.ipoptions.ip;this.portoptions.port;this._geoserverurlhttp://${this.ip}:${this.port}/geoserver/rest;this.useroptions.user;//geoserver的用户名密码this.passwordoptions.password;this.layerlistoptions.layerlist;this.ws(options.ws!undefined)?options.ws:netcdf;//工作区间默认是netcdf工作区间this.storename(options.storename!undefined)?options.storename:netcdfstore;//netcdf数据存储名称默认是netcdfstore } //根据名称获取栅格数据存储 NetCDFManager.prototype.getCoverageStorebyNamefunction(cb){let storenamethis.storename;let urlthis._geoserverurl/workspaces/${this.ws}/coveragestores/${storename}.json;var cmdcurl -v -u ${this.user}:${this.password} -XGET ${url};child_process.exec(cmd, function(err,stdout,stderr) {if(stdout.indexOf(No such)-1){cb(false);return;}if(JSON.parse(stdout).coverageStore.namestorename)cb(true);elsecb(false);}); } //发布一个栅格数据存储 NetCDFManager.prototype.publishCoverageStore function(netcdffile,cb){netcdffilenetcdffile.replace(/\\/g,//);var xmlcoverageStorename${this.storename}/nametypeNetCDF/typeenabledtrue/enabledworkspacename${this.ws}/name/workspace__defaultfalse/__defaulturlfile://${netcdffile}/url/coverageStore;var cmdcurl -v -u ${this.user}:${this.password} -XPOST -H Content-type: text/xml -d ${xml} ${this._geoserverurl}/workspaces/${this.ws}/coveragestores;child_process.exec(cmd, function(err,stdout,stderr) {if(stdout)cb(true);elsecb(false);}); } //修改已发布的数据存储 NetCDFManager.prototype.updateCoverageStore function(netcdffile,cb){netcdffilenetcdffile.replace(/\\/g,//);var xmlcoverageStorename${this.storename}/nametypeNetCDF/typeenabledtrue/enabledworkspacename${this.ws}/name/workspace__defaultfalse/__defaulturlfile://${netcdffile}/url/coverageStore;var cmdcurl -v -u ${this.user}:${this.password} -XPUT -H Content-type: text/xml -d ${xml} ${this._geoserverurl}/workspaces/${this.ws}/coveragestores/${this.storename};child_process.exec(cmd, function(err,stdout,stderr) {if(stdout)cb(true);elsecb(false);});} //发布一个图层 NetCDFManager.prototype.publishCoverage function(coverage_name,cb){let xmlcoveragenativeCoverageName${coverage_name}/nativeCoverageNamename${coverage_name}/name/coverage;let url${this._geoserverurl}/workspaces/${this.ws}/coveragestores/${this.storename}/coverages;var cmdcurl -v -u ${this.user}:${this.password} -XPOST -H Content-type: text/xml -d ${xml} ${url};child_process.exec(cmd, function(err,stdout, stderr) {if(stdout)cb(true);elsecb(false);}); } //给发布的图层赋予样式 NetCDFManager.prototype.setLayerStyle function(layername,stylename,cb){let xmllayerdefaultStylename${stylename}/name/defaultStyle/layer;let url${this._geoserverurl}/layers/${layername};var cmdcurl -v -u ${this.user}:${this.password} -XPUT -H Content-type: text/xml -d ${xml} ${url};child_process.exec(cmd, function(err,stdout, stderr) {if(stdout)cb(true);elsecb(false);}); }/* 伪逻辑代码1 根据数据存储名称判定是否有该数据存储。没有publishCoverageStore一个接步骤2.有updateCoverageStore即可end 2 publishCoverageStore发布数据存储后将规定要发布的图层逐一发布publishCoverage逐一赋予样式setLayerStyle 注意都是异步的需要后台代码转同步js中的async库负责处理异步陷阱其他语言自行百度。*/var netCDFManagernew NetCDFManager({ip:localhost,port:8090,user:admin,password:geoserver,ws:netcdf,storename:netcdfstore,layerlist:[RH2,SKT,TP,V10,VIS] }); function publish(ncfile) {async.waterfall([//查询是否已经存在命名为netcdfstore的数据存储function (done) {netCDFManager.getCoverageStorebyName(function (info) {done(null, info);});},function (info, done) {//已存在数据存储直接替换其数据源为新的nc文件if (info) {console.log(指定的数据存储已存在直接进行更新操作);netCDFManager.updateCoverageStore(ncfile, function (info) {if (info) {console.log(数据存储已经更新成功);done(null, info);} else {console.log(数据存储已经更新失败);done(info, null);}});}//不存在数据存储新发布else {console.log(指定的数据存储不存在发布数据存储);publishNC(ncfile, done);}}], function (error, result) {if (error)console.log(自动发布存在错误!);elseconsole.log(自动发布完成!);}) }function publishNC(ncfile,cb){async.waterfall([function (done) {netCDFManager.publishCoverageStore(ncfile,function(info){if(info){console.log(数据存储已经发布成功);done(null, info);}else{console.log(数据存储已经发布失败);done(info, null);}});}, function (resule,done) {//发布图层publishLayers(netCDFManager.layerlist,done);},function (result,done) {//发布样式publishStyles(netCDFManager.layerlist,done);}],function (error, result) {if(error){console.log(自动发布存在错误!);cb(error,null);}else{console.log(自动发布完成!);cb(null,result);}}) } //自动发布一些列图层 function publishLayers(layerlist,cb){let asyncs{};for(let i0;ilayerlist.length;i){asyncs[i]function(done){let layernamelayerlist[i];netCDFManager.publishCoverage(layername,function(info){if(info){console.log(${layername}发布成功);done(null, info);}else{console.log(${layername}发布失败);done(info, null);}});}}async.parallel(asyncs, function (error, result) {if(error)cb(error,null);elsecb(null,result);}) }//修改指定图层为指定样式 function publishStyles(stylelist,cb){let asyncs{};for(let i0;istylelist.length;i){asyncs[i]function(done){let layernamestylelist[i];netCDFManager.setLayerStyle(layername,layername,function(info){if(info){console.log(${layername}样式发布成功);done(null, info);}else{console.log(${layername}样式发布失败);done(info, null);}});}}async.parallel(asyncs, function (error, result) {if(error)cb(error,null);elsecb(null,result);}) }publish(D:\\G_2017070419.nc); 执行node app.js后     perfect!   2 实现批量发布地图服务 上文《GeoServer发布地图服务 》介绍了如何利用GeoServer发布WCS服务那么如果我有很多数据需要进行发布这样利用GeoServer提供的UI界面进行操作显然很不显示。那能不能利用GeoServer提供的API进行操作呢GeoServer提供了REST API方便我们利用代码进行操作。用户手册中提供了如下语言或方法进行操作cURLPHPPythonJava和Ruby。 可惜的是除了cURL有详细的文档之外其它语言参考文档很少。不得不说开源软件就是没有很好的技术支持毕竟是开源免费的也不可能有很好的技术支持免费开源给你用就是最大的奉献了。哈哈支持开源 Java篇 我先使用了Java语言的geoserver manager。在Eclipse新建一个Maven工程添加相应的依赖包下面是一个读出数据的例子 public static boolean read() {String restUrl http://localhost/geoserver;String username admin;String password geoserver;GeoServerRESTReader reader;try {reader new GeoServerRESTReader(restUrl, username, password);} catch (MalformedURLException e) {e.printStackTrace();return false;}String workspace whu.images;String store 00N006E;String name 00N006E;RESTCoverage coverage reader.getCoverage(workspace, store, name);System.out.println(coverage.getAbstract());return true;} 但是我在写入栅格数据的时候出现了一些问题如下是数据存储的类继承关系    我们可以看到Coverage Store没有实现类GSAbstractCoveragestoreEncoder是一个抽象类而且是被标注Deprecated的所以我不知道怎么新建Coverage Store本来想自己写一个实现类最终还是放弃了。 Python篇 后来才用的Python解决了问题但是也不是一帆风顺的。 首先安装gsconfig包如果不知道如何安装参考Python模块常用的几种安装方式。 安装完以后代码如下 如下采用默认的用户名密码默认的工作空间所以函数的参数很少如果你要自定义这些详细查看函数的说明。 from geoserver.catalog import Cataloggeourl http://localhost/geoserver/rest # the url of geoserver geocat Catalog(geourl) # create a Catalog objectstore_name 00N010E data E:/RSImageService/data/images/00N010E.tif geocat.create_coveragestore(store_name, data) 但是上面使用create_coveragestore有一个问题即会将你的文件默认拷贝到你的Data Directory中如果你数据很多这样你就会有两份数据了极大的浪费了磁盘空间。 后来发现Catalog类有提供一个create_coveragestore2的方法可以创建一个UnSavedCoveragestore数据不会上传。 from geoserver.catalog import Cataloggeourl http://localhost/geoserver/rest # the url of geoserver geocat Catalog(geourl) # create a Catalog objectstore_name 00N010E data_url fiel:E:/RSImageService/data/images/00N010E.tif geostore geocat.create_coveragestore2(store_name) geostore.url data_url geocat.save(geostore) 但是程序一运行就回返回一个服务器内部错误505Error code (505) from geoserver:: data store must be part of a workspace. 最后自己写了一个方法用于发布GeoTIFF影像从GitHub上看到的一段代码运行有点问题然后自己修改了下。给Catalog类添加一个create_coveragestore3方法用户发布栅格数据同时不复制数据。这需要修改gsconfig源代码然后重新编译下。 create_coveragestore3方法如下 def create_coveragestore3(self, name, data_url, workspaceNone, overwriteFalse):if not overwrite:try:store self.get_store(name, workspace)msg There is already a store named nameif workspace:msg in str(workspace)raise ConflictingDataError(msg)except FailedRequestError:# we dont really expect that every layer name will be takenpassif workspace is None:workspace self.get_default_workspace()headers {Content-type: text/plain,Accept: application/xml}ext geotiffcs_url url(self.service_url,[workspaces, workspace.name, coveragestores, name, external. ext],{ configure : first, coverageName : name})headers, response self.http.request(cs_url, PUT, data_url, headers)self._cache.clear()if headers.status ! 201:raise UploadError(response) 最后的客户端调用代码 from geoserver.catalog import Cataloggeourl http://localhost/geoserver/rest # the url of geoserver geocat Catalog(geourl) # create a Catalog objectstore_name 00N010E data_url file:E:/RSImageService/data/images/00N010E.tif geocat.create_coveragestore3(store_name, data_url) 如果你要发布很多数据遍历文件夹调用create_coveragestore3即可。 3. 利用java后台进行geoserver查询 使用后台的原因   由于项目要求之前的函数必须要拆开封装但对于jsonp来说回调函数一旦分开就会有异步的问题jsonp永远都是异步的除非你将处理都放到回调中去。所以考虑从前台传参到后台方法去处理后台再通过url来进行写入。 后台的主要实现方式 /** * geoserver查询 * param url 基地址 * param layer 图层名 * param key 键 * param value 值 * return */ public String Geo2server(String url,String layer,String key,String value){ StringBuilder json new StringBuilder(); MsgBox box null; try { url ?serviceWFSversion1.1.0requestGetFeaturetypeName layer outputFormatapplication%2FjsonfilterFilterPropertyIsEqualTo PropertyName key /PropertyName Literal value /Literal /PropertyIsEqualTo/Filter; URL newUrl new URL(url); HttpURLConnection conn (HttpURLConnection) newUrl.openConnection(); BufferedReader in new BufferedReader(new InputStreamReader(conn.getInputStream(),utf-8)); String inputLine null; while ( (inputLine in.readLine()) ! null) { json.append(inputLine); } in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return json.toString(); } 注意事项 由于没有做数据的分析所以有可能返回错误的数据但概率很小只要你地址没写出没数据的时候也能返回null也能成功。                 参考文章 遥想公瑾当年GeoServer实现NetCDF气象文件自动发布 TheOneGIS GeoServer代码实现批量发布地图服务 WilsonOnIsland, 利用java后台进行geoserver查询 转载于:https://www.cnblogs.com/arxive/p/8416427.html
http://www.pierceye.com/news/929121/

相关文章:

  • 福建省建设局网站安顺市哪里可以做网站
  • 网站服务设计仿《爱美眉》网站 dede
  • 茌平网站建设哪个地方可学习网站建设
  • 便民的网站app怎么做acg的wordpress主题
  • 外贸网站高端定做网络营销培训
  • 电子通讯录网站建设08影院wordpress影视主题源码
  • 电商设计素材网站推荐然后建设自营网站
  • 网站方案设计网页兼容性 网站开发
  • 做网站怎么申请域名游戏软件开发需要学什么
  • 做外贸网站需要什么卡创app开发 杭州app开发公司
  • 哪个网站可以做视频外链怎样退订3d卫星街景会员费用
  • 烟台做网站建设电话设置网站默认编码
  • seo官网制作规划绍兴seo整站优化
  • 怎么做网站广告设计学习
  • 邵东平台网站建设中山手机台app
  • 学什么可以做网站免费qq空间网站
  • 网站套餐到期啥意思电子商务电商网站饿建设
  • 电商网站零售客户重庆旅游景点
  • 建设银行成都官网招聘网站自主建网站
  • 云南省建设厅定额网站房地产开发公司是做什么的
  • 哪个网站卖自己做的手工艺品有哪些好的做网站公司好
  • 做电影网站用什么主机好最新网站域名
  • 唐山做网站公司汉狮价格搜索引擎禁止的方式优化网站
  • 做视频网站视频常见网站安全漏洞
  • 苏州企业名录黄页新乡网站自然优化
  • 有哪些建设网站公司网站建设需求单
  • 招聘网站做销售用手机网站做app
  • 做一个网站 多少钱撤销网站备案
  • 建设网站的流程图企业工资管理系统软件
  • 个人网站空间大小可以做网站的语言