之前我做过一个利用mapserver提供的查询接口,获取json格式的要素,然后将json下载再转换成shp,来进行各种处理的gp服务。今天我偶然发现arcgis官方也可能提供了这种模式。之所以说是可能是因为,我只是根据官方的一段介绍得到了这样的推断。
起因是下午快下班的时候,我偶然看到了这篇博客。
https://my.oschina.net/u/4369360/blog/3388395
我突然发现这就是我梦寐以求的以图层服务作为gp服务的例子。截图来自博客
随后我注意到作者使用了这个参数类型 GPFeatureRecordSetLayer
截图来自博客
GPFeatureRecordSetLayer
这个类型,我竟然完全不熟悉,我可是研究了那么久的gp服务。好吧,我摊牌了。我一直也没仔细看过gp服务的参数类型。我潜意识里一直把他们都当作字符串。
这里可以说一下GP工具和GP服务,给我们的感觉可能都是相似的,只是一个运行在本地一个运行在服务器上。但是其参数类型并不是一致的,而是对应的关系。如下图中的后两列。图中REST类型就是GP服务中的参数类型。不过这幅图还少了一列就是arcgis js 对应的类型,需要的朋友可以找一下。
在arcgis 10.*后的版本,要想发布GP服务,用户必须先在本机成功运行一次。而这个运行成功的gp工具中的参数类型也随之确定。实际上我认为GP服务最需要考虑的一个因素就是输入。如下图,由于GP服务由前端调用,因此只能接受很少的参数类型,远少于我们平时在ArcMap中操作的类型。而一旦GP服务在服务器上运行,由于服务器包含完整的ArcGIS环境,因此任何ArcGIS支持的参数类型都可以使用。同时由于输出给前端,因此输出类型一样受限。
这里首先要说的就是我们平常用得最多的shp格式。如果你在GP工具使用这个格式,那么当GP工具发布后,对应的GP服务中参数就是常量(constant)。也就是这个GP服务等于没用,还不如发布一个结果在到服务器上。
这里要指出的是constant不是数据类型,而是GP服务的输入模式 。GP服务有三种输入模式,如下图所示。根据GP工具的参数类型,这个输入模式有所不同。
铺垫了一些知识后,我再说说题目。GPFeatureRecordSetLayer对应的GP工具类型是FeatureSet。这个类型,我之前是知道的,但是我只知道如果想让自己的GP工具(服务)具有交互性。如用户可以选择地图上一个位置,计算集水区。那这个位置,就需要设置成FeatureSet。没错,这个例子也是来自于ArcGIS官方的GP服务例子 watershed。同时这个参数类型也可以接受shp,layer这样的常用参数,还是蛮好用的。
但是我在使用FeatureSet的时候,在输入模式时使用了默认的ChoiceList,如图。从来没选过 User defined value。选了ChoiceList后,情况比constant好一点。可以在参数列表选择值,但是不能选择超过这个范围的值。如果选择了这种输入模式,那么FeatureSet对应的GP服务参数类型是GPString。
我之前一直以为只有我在前台构建一个交互式要素的时候,才需要将FearueSet的输入模式设置为User defiend value。也就是像下图官方介绍的。我们可以看到,图中的例子是一个包含2个Point的json。这很符合我们在图上点了一个点后,对于这个点的描述。
https://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/sharing-workflows/task-parameter-properties.htm
关键来了,紧随其后,官方做了这样一段补充。
对于 GPRecordSet 和 GPFeatureRecordSetLayer 参数,如果有大量记录和要素,则可以将 JSON 结构存储在文件中,然后提供 URL 作为输入。例如,{ "url" :"http://myserver/myfeatures/afile.txt"}。文本文件必须包含 JSON 格式的要素集或记录集。
也就是说我们可以把大量的JSON格式的要素存储在.json或.txt中,传入这个文件的url作为GPFeatureRecordSetLayer 类型参数的值。
还能有这样的操作,我是完全没有想过的。所以这里有个问题就是,我之前都只是从GP工具的参数类型出发,从发布的角度来思考问题;但是没有从调用的时候来思考问题。
那么我梦寐以求的将图层服务的URL作为参数怎么做呢。问题就变成了图层服务如何提供一个JSON?当然这个问题我之前已经做过了,就是对图层服务进行查询。因此就有了这篇文章里说得,将在mapserver的查询url直接传入参数。
https://blog.csdn.net/peckerzeng/article/details/83029032
下面我来大概说一下如何利用GPFeatureRecordSetLayer将发布的地图服务作为参数:
首先我们的GP工具参数类型要选择FeatureSet,将GP工部发布成GP服务时,输入模式选择User defiend value。
其次我们对发布的mapserver进行查询,获取json。如http://*********/arcgis/rest/services/gptest/byblk/MapServer/0/query?where=OBJECTID%3C%3E-1&f=json
是一个查询url,表示查出这个地图服务的子图层0的所有要素,且返回格式为JSON。这里条件依旧是OBJECTID!=-1,这样可以查询出所有的要素。(我一直没找到获取mapserver所有参数的方法。这里如果条件置空,则是什么都不返回。所有要是有朋友查询方法可以留言)
提示:构建形如{ "url" :"http://myserver/myfeatures/afile.txt"}
的参数。这里中括号是不能少的,因为GPFeatureRecordSetLayer
一直都是接受JSON类型的参数。
剩下的就是输入了
至此使用讲解结束。我们稍微探究一下,它的工作原理。回到我们开篇讲的,由于输入参数是json,ArcGIS本身是不能对json进行处理的,都要进行转化工作。那这个转化工作在哪里进行呢?
补充一点知识,如果arcgisserver 执行了GP服务,会在服务器上生成GP服务的jobid对应的文件夹。一般目录如下图。
但是非常沮丧,我打开服务器上对应的job目录,并没有找到下载的json文件。那这个json文件去哪了呢,我在server下的cache目录里也没看到。我打开scratch.gdb之后,也是只有结果文件。也没有转化后的输入文件。非常神奇。
当然现在很晚了,我没办法测试这种模式下服务的性能。现在只是用了一个很简单的数据,做了一个很简单的处理。要是和我之前做的那个一样慢,我可真是太高兴了。
补充:我写完整篇博文后,感觉文章有点头重脚轻,结尾也是戛然而止。但是能力有限,到此为止。哈哈
来源:oschina
链接:https://my.oschina.net/u/4338498/blog/4678882