懒羊羊

懒羊羊 查看完整档案

广州编辑  |  填写毕业院校  |  填写所在公司/组织 blog.csdn.net/liyuanxiang1984 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

懒羊羊 发布了文章 · 2017-08-07

ArcGIS 栅格函数在线调用详解

ArcGIS 栅格函数在线调用详解

导读:ArcGIS从10.0版本开始引用镶嵌数据集,并且第一次在影像中加入栅格函数(raster functions),使得影像的呈现和信息提取与GIS紧密的结合起来,简单的影像功能都可以在ArcGIS中实现(当然了,如果是专业的影像处理,还是建议在ENVI这类专业的遥感软件下进行)。ArcGIS软件向来注重一体化,因此,在桌面软件ArcMap中实现的功能都会逐渐迁移到服务器中。本文着重从桌面端功能介绍转移到服务器端及Web开发,旨在说明ArcGIS软件的栅格函数技术路线。 BY 李远祥

ArcMap中的栅格函数调用

在ArcMap中可以对任何影像格式,包括栅格数据集、栅格目录和镶嵌数据集。在菜单栏--【窗口】--【影像分析】中可以调出影像分析面板,如下图所示

2017-08-04-16-50-59

影像分析面板可以实现常见的图像处理功能,如果是熟悉Photoshop等软件,那就会发现一些非常数据的名词,如对比度、亮度、透明度、锐化、平滑、交互式拉伸等。但其最大的特色是栅格函数,随着每个版本的更新,栅格函数会逐渐增加。

在【影像分析】面板中选中影像数据之后,可以找到栅格函数的入口,包含了非常多的处理函数,如下图所示

2017-08-04-16-56-36

这些函数不同于ToolBox工具,Toolbox工具的特点就是每处理完一次都会生成一个新的栅格数据作为结果,整个过程会进行影像计算、重采样等,并占单独占用存储,一般处理时间比较长。栅格函数的性质是动态处理,函数与栅格数据的关系是引用关系,有点类似于PS里面的滤镜。在引用函数调用的时候不会生成新的数据,ArcMap会根据函数的设定动态对影像进行渲染,而且性能相当高。同时函数也是可以进行相互叠加的。

例如下图针对Landsat数据进行波段提取,提取第四波段。可以在栅格函数中直接使用【波段提取函数】,如下图

2017-08-04-17-02-07

2017-08-04-17-02-41

将波段组合设置为4,结果即马上生成一个动态的渲染图层,至显示第四波段数据,如下图所示

2017-08-04-17-04-03

如果是DEM数据,栅格函数还支持如坡度、坡向、山体阴影等操作。如下图就是对DEM进行的山体阴影的操作。

2017-08-04-17-10-16

imageserver 中的影像

将影像发布为影像服务,同样也支持栅格函数。影像服务发布需要ArcGIS Server 的imageserver 授权。栅格数据集、栅格目录和镶嵌数据集都支持直接发布为影像服务。在ArcMap的目录中右键选择影像,可以将其发布成影像服务,如下图:

2017-08-04-17-13-52

影像服务的发布过程与一般的地图服务Mapservice的向导类似,不过在其服务设置方面有自己的特点,如下图所示:

2017-08-04-17-15-16

通过rest地址访问已发布的影像服务,可以看到其影像服务的功能。其中一项就是栅格函数

2017-08-07-09-05-46

影像服务的调用与传统的mapservice类似,不过采用的是 ArcGISImageServiceLayer 接口。调用代码如下

        var map;
        require([
                    "esri/map",
                    "esri/layers/ArcGISImageServiceLayer",
                    "esri/layers/ImageServiceParameters",
                    "dojo/domReady!"],
                function(Map,ArcGISImageServiceLayer,ImageServiceParameters) {
                    map = new Map("mapDiv");                                                
                    var imgParams = new ImageServiceParameters();
                    imgParams.onData = 0;
                    
                    var layerUrl = "http://localhost:6080/arcgis/rest/services/LC441821/ImageServer";
                    var imageServiceLayer = new ArcGISImageServiceLayer(layerUrl,{
                        imageServiceParameters:imgParams,
                        opacity:0.75
                    });
                    map.addLayer(imageServiceLayer);
                    map.centerAt([113.34, 23.51]);
                });

这里除了使用接口加载影像服务之外,还使用了ImageServiceParameters 接口去设置影像服务的参数。例如上述代码使用的 imgParams.onData = 0; 就是设置影像的onData 。

ImageServiceParameters 是非常重要的影像服务接口,它涉及到影像服务的多种设置,栅格函数影像函数的设置最终也会落在该接口对应的参数中。

ArcGIS JavaScript API 使用栅格函数

imageservice 支持直接在前端使用栅格函数来重新渲染影像服务。ArcGIS JavaScript API 中集成了栅格函数的调用接口--RasterFunction 。 RasterFunction 不能单独使用,需要配合ArcGISImageServiceLayer和ImageServiceParameters 接口。

目前前端能支持的栅格函数类型不是特别多,从官方的在线帮助可以看到其具体能支持的类型和数量。支持的栅格函数可以访问此处 。下图是前端支持的栅格函数

2017-08-07-09-41-36

2017-08-07-09-47-11

