添加新行时自动更新字段?

1520
6
跳到解决方案
06-17-2021 02:59 PM
MikeMacRae
通过
定期撰稿人

嘿,大家好,我只是想知道是否有一种方法可以在添加新行时自动更新托管功能层中的字段。

例如,假设我在我的托管特性层中有一个表,它包含5个字段。为了简单起见,我们假设其中一个字段是字符串字段,并通过连接其他两个字段来填充。目前,每次添加新行时,我都必须手动运行字段计算器来更新该字段。我希望有一种方法来存储字段计算器公式在字段和每次新行添加,它只是自动更新该字段或可能是自动更新字段的任何其他方法。这可行吗?

谢谢

标签(5)
0荣誉
1解决方案

接受的解决方案
jcarlson
通过 MVP荣誉贡献者
MVP荣誉贡献者

作为@DavidPike建议,你可以让它作为一个表达式出现在弹出窗口或表在“经典”地图。有什么原因需要将派生值作为它自己的列吗?

无论如何,如果您熟悉一些Python,有一种方法可以自动更新它。

简单版:频繁间隔

所以,你可以在AGOL笔记本上写一个这样的脚本:

从arcgis导入GIS #连接到门户,获取你的层GIS = GIS('your-org-url', 'user', 'password') lyr = GIS .content.get(' hosts -layer- itemid ') #计算字段lyr.layers[0]。计算(calc_expression = {'field': 'CONCAT -fieldname', 'value': 'CONCAT(第一个字段,第二个字段)'})

然后使用任务TAB在笔记本上安排它运行经常到能及时更新。计划运行确实会花费您的积分,但这样一个简短的脚本可能花费很少,即使频繁运行也可以。

花哨版本:注入参数和Webhooks

这可能会变得相当复杂(可能比它的价值更麻烦),但只有当创建一个新功能时才会触发。要让这个工作确实需要你的图层以某种方式设置,所以这个选项可能是不可达到的。但值得一提的是。

首先,像上面那样准备一个笔记本,但要包括一个在哪里子句中的字段计算。设置变量在哪里到'1=1'之前的笔记本,然后使用注入参数让它被覆盖。

创建一个定期运行的任务,但暂时将其禁用。

Where = '1=1' lyr.layers[0]。计算(where = where…)

接下来,创建一个webhook在托管的特性服务上。将它定义为在您认为有必要时触发,可能是在添加或更新功能时。

现在,这是棘手的部分。你不能真正控制你的webhook的内容有效载荷所以你需要某种中介。很多Esri的例子使用integrmat,也许你有Microsoft Flows / Power automation。你也可以创建一个完全自定义的程序来做这件事,如果你知道你在做什么。

无论您怎么做,都要让中介捕获有效负载并获得所创建特性的objectID。然后可以将POST请求提交给https://kendall.maps.arcgis.com/sharing/rest/community/users/<用户名> /任务/ < your-task-ID > /更新安排你笔记本的运行。

POST请求的有效负载看起来像这样:

{“标题”:“单一运行”,“itemId”:“你的笔记本itemId”,“startDate可以”:“UNIX时间戳的当前时间”、“类型”:“ExecuteNotebook”,“参数”“{\“updatePortalItem \”:真的,\“saveInjectedParameters \”:假的,notebookParameters \” \':\'{\\\' 在\ \ \”:\ \ \ ' objectid = THEOBJECTID \\\'}\'}", " 分钟”:“*”、“小时”:“*”、“dayOfMonth”:“*”、“月”:“*”、“dayOfWeek”:“?”、“maxOccurrences”:“1”“f”:“json”}

您可能还需要计算出令牌部分。

值得注意的是:如果对您来说更容易的话,您还可以使用Python处理计划好的笔记本任务。

无论如何,这应该使您的任务重新设置为在当前时间运行,只需一次。通过从webhook导入创建/更新的目标,任务的“where”参数将过滤你的计算,只添加或更新那些功能。

我已经说得够久了。说到用大炮拍蚊子!简单的选择可能就是你想要的。

——乔什·卡尔森
肯德尔县GIS

在原帖子中查看解决方案

6个回答
DavidPike
通过 常规赛MVP
常规赛MVP

它是在网络地图上吗?您可以只添加一个Arcade属性表达式。

0荣誉
BrittanyBurson
定期撰稿人

@DavidPike——从我们用例的角度来看,Arcade属性表达式很棒,但是我们的用户总是需要能够将数据导出为.csv或类似的格式。由于map属性表达式只在运行中计算,并且只存在于Web map /App中,因此在数据中适当地使用它们是理想的。下面推荐的计划更新让我们更接近,但是在最终用户编辑数据的同时更新/填充属性将是最好的情况。

jcarlson
通过 MVP荣誉贡献者
MVP荣誉贡献者

作为@DavidPike建议,你可以让它作为一个表达式出现在弹出窗口或表在“经典”地图。有什么原因需要将派生值作为它自己的列吗?

无论如何,如果您熟悉一些Python,有一种方法可以自动更新它。

简单版:频繁间隔

所以,你可以在AGOL笔记本上写一个这样的脚本:

从arcgis导入GIS #连接到门户,获取你的层GIS = GIS('your-org-url', 'user', 'password') lyr = GIS .content.get(' hosts -layer- itemid ') #计算字段lyr.layers[0]。计算(calc_expression = {'field': 'CONCAT -fieldname', 'value': 'CONCAT(第一个字段,第二个字段)'})

然后使用任务TAB在笔记本上安排它运行经常到能及时更新。计划运行确实会花费您的积分,但这样一个简短的脚本可能花费很少,即使频繁运行也可以。

花哨版本:注入参数和Webhooks

这可能会变得相当复杂(可能比它的价值更麻烦),但只有当创建一个新功能时才会触发。要让这个工作确实需要你的图层以某种方式设置,所以这个选项可能是不可达到的。但值得一提的是。

首先,像上面那样准备一个笔记本,但要包括一个在哪里子句中的字段计算。设置变量在哪里到'1=1'之前的笔记本,然后使用注入参数让它被覆盖。

创建一个定期运行的任务,但暂时将其禁用。

Where = '1=1' lyr.layers[0]。计算(where = where…)

接下来,创建一个webhook在托管的特性服务上。将它定义为在您认为有必要时触发,可能是在添加或更新功能时。

现在,这是棘手的部分。你不能真正控制你的webhook的内容有效载荷所以你需要某种中介。很多Esri的例子使用integrmat,也许你有Microsoft Flows / Power automation。你也可以创建一个完全自定义的程序来做这件事,如果你知道你在做什么。

无论您怎么做,都要让中介捕获有效负载并获得所创建特性的objectID。然后可以将POST请求提交给https://kendall.maps.arcgis.com/sharing/rest/community/users/<用户名> /任务/ < your-task-ID > /更新安排你笔记本的运行。

POST请求的有效负载看起来像这样:

{“标题”:“单一运行”,“itemId”:“你的笔记本itemId”,“startDate可以”:“UNIX时间戳的当前时间”、“类型”:“ExecuteNotebook”,“参数”“{\“updatePortalItem \”:真的,\“saveInjectedParameters \”:假的,notebookParameters \” \':\'{\\\' 在\ \ \”:\ \ \ ' objectid = THEOBJECTID \\\'}\'}", " 分钟”:“*”、“小时”:“*”、“dayOfMonth”:“*”、“月”:“*”、“dayOfWeek”:“?”、“maxOccurrences”:“1”“f”:“json”}

您可能还需要计算出令牌部分。

值得注意的是:如果对您来说更容易的话,您还可以使用Python处理计划好的笔记本任务。

无论如何,这应该使您的任务重新设置为在当前时间运行,只需一次。通过从webhook导入创建/更新的目标,任务的“where”参数将过滤你的计算,只添加或更新那些功能。

我已经说得够久了。说到用大炮拍蚊子!简单的选择可能就是你想要的。

——乔什·卡尔森
肯德尔县GIS
DavidPike
通过 常规赛MVP
常规赛MVP

书签: slightly_smiling_face:

0荣誉
BrittanyBurson
定期撰稿人

相同!谢谢你!@jcarlson

0荣誉
MikeMacRae
通过
定期撰稿人

谢谢@jcarlson为您的努力做出回应!感谢。我们正在探索一个计划脚本的想法,但我希望有一个更自动的方式。我们使用属性规定在Pro中构建时,在表上,但是当你将地理数据库作为托管特性层发布时,它们不会携带。多亏了@BrittanyBurson谢谢你回答了我的另一个问题在这里.这可能是ArcGIS Online的一个功能,这将是一个很棒的功能!