版本:ArcGIS Server 10.4 环境:win10
测试目标:创建一个GP服务,功能为根据要素属性信息(如FID)选择出输入内容的对应匹配要素。
注:这个测试非常基础,仅供新手发布GP服务练习。
如图所示,数据源为两个图层,分别是中国行政区全图(蓝色)与中部几个省份行政区(浅绿色)。
其中中部几个省份所在的ChinaCopy图层中,各要素信息如下。
新建Toolbox.tbx,在其中新建Model。
模型如下图所示,输入有:待选择图层 和 sql语句(如”FID” = 181)
模型构建过程
(根据上图将四个部分分别标记为①②③④,以下用数字标记来简称这四个部分)
首先将select 工具拖进 Model 编辑窗口:
接着在①上右键,添加变量,有两个选择,从Parameter或Environment,从下图可知Parameter即select工具需要输入的内容。选中Input Features。
同理将Expresssion也选择。
此时各部分内容都是白色,表明模型还不能顺利运行。需要设置默认参数。分别双击②、③、④,将默认参数输入。
此时模型各部分变为彩色。点击上方图标运行模型。若成功表示模型没问题。
此时还需一步设置,如下图:右键③并设置为Model Parameter使其作为模型输入参数,否则之后运行模型时会使用刚才设置的默认参数,输入参数无法修改。同理设置②、④。
最终结果:
关闭模型编辑窗口(选择保存)。
双击模型运行。
运行成功后,在Results窗口找到刚运行的结果,右键发布GP服务。
注:如果没有Results窗口,可以在ArcMap最上方,Geoprocessing→Results打开。如下图所示。
发布服务时需要注意几点:
①选中 以地图服务查看结果,这样之后在rest路径下测试运行GP服务时,可以以地图服务的形式查看运行结果。设置如下图所示:
②模型相关的参数:输入要素、输入查询条件、输出要素,都需要进行描述,否则分析时会报错。
另外如上图所示,此时模型输入要素是ArcMap中加载的三个图层,发布的GP工具也只能以它们作为输入。(应该)也可以使用用户自己输入,不过还没测试(2016年11月28日,已测试,见文末)。
之后点分析、发布。发布成功后在server manager中查看GP服务。
如上图所示,会有两个同名服务,一个GP服务,一个地图服务(GP服务默认运行结果)。
Rest路径下,可以看到tasks和相关信息。
点击上图tasks下的Model。可以看到(如下图所示)输入参数的可选项,表达式的默认值等信息。
这里复制Choice List中的“ChinaCopy”方便下一步测试时填写“输入要素”。
点击上图中的Submit Job(位置在页面最下方)。这里我们选择ChinaCopy作为输入,利用GP工具选择出其中FID为3861的要素。点击 Submit Job
Job Status 为运行结果。
Check Job Details Again 查看具体信息。等到出现如下结果,即运行成功,点击Results下的结果图层查看。
如下图所示,陕西区域已被查询出来。
关于输入要素设置为用户自定义的方式(以下测试略基础,对于未能实现的功能不代表sever不支持,很可能是笔者还不知道该部分内容,以下仅供参考)。
若不选择设置为用户自定义,则GP工具的通用性大大降低。设置用户自定义后,主要问题在于,怎样输入用户自定义的要素?
如下图(上文使用的GP服务删掉了,这里界面和上文略有差异)所示GP服务(名称为 Model),输入部分为json格式的字符串。
名为Model的GP服务所使用数据源如下图所示:
因为这里的目的是测试用户自定义的数据源是否可以使用该GP服务,即该GP服务中包含的数据源不可以再使用。
为了获取该GP服务中所需输入的这种格式的字符串,这里使用不同数据源(仅文档名称、要素形状与上面GP服务所使用数据源不同,属性表、空间参考等都相同)、相同模型,另外发布第二个GP服务,这样就有了与上图相同格式(而数据源不包含在上图GP服务中)的新GP服务。新GP服务数据源如下图所示。
打开新的GP服务(新服务名称为 Model2)到如下位置:拷贝输入要素后面的字符串。
将字符串粘贴到名为Model的第一个GP服务对应位置,执行GP服务。(即 GP服务 + 输入要素为未包含在该GP服务数据源的要素(用户自定义要素) )
运行结果如下所示,显然该要素并非Model GP服务所包含的数据源,即可以使用用户自定义要素作为GP服务的输入(不过格式写起来比较麻烦)。
那么会不会是因为输入要素为在线的服务才可以使用呢~
为了验证,将新发布的Model2 GP服务删除,再执行一次上述查询,结果相同,即是否在线的服务并不影响。
那么自己写一个格式相符的可以吗?
这里我们修改一下复制粘贴的输入要素字符串(具体修改见下图后)。之后执行查询,可以顺利执行。
虽然只修改了一个坐标点位置,不过足以证明自己写一个格式相符的字符串,可以作为GP服务的输入要素。
输入要素的描述字符串 原内容如下: 上图测试修改了其中 45.669056117345974 将5修改为2 变为 42.669056117345974
{
"displayFieldName": "",
"geometryType": "esriGeometryPolygon",
"spatialReference": {"wkt": "GEOGCS["GCS_User_Defined",DATUM["D_User_Defined",SPHEROID["User_Defined_Spheroid",6378140.0,298.2569978029123]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]"},
"fields": [
{
"name": "FID",
"type": "esriFieldTypeOID",
"alias": "FID"
},
{
"name": "test",
"type": "esriFieldTypeInteger",
"alias": "test"
},
{
"name": "Shape_Length",
"type": "esriFieldTypeDouble",
"alias": "Shape_Length"
},
{
"name": "Shape_Area",
"type": "esriFieldTypeDouble",
"alias": "Shape_Area"
}
],
"features": [
{
"attributes": {
"FID": 2,
"test": 0,
"Shape_Length": 15.104826430687684,
"Shape_Area": 13.532019237916634
},
"geometry": {"rings": [[
[
92.37279530645827,
44.18050407480325
],
[
95.79808090900679,
42.857533865595485
],
[
95.89439759507303,
41.13479398735268
],
[
92.37279530645827,
41.13479398735268
],
[
92.37279530645827,
44.18050407480325
]
]]}
},
{
"attributes": {
"FID": 1,
"test": 0,
"Shape_Length": 12.598930062798257,
"Shape_Area": 5.718694943441873
},
"geometry": {"rings": [[
[
99.2482993672221,
45.669056117345974
],
[
101.62889861977555,
43.97824988942091
],
[
101.62889861977555,
41.503610443367336
],
[
96.86997660813404,
41.503610443367336
],
[
99.2482993672221,
42.669056117345974
]
]]}
},
{
"attributes": {
"FID": 0,
"test": 0,
"Shape_Length": 14.035782149398706,
"Shape_Area": 12.17378909335935
},
"geometry": {"rings": [[
[
96.84618199740135,
47.39277643288614
],
[
99.89189208485192,
47.39277643288614
],
[
100.69977058054792,
44.21570577180398
],
[
96.84618199740135,
43.58563882357288
],
[
96.84618199740135,
47.39277643288614
]
]]}
}
],
"exceededTransferLimit": false
}
可以看出,字符串是对数据源中三个多边形的描述, 每个多边形有四个点,描述中从左上角点开始顺时针,最后返回左上角点,共五个坐标。
在ArcMap中对比查看修改前后:
GP服务 输入自定义要素如此麻烦,共享GP服务,不如直接拷贝模型?
首先,笔者对GP服务仅刚做了基础测试,很可能有更方便的使用方法还不知道,有待学习一个。
另外,这里需要提及GP服务在ArcMap中的使用。
如下图所示,在ArcMap中连接Server,找到GP服务,可以直接运行模型。这也就意味着如下场景:甲制作模型M,发布为GP服务,任意机器上安装的ArcMap连接上该服务,就可以使用模型M。