ArcGIS在10.0版本之后每一个版本都加入了新的栅格函数,如上图显示的信息。所以在前端调用栅格函数之前,先要查询一下当前的ArcGIS Server 版本是否支持对应的栅格函数。

笔者建议在使用 JavaScript API 调用栅格函数之前,先在ArcMap中走通其流程,并针对结果进行。例如前面所说的提取影像的第四波段。

下面例子是使用JS API 调用波段提取函数。

        var map;
        require([
                    "esri/map",
                    "esri/layers/ArcGISImageServiceLayer",
                    "esri/layers/ImageServiceParameters",
                    "dojo/domReady!"],
                function(Map,ArcGISImageServiceLayer,ImageServiceParameters) {
                    map = new Map("mapDiv");                    
                    var rasterFunction = new esri.layers.RasterFunction();
                    rasterFunction.functionName = "ExtractBand";
                    
                    var functionArguments = {};
                    functionArguments.BandIDs= [4]                                       
                    rasterFunction.functionArguments = functionArguments;                   
                    rasterFunction.variableName = "Raster";    
                    
                    var imgParams = new ImageServiceParameters();
                    imgParams.onData = 0;
                    imgParams.renderingRule=rasterFunction;
                    
                    var layerUrl = "http://localhost:6080/arcgis/rest/services/LC441821/ImageServer";
                    var imageServiceLayer = new ArcGISImageServiceLayer(layerUrl,{
                        imageServiceParameters:imgParams,
                        opacity:0.75
                    });
                    map.addLayer(imageServiceLayer);
                    map.centerAt([113.34, 23.51]);
                });

效果如下图所示

2017-08-07-10-01-01

从代码中可以看出,关键部分是使用了RasterFunction接口,要调用什么样的函数,需要在 functionName 中设置其栅格函数名称。栅格函数的参数每个都不一样,这个就必须查看在线帮助了。例如波段提取函数名称为 ExtractBand ,在在线帮助中点击该名称,则跳转到它的参数说明和调用样例。如下图所示

2017-08-07-10-04-59

通过对应的参数来定义栅格函数的参数 functionArguments ,其中关键字部分是需要对应帮助说明的每一个参数名称。

例如将该LandSat影像服务设置为假彩色显示,可以通过提取波段函数进行参数的修改,如下图所示,将波段组合修改之后

2017-08-07-10-11-10

在页面端可以直接调用出来,如下图

2017-08-07-10-12-39

通过上述例子可以看出,栅格函数的使用是极其简单的。Esri 官方帮助提供了非常详细的接口说明。不过碍于都是英文,所以,笔者建议是先将ArcMap切换为英文版,在英文版上进行前期的函数调用,查看结果。英文版的ArcMap中的栅格函数名称是跟JS API 中的名称是完全对应的。

栅格函数模版

前面的内容旨在说明栅格函数的桌面使用和Web端调用。通过ArcMap的操作,很多人可能已经看到,栅格函数是可以叠加使用的。这种叠加在前端API可以照搬。不过如果叠加的函数比较多,就需要编写比较长的代码。

还有一种情况,ImageServer 中提供的栅格函数前端接口没有ArcMap的那么多,如果需要调用一些桌面端具备的接口,而目前前端还没提供的栅格函数,那就需要在服务器端配置栅格函数模版。

可以看看Esri官方帮助上调用的自定义的栅格函数,其渲染效果相当不错。这种效果在前端API是无法实现的。

2017-08-07-10-23-50

栅格函数模版需要在ArcMap中进行设计,其设计到栅格函数的调用和结果的渲染。

先说说前端渲染,目前ArcGIS JavaScript API 能支持的前端渲染是colorMap方式,就是类似栅格数据分类渲染,其构建方式如下

 [[0,175,240,233],[3,175,240,222]]

这种方式构建为数组,第一个数组值是栅格象元值,后面三个数值分别为RGB值。定义比较麻烦,需要对所用的象元值都给顶一个RGB值才能实现前端渲染。例如下面构建一个非常庞大的 colorMap 。

var colorMap = [[0,175,240,233],[3,175,240,222],[7,177,242,212],
          [11,177,242,198],[15,176,245,183],[19,185,247,178],[23,200,247,178],
          [27,216,250,177],[31,232,252,179],[35,248,252,179],[39,238,245,162],
          [43,208,232,135],[47,172,217,111],[51,136,204,88],[55,97,189,66],
          [59,58,176,48],[63,32,161,43],[67,18,148,50],[71,5,133,58],[75,30,130,62],
          [79,62,138,59],[83,88,145,55],[87,112,153,50],[91,136,158,46],[95,162,166,41],
          [99,186,171,34],[103,212,178,25],[107,237,181,14],[111,247,174,2],
          [115,232,144,2],[119,219,118,2],[123,204,93,2],[127,191,71,2],[131,176,51,2],
          [135,163,34,2],[139,148,21,1],[143,135,8,1],[147,120,5,1],[151,117,14,2],[155,117,22,5],
          [159,115,26,6],[163,112,31,7],[167,112,36,8],[171,110,37,9],[175,107,41,11],
          [179,107,45,12],[183,105,48,14],[187,115,61,28],[191,122,72,40],[155,117,22,5],
          [159,115,26,6],[163,112,31,7],[167,112,36,8],[171,110,37,9],
          [175,107,41,11],[179,107,45,12],[183,105,48,14],[187,115,61,28],[191,122,72,40],
          [155,117,22,5],[159,115,26,6],[163,112,31,7],[167,112,36,8],[171,110,37,9],
          [175,107,41,11],[179,107,45,12],[183,105,48,14],[187,115,61,28],[191,122,72,40],
          [195,133,86,57],[199,140,99,73],[203,148,111,90],[207,153,125,109],
          [213,163,148,139],[217,168,163,160],[223,179,179,179],[227,189,189,189],
          [231,196,196,196],[235,207,204,207],[239,217,215,217],[243,224,222,224],
          [247,235,232,235],[251,245,242,245],[255,255,252,255]];                

在栅格函数设置的时候,可以指定渲染方式,例如

functionArguments.Colormap = colorMap;

这种方式构建工作量巨大,而且没有任何的界面设计器可用。目前还没有前端接口支持拉伸方式渲染,例如桌面端的【渲染地貌函数】采用的色带配置。

2017-08-07-10-38-28

这些都需要在服务器端来栅格函数模版。

首选需要在ArcMap中调用【栅格函数模版编辑器】对栅格函数进行配置。在ArcMap菜单栏【窗口】--【自定义】面板中,选择【命令】标签,输入关键字【栅格】,找到【栅格函数模版编辑器】,将其拖动到菜单的工具条任意位置即可使用

2017-08-07-10-42-10

2017-08-07-10-45-10

从图上可以看到,其界面与【影像】面板中调用的栅格函数的方式非常类似。但它有自己非常独特的地方,多了一个【文件】菜单,可以将设计好的影像分析流程保存下来。如下图所示

2017-08-07-10-46-46

笔者做了一个例子,使用DEM数据进行地形渲染。【渲染地貌函数】并不在前端栅格函数的支持范围,其显示的渲染效果是拉伸方式,前端api同样不支持。这个例子很好的反映出服务器中栅格函数模版的重要性。

针对dem数据在【栅格函数模版编辑器】中使用【渲染地貌函数】,并且设计好结果的渲染方式。

2017-08-07-10-50-30

设置好后,在【栅格函数模版编辑器】的【文件】菜单中【另存为】将其保存在rft.xml 文件。例如,笔者这里将配置好的模版另存名称为 customfun.rft.xml

此处一定要使用英文名称。因为该模版一旦被导入到imageservice中,其调用名称与文件名称对应。中文名称在调用的时候rest路径会出现一些特殊的符号,导致浏览器请求失败。所以一定要使用英文。

配置栅格函数模版可以在两种情况下进行。第一种是在影像服务发布的时候进行导入,在服务编辑器的【函数】项中设置,如下图所示,点击【管理】,在管理面板中加入一个或者多个栅格函数模版。

2017-08-07-10-57-34

注意:笔者这里使用的模版存放在计算机桌面中,可以通过截图看清楚。在影像服务发布的时候指定栅格函数模版,无论栅格函数模版文件放在什么目录下,都能识别,因为arcgis server 最终会将这个模版文件拷贝到服务器能访问的目录中。

点击【确定】并发布影像服务,栅格函数模版会随着服务发布注册到对应的服务目录中。下图是从服务的属性中重新查看其模版情况,可以看到这个模版已经自动被拷贝到arcgisserver注册的目录中

2017-08-07-11-02-30

另一种情况是向已经存在的影像服务注册栅格函数模版,这稍微复杂一点,要先将模版文件拷贝到arcgis server 已注册的文件目录下,不然imageserver 无法访问到对应的路径,导致模版读取失败 ,如下图

2017-08-07-11-04-15

然后停止对应的影像服务,在服务属性对应的【函数】项目导入模版文件。导入后重启对应的影像服务即可。

在浏览器中通过rest访问对应的影像服务,点击 rasterFunctionInfos 项,可以查看到对应的栅格函数模板的内容

2017-08-07-11-09-37

2017-08-07-11-12-31

从图上可以看出,影像服务上多了一个以栅格函数模版文件名为命名的自定义函数。这个函数名相当重要,在ArcGIS JavaScript API 的调用中需要使用到。

自定义栅格函数的调用与一般的调用方式没有任何不一样的地方,只需要在rasterFunction.functionName修改函数名称即可。下面是调用自定义函数的代码例子

        var map;
        require([
                    "esri/map",
                    "esri/layers/ArcGISImageServiceLayer",
                    "esri/layers/ImageServiceParameters",
                    "dojo/domReady!"],
                function(Map,ArcGISImageServiceLayer,ImageServiceParameters) {
                    map = new Map("mapDiv");    
                    var rasterFunction = new esri.layers.RasterFunction();
                    rasterFunction.functionName = "customfun";//自定义栅格函数                    
                    rasterFunction.variableName = "Raster";                    
                    var imgParams = new ImageServiceParameters();
                    imgParams.onData = 0;
                    imgParams.renderingRule=rasterFunction;
                    
                    var layerUrl = "http://localhost:6080/arcgis/rest/services/dem/ImageServer";
                    var imageServiceLayer = new ArcGISImageServiceLayer(layerUrl,{
                        imageServiceParameters:imgParams,
                        opacity:0.75
                    });
                    map.addLayer(imageServiceLayer);
                    //map.centerAt([113.34, 23.51]);
                });

具体的效果如下图所示

2017-08-07-11-18-45

利用栅格函数模版的方式可以将很多常用的栅格表达方式注册到影像服务中,非常方便快速切换影像的显示方式,而且栅格函数模版是可以复用的。

总结

栅格函数虽然在ArcGIS10.0之后的版本才提出来,并在每一个ArcGIS版本中逐步完善和增加功能。从技术路线上看,栅格函数模版的方式依然是主流的调用方式(尽管这种方式很早就在imageserver 中使用),但前端调用的接口也越来越完善,Esri也在进一步开放其前端功能。在当前影像数据获取越来越便捷和廉价的情况下,影像的使用不仅仅是停留在浏览阶段,分析功能和多种表达方式也是越来越重要了。

更多的GIS主流和非主流技术,可以持续关注CSDN的GIS制图乐园,以及微信公众号【GIS制图乐园】。BY 李远祥

查看原文

赞 1 收藏 2 评论 0

懒羊羊 关注了用户 · 2017-08-01

余果 @yuguo_59801e6038b47

关注 1

懒羊羊 发布了文章 · 2017-07-16

ArcGIS Portal 环境快速部署方法--ArcGIS Enterprise Builder

ArcGIS Portal 环境快速部署方法--ArcGIS Enterprise Builder

ArcGIS Portal 作为ArcGIS Online 的本地部署方式,已经推出市场好几年了。由于对安装环境的要求比较高,涉及到的组件比较多,不像ArcGIS Server 安装那么容易。最近Esri在刚推出的ArcGIS10.5.1 版本中,增加了ArcGIS Portal 环境的快速部署方法--ArcGIS Enterprise Builder,让ArcGIS Enterprise 基础环境(Portal)安装简化了非常多。 BY 李远祥

传统的ArcGIS Portal 环境搭建

传统的ArcGIS Portal安装经搭建比较复杂,涉及到比较多的内容,如Web Server 的配置,Https 开启、域名、证书等;ArcGIS 部分涉及到ArcGIS Server、Datastore、webadaptor、Portal 等。没有几年的ArcGIS Server 使用经验的基本上不能理解其流程。以下稍为回顾以下传统的ArcGIS Portal环境搭建流程:

  1. 配置好服务器的Web环境。由于ArcGIS Portal 需要https 环境,因此涉及到域名、证书等一系列的操作。这是传统IT部分,一般需要网管负责处理。

  2. ArcGIS Server 安装。按照传统ArcGIS Server 安装即可。

  3. 安装ArcGIS Datastore ,并注册到ArcGIS Server 中。

  4. 安装 ArcGIS Webadaptor,并将 ArcGIS Server 连接到Webadaptor中(建议这样做)

  5. 安装ArcGIS Portal。

  6. 配置ArcGIS Portal 的Webadaptor。

  7. 联合ArcGIS Server 到 ArcGIS Portal 中。

这七个步骤都涉及到软件安装、设置等操作,如果部署环境处理得不够好,很容易出错。

ArcGIS Enterprise Builder 部署方式

ArcGIS Enterprise Builder 大大的简化了ArcGIS Portal的部署步骤,前面七步的操作大大压缩成为三步,而且内置了环境设置脚本,基本上达到自动化部署。

全新的软件安装包

ArcGIS Enterprise Builder 有全新的安装介质,并不是单纯的一个简单运行程序。拿到安装介质的ISO,打开可以看到其文件结构如下
2017-07-16-15-13-11

展看文件夹内容,里面都是ArcGIS Enterprise 的基本组件,包括ArcGIS Server、datastore、Portal、Webadaptor等,这些与原来的安装组件是一样的,这个Enterprise Builder 的安装介质属于二次打包 ,如下图
2017-07-16-15-14-48

这里要注意的是 Webadaptor 分别有portalAdaptor 和 ServerAdaptor 。其实它们是一个东西,但安装的时候会分别安装。可以看出Esri对于Portal环境的建议是Server和Portal分别使用Webadaptor

ArcGIS Enterprise Builder 安装部署

基本上将原来复杂的安装压缩为三步

  1. 配置好服务器的Web环境。

  2. 安装软件。

  3. 自动化配置软件。

配置好web环境之后,直接运行其安装程序Builder.exe ,会有向导进行提示安装,如下图

2017-07-16-15-18-39

2017-07-16-15-19-01

环境检测和接受许可之后就是指定安装目录,这个目录会将ArcGIS Server 、Portal、datastore 等都安装进去,相对于以前不同,传统方式是每一个组件可以单独选择安装目录,这次是统一存放。

2017-07-16-15-20-58

接下来需要的是指定一个arcgis的操作系统用户。如果这个用户不存在,安装程序会自动创建,这跟ArcGIS Server 类似 。如下图

2017-07-16-15-22-02

笔者建议在安装前先创建这个arcgis操作系统用户,并赋予其管理员组级别,这样可以防止安装过程中的一些权限配置问题。

接着就是制定Portal 和Server 的许可文件。

2017-07-16-15-23-55

点击 Install 就可以安装了。整个安装过程比较长,但不需要每个组件单独安装。

2017-07-16-15-25-07

安装开始的时候会有一个检查系统环境的过程,这个过程会持续好几分钟。

2017-07-16-15-25-58

笔者监测了这个过程,发现并没有任何的文件写入一开始指定的ArcGIS安装目录中,属于纯粹的系统环境检测。

2017-07-16-15-27-22

第一个被安装的组件就是ArcGIS Portal 。

2017-07-16-15-28-16

其目录结构与原来的Portal没有变化

2017-07-16-15-28-58

Portal 安装完之后就是ArcGIS Server ,这个过程中没有弹出Portal的配置。实际上在整个安装过程中都没有配置页面弹出。

2017-07-16-15-30-02

2017-07-16-15-30-27

Server 安装完毕之后就是ArcGIS Datastore

2017-07-16-15-31-00

然后是Portal的Webadaptor,再然后是Server 的Webadaptor,接着就是提示安装完毕。

2017-07-16-15-31-39

2017-07-16-15-31-57

2017-07-16-15-32-13

点击finish 按钮,进入到整个ArcGIS Enterprise 的配置页面

2017-07-16-15-33-16

由于笔者使用的是自签名证书,所以,在配置之前先安装好证书,然后重新输入路径。

接着看到ArcGIS Enterprise 的配置向导

2017-07-16-15-34-50

点击【创建】按钮,开始创建工作。要求输入一个管理员的用户和密码,这个是ArcGIS 自己的用户密码,不是操作系统的用户和密码,类似于ArcGIS Server manager 的用户和密码。不过这个管理员用户和密码是Server 与 Portal 共用的。

2017-07-16-15-35-57

接下来就是输入一些管理员用户的信息,类似Portal 创建时的操作。

2017-07-16-15-37-57

然后就是一个配置目录,如下图

2017-07-16-15-38-30

这个配置目录会包含所有的Portal 、Server 、Datastore 的配置,所有的全写到这个目录中。

点击完成按钮,就进入到整个Portal环境的自动配置阶段。

2017-07-16-15-40-17

从页面提示可以看到配置的流程为验证环境、创建Portal、创建GIS Server 站点、将Datastore注册到GIS Server、配置 Webadaptor 、联合 GIS Server 与 Portal 。跟传统方式比较类似,只是全自动化而已。

2017-07-16-15-40-53

但在这个创建过程中,笔者发现ArcGIS Server 在C盘创建了一个特定的目录,arcgisserver ,而配置目录下也有同样的arcgisserver 文件夹。

2017-07-16-15-43-21

在C盘根目录下的存放的是log文件夹,在配置目录下存放的是传统的ArcGIS Server 站点信息。目前不清楚为什么没有放到同一个目录下。

如果顺利的话,基本上会自动完成整个过程,会提示配置完成

2017-07-16-15-45-39

可以看到门户网站路径和GIS Server manager 路径。这两个路径与传统的方式不太一样。

2017-07-16-15-47-11

2017-07-16-15-47-30

安装出现的问题

安装这类型的大型系统,永远都不可能是一帆风顺的,遇到问题是必然的。但总体上来说会比传统的安装模式要好多了。

笔者在一开始安装的过程中也不算顺利,遇到了一些问题。最终的问题在Webadaptor 自动配置的时候出现问题。

2017-07-16-15-50-36

弹出的错误是说ArcGIS的账户(指的是前面Server 和 Portal共有的账户)没有权限或者Portal没有运行。

2017-07-16-15-51-38

首先可以肯定的是Server 没有问题,通过server manager账号可以进入。

然后 Portal 账号也可以进入到系统中去。如果按照传统方式,笔者自行配置Portal的Webadaptor,继续点击配置运行页面,还是提示出错。如下图

2017-07-16-15-53-44

重启ArcGIS Portal 之后继续进行自动配置,问题依然存在。

后来笔者通过Chrome的调试去查看网络请求,发现一些问题,红框请求页面出现了404

2017-07-16-15-55-03

通过思考,笔者终于明白了问题所在。ArcGIS Portal 安装完成后,默认的语言环境是英文,而部署环境是中文的windows 环境,导致了Enterprise Builder 在发送请求的时候按照系统环境发送,从而无法获取到portal信息。所以才提示arcgis账户没有权限或者portal没有运行。

处理办法很简单,如果是中途安装打断了。可以通过管理员账号登录到portal主页,将其语言环境设置为中文,然后点击配置页面继续运行(如果你还没关闭配置页面的话)

2017-07-16-15-58-41

导致这个问题的原因完全有可能是Esri美国方面可能没有在多国语言环境下做测试,又或者是笔者所使用的是英文版的ArcGIS Enterprise Builder 。

最理想的安装做法

笔者本来打算找到Portal的tomcat进行修改里面的配置,让自动配置页面继续运行。后来思考了一下,放弃了这个想法,谁知道修改了一处还有多少出存在这样的语言环境问题。

所以,最后出来的结论是安装操作系统的英文语言包,去微软官方网站下载对应的系统英文语言包,然后切换到英文下安装。

最起码是在配置页面运行前切换到操作系统的英文版本,这样安装就一定问题都没有,而且非常顺利。笔者在windows 2008 r2 sp1 和 windows 2012 版本都做过测试。感觉比传统方式方便多了,而且出错的概率大大降低,基本上连小白都能安装了。 ^_^ BY 李远祥

查看原文

赞 2 收藏 2 评论 1

懒羊羊 关注了用户 · 2017-07-12

wangcw @redgreat

不崇拜知識,但曉得知識可以改變命運。

关注 3

懒羊羊 关注了用户 · 2017-07-12

突突突3949 @tututu3949

关注 1

懒羊羊 关注了用户 · 2017-07-12

_CRY @_cry

How dare we sit quietly
And watch the world pass us by

关注 22

懒羊羊 发布了文章 · 2017-07-11

ArcGIS水文分析实战教程(10)河流平均比降计算

ArcGIS水文分析实战教程(10)河流平均比降计算

本章导读:河流比降指的是河流任意两端点间的高程差与两点间的水平距离之比值,简单的概括为单位河长内的落差,其单位一般都是‰ 。 河流(纵)比降对地质灾害、水运、水电、矿砂和新构造运动研究有实用价值。比降是水文学上重要的一项指标。在绝大部分的GIS通用平台上,都没有实现平均比降的计算,原因在于计算比降的条件比较苛刻,不符合通用GIS的要求。本章同样是一个实操章节,笔者将会利用ArcGIS软件,结合其ArcPy编写一个平均比降计算的工具,在通用GIS软件上实现河流平均比降计算。 BY 李远祥

河流比降

河流比降是很多水文研究者研究的内容,其水文意义非常的大。这里研究的河流比降指的是河流的纵比降,是河流任意两端点间的高程差与两点间的水平距离之比值,即单位河长的落差。

正是因为直接表达的是单位河长的落差,所以在水文学上其最直接的影响就是流速,带来更多的水动力引发的能量转移,如势能与动能的转化(涉及到水电站的建设);河水对河床和河岸的冲刷,影响泥沙量;大面积持续降雨时,洪峰到来的时间和强度等。所以,比降在水文学上从来就不缺少话题。

河流的比降分为床面比降和水面比降。床面比降,用以表示河床纵断面地形的变化;水面比降即河流中任意两端点间的瞬时水面高程差与其相应水平距离之比,用以表明河流全程或分段的水面坡度,故又称水力坡度,通常说的河流比降就是河流水面比降。

在恒定均匀流情况下,水面坡度恰好等于河底坡度。所以,在没有大量断面数据支撑的情况下,根据地形和河流线型去研究的河流比降都是床面比降

笔者在这里研究的都是床面比降,因为只考虑地形与河流本身的几何形状,没有任何的站点数据支撑。但在非洪水情况下,这个床面比降与水面比降基本上是吻合的。

在河流相距较短的两个点上计算河流比降,意义不是十分大。一般需要计算的是整个河流或者某一河段的平均比降,这对于空间跨度较大的河流来说才有研究价值。

本章研究的内容也就是河流(段)的平均比降。研究河流平均比降的方法有几种,比较流行的是【约翰斯通-克罗斯】法。其原理是根据比降大致均匀的原则,将河段划分为若干个子河段,然后去计算整体的平均比降。其公式如下:

2017-07-11-15-54-47

公式中个参数如下
S---- 河段平均河底比降
Li----第i个子河段长度
Si----第i个子河段河底比降
N---- 子河段数量

另一种方法是【劳伦斯】法,其需要经验系数和流速,相对来说比较复杂,需要结合测站的一些数据。由于笔者没有这些数据,就不作论述。

本章考虑的是在ArcGIS中实现【约翰斯通-克罗斯】法的计算。

河流比降与GIS的关系

利用GIS手段来研究水文,其核心方式是使用DEM数据去模拟水文过程。GIS的空间叠加能力非常的管用,非常简单的就能获取到河流线对应的DEM像元值,也就是河流对应的高程值,这样用于计算比降是非常有用的。最起码解决了河流高程点获取的问题。

河流沿线高程的获取,不能直接使用原始的DEM数据。原因有两点:

  1. 如果河流数据与DEM数据不是同一份数据,那么像元点与河流线的重合程度有待商榷。

  2. 如果河流数据与DEM数据吻合(或者河流数据直接从DEM数据提取出来的),其高程的获取所依赖的DEM必须是填洼后的无凹陷点DEM。

河流线属于一维数据,DEM在平面上属于二维数据,其相交之后会产生一个像元点的连续像元。如果了解过D8单流向算法的话,就可以很容易理解,如果直接从原始DEM中获取像元值,其值有可能是一个汇点(凹陷点)。然而使用填洼后的DEM,可以确保该点与周边一点的高程持平。

下图是一个测试数据,黄色部分为河流线,点为河流的节点。包含两份DEM,一份是原始的DEM,一份是填洼过的DEM(Fill_DEM) 。河流是使用了前面章节介绍到的河流提取方法提取出来的线状河流。读者可以参考《ArcGIS水文分析实战教程(6)河流提取与河网分级》的做法去提取。
测试的主要内容是分两种情况打印河流各节点的高程值。一是获取原始DEM的高程值,而是获取填洼后的DEM的高程值。通过高程值进行对比选用不同数据引起的差异。

2017-07-11-15-30-39

2017-07-11-15-34-11

第一张图是原始DEM的沿河高程值,第二张图是填洼后的DEM的沿河高程值。可以看到使用原始DEM的时候,有可能出现下游高程比上游高程还要高的情况,也就是说这个上游地势低的点刚好就是一个汇(凹陷点)。而填洼后的DEM则会将这个点给填平,确保不会断流,从而使得下游高程最少不会高于上游高程。对比其他高程值,是没有变化的,变化的部分就只是出现【汇】的点。

如果原始DEM的精度足够高的话,这种情况一般很少碰到。但为了稳妥起见,笔者还是建议对原始DEM做填洼,生成无凹陷点的DEM。读者可以参考之前章节 《ArcGIS水文分析实战教程(4)地形预处理

如果所使用的河流是从DEM中提取出来的,那么在矢量河流提取的时候使用【栅格河流矢量化】时是否需要使用【简化折线】参数,这个参数是默认选上的,如下图所示:

2017-07-10-14-20-16

不选择简化折线,河流线会基本上就是按照流量线走向,河流折点密度会比较高;选择简化的话,河流线的折点会被抽希一部分。这个怎么取舍?如果在地形变化比较大的情况下,不建议简化;如果地势趋平,那就直接简化线。这种方式会直接影响到最终的比降数值。

下图黄线部分是简化节点后的河流线,红线是没有简化节点的河流线,其形状基本上是重合的,而且在关键的河流节点上,也是完全重合。

2017-07-10-14-16-11

也就是说,简化与不简化,其参与计算的河段数量是不一样的。上图数据中简化后的子河段数为32,不简化子河段的数量是92 。如果人为计算的话,那么可定是后者的计算量比较大了。

ArcGIS中实现河流平均比降计算

ArcGIS 除了前面章节提及到的水文分析工具及其相关工具之外,还有非常庞大的工具集对空间计算进行支撑。由于没有断面数据的支撑,这里只考虑通过地形和河流线型进行计算,也就是说实现【约翰斯通-克罗斯】法。

根据【约翰斯通-克罗斯】法的计算公式,可以推导出其分析流程

  1. 通过河流线提取河流折点,利用这些折点与DEM数据叠加,获取高程值

  2. 利用河流折点,获取其坐标值,根据两点距离公式,计算每一段子河段的长度

  3. 根据每个点的高程值,计算出相邻两点之间的高差

  4. 根据高差与子河段长度,计算出各子河段的河底比降

  5. 汇总这些数据计算出整个河段的平均河底比降

在这5各步骤中,只有第1步与ArcGIS工具有关。河流的折点提取,可以使用【数据管理】--【要素】--【要素折点转点】工具来实现,如下图所示:
2017-07-11-16-14-08

至于利用折点与DEM数据叠加,获取其高程值,可以使用【数据管理】--【栅格】--【栅格属性】--【获取像元值】工具来获取。这个工具每次只能实现一个坐标点与DEM数据叠加查询。如下图

2017-07-11-16-17-22

所以,为了方便计算,笔者采用ArcPy去写一个脚本工具,实现参数的灵活输入。其中heightList就是用来保存高程值的数组。

    # 获取河流的节点,以用作计算高差和河长
    for row in arcpy.da.SearchCursor(outLine1, ["SHAPE@XY"]):
        # 从点图层数据获取所有的点的XY
        x, y = row[0]
        #从地形数据中获取其高程的象元值
        pointStr = str(x) +" "+str(y)
        result = arcpy.GetCellValue_management(dem,pointStr)
        riverPoints.append(row[0])
        heightList.append(str(result))

第2-5步基本上就是一些数学的运算,利用python就很好实现了。为了让广大水文研究者用起来,笔者将这段代码公开,并且制作成为工具。在代码中笔者已经预留了ArcGIS的工具参数,方便制作成为脚本工具。

河流平均比降【约翰斯通-克罗斯】法的实现代码如下

#############################################################
#                                                           #
#   该工具利用【约翰斯通-克罗斯】方法计算河底平均比降           #
#   在使用的时候必须先选择一条河流,工具会判断输入的河流数量     #
#   大于一条河流时不予以计算                                  #
#   用于计算的DEM为无凹陷点DEM                                #
#   BY 李远祥                                                #
#                                                            #
##############################################################


# -*- coding: gbk -*-
import arcpy
import math
inputLine =arcpy.GetParameterAsText(0) #河流图层

dem = arcpy.GetParameterAsText(1) #无凹陷点DEM
riverLen = 7873.232038

arcpy.AddMessage(u'..................')
arcpy.AddMessage(u'......开始执行...........')

# 记录高程值的数据
heightList = []

iputCout=0
mmCursor = arcpy.da.SearchCursor(inputLine, ["SHAPE@LENGTH"])
for row1 in mmCursor:
    riverLen = row1[0]      #顺便获取河流长度
    iputCout=iputCout+1

arcpy.AddMessage(u'......获取了河流长度......')
#如果选中的是一个线要素,则执行计算,否者不计算多条河流
if iputCout==1:
    ##先将线转为折点
    outLine1 = arcpy.FeatureVerticesToPoints_management(inputLine, "in_memory/outline")
    arcpy.AddMessage(u'......河流线已经转换为点集.......')

    #河流节点
    riverPoints = []

    # 获取河流的节点,以用作计算高差和河长
    for row in arcpy.da.SearchCursor(outLine1, ["SHAPE@XY"]):
        # 从点图层数据获取所有的点的XY
        x, y = row[0]
        #从地形数据中获取其高程的象元值
        pointStr = str(x) +" "+str(y)
        result = arcpy.GetCellValue_management(dem,pointStr)
        riverPoints.append(row[0])
        heightList.append(str(result))

    arcpy.AddMessage(u'......已经获取了折点的高程值......')
    #子河段长度

    subRiverList = []
    hDiffList = []
    # 计算每一个子河段的长度
    for i in range(0,len(riverPoints)-1):
        x,y = riverPoints[i]
        x1,y1 = riverPoints[i+1]
        #计算河段长度
        dis =math.sqrt(pow((x1-x),2)+pow((y1-y),2))
        subRiverList.append(dis)

    arcpy.AddMessage(u'......河流子河段长度计算完成完成.......')

    # 计算从高程从低到高部分的差距
    listLen = len(heightList)
    for j in range(0,listLen-1):
        h1 = float(heightList[j])
        h2 = float(heightList[j+1])
        xheight = 0
        xheight = h1-h2
        hDiffList.append(xheight)

    arcpy.AddMessage(u'......各折点的高程差计算完成......')

    # 计算每个河段的比降
    subbijiang = []
    for i in range(len(hDiffList)):
        Si= hDiffList[i]/subRiverList[i]
        subbijiang.append(Si)

    arcpy.AddMessage(u'......子河段比降计算完成......')
    # 计算最终的比降
    # 计算分子
    sumUp = 0
    for i in range(len(hDiffList)-1):
        sumUp = sumUp + subRiverList[i]*pow(subbijiang[i],0.5)

    S = pow((sumUp/riverLen),2)

    arcpy.AddMessage(u'......该河流的总长为: ' + str(riverLen)+u'   平均比降为: ' +str(S))
    arcpy.AddMessage(u'......计算完毕.......')

else:
    arcpy.AddMessage(u'......您选中了 '+str(iputCout) +  u'  条河流......')
    arcpy.AddMessage(u'......工具已经停止计算,没有算出您想要的结果......')
    arcpy.AddMessage(u'......因为您目前选中了多条河流。只能选中一条河流进行计算!......')

从代码中可以看到,这个工具针对的是一条河流进行计算的。如果想指定河流的某一段进行计算,那么就需要将河流转为折点,选择对应的折点,生成新的河段才能参与计算。这个过程需要用到【点集转线】工具进行重构要分析的河段。

河流平均比降工具使用

可以将上面的python代码制作成为脚本工具,方便在ArcGIS中进行可视化的调用。工具的制作可以参考笔者另一篇博文《ArcMap自定义脚本工具制作》,里面有详细的论述。

该工具用到的ArcGIS工具涉及到ArcInfo级别 和 Spatial 扩展模块,请先确保ArcGIS软件具备相应的授权。

制作好工具之后可以双击调用该工具了,【约翰斯通-克罗斯】法需要用到无凹陷点DEM和河流线型数据。

从上面代码可以看到,工具会判断选中的河流数量,如果数量大于1,就不作计算,确保计算的是某一河段。ArcGIS的交互性非常的优秀,只要选中某一条河流,就会将选中的部分作为参数输入。

对应工具的流程,这里第一步需要选中要分析的一条河流。如下图
2017-07-11-16-38-14

接着双击调用工具,两个参数分别是河流图层和无凹陷点DEM。一定要注意,这个DEM是填洼过的DEM,不是原始DEM数据。如下图

2017-07-11-16-39-34

点击确定就可以执行计算结果,结果会在最终的提示框中找到,如下图所示:

2017-07-11-16-41-56

至此,复杂的河流平均比降就计算完毕了!

总结

水文分析是一个复杂的过程,需要有深厚的水文学基础作为背景。而GIS是一个通用工具,提供非常庞大的分析功能。二者要结合起来,不但需要学习两个专业的知识,还需要具备知识整合的能力。

代码和制作ArcGIS工具的方法已经在文中贴出来了。读者可以自行参考制作。当然想省事的话,笔者也已经上传制作好的工具,可以点击跳转到 下载页面 。为了加强交流,防止伸手,多动手操作,笔者已经将下载分值设置为最高分10分。 积分不够的读者请多动手制作 ^_^

如果读者对水文分析感兴趣的话,可以持续关注CSDN的GIS制图乐园,以及微信公众号【GIS制图乐园】。BY 李远祥

查看原文

赞 2 收藏 1 评论 0

懒羊羊 关注了用户 · 2017-07-08

Noodles @noodles001

个人简介都不给 <( ̄ ﹌  ̄)>

我就不给!(﹁''﹁)

关注 1136

懒羊羊 关注了用户 · 2017-07-08

Linxiaoruo @linxiaoruo

关注 1

懒羊羊 关注了用户 · 2017-07-08

tbygg @tbygg

关注 4

认证与成就

  • 获得 23 次点赞
  • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2017-06-13
个人主页被 669 人浏览