简单入门:使用相关记录的符号学

6174
10
2020年3月25日上午10:31
JosephRhodes2
通过
偶然的因素
7 10 6174年

长期以来,我一直需要使用相关表中的值来可视化、查询和过滤功能,并提出了以下解决方案,它非常适合我的用例。

用例涉及管理雨水集水盆的检查和清洁(我简化了这篇文章的工作流程)。客户希望现场工作人员能够打开Collector,快速查看需要注意或超过一年未检查/清洁的盆地,并在仪表板上提供相同的信息。

这很容易设置:

  1. 向特性层添加字段,以保存要从相关表中引入的属性
  2. 从相关表中获取最新的记录,并使用Python的ArcGIS API将该记录中的值写入功能层
  3. 打开脚本PythonAnywhere设置为每60秒运行一次
  4. 配置web地图符号与一个简单的街机表达式,以显示过期和失败的检查

以上每一步的详情:

  1. 自解释的。我将字段命名为“Status”和“LastCleaning”。
  2. 写脚本的末尾显示这篇文章抓住从相关表记录从过去一天,由时间和删除重复的记录排序相关资产(以防有两个检查/清洗记录在过去24小时内——例如,一个失败的检验周三下午解决周四早上),然后使用一个惟一的标识符(“FacilityID”)来更新资产的数据最近的检查/清洗。大声喊出迈克尔·邓肯有关日期查询的帮助。
    arcgis进口地理信息系统arcgis特性进口FeatureLayer进口熊猫作为pdarcgis特性进口SpatialDataFramedatetime进口datetimetimedelta进口时间地理信息系统=地理信息系统f“https://someorg.maps.arcgis.com”“someuser”“somepass”defupdate_basins一天=datetime今天-timedelta=1string_day=一天strftime' % Y - % - % d % H: % m: % S的where_query=f"日期检查过的>=日期'{string_day}'"catch_basins=地理信息系统内容得到“21343 f6579b74cf212576e5614db8866”catch_basins_lyr=catch_basins0catch_basins_sdf=SpatialDataFramefrom_layercatch_basins_lyrcatch_basins_fset=catch_basins_lyr查询catch_basins_features=catch_basins_fset功能cleanings_url=“https://services9.arcgis.com/iERASXD4kaw1L6en/arcgis/rest/services/this_is_an_example/FeatureServer/1”cleanings_lyr=FeatureLayercleanings_urlcleanings_sdf=SpatialDataFramefrom_layercleanings_lyrcleanings_fset=cleanings_lyr查询在哪里=where_queryout_fields=“检查日期,设施id,状态”cleanings_features=cleanings_fsetdf特性=cleanings_sdfsort_values“DateInspected”提升=df=dfdrop_duplicates子集=“FacilityID”overlap_rows=pd合并=catch_basins_sdf正确的=df如何=“内心”=“FacilityID”catch_basin_features=catch_basins_fset功能cleaning_updates=cleanings_fset功能cleaning_updates反向def更新盆地做一FacilityIDoverlap_rows“FacilityID”试一试basin_feature=ffcatch_basin_features如果f属性“FacilityID”==FacilityID0cleaning_feature=ffcleanings_features如果f属性“FacilityID”==FacilityID0basin_feature属性“LastCleaning”=cleaning_feature属性“DateInspected”basin_feature属性“状态”=cleaning_feature属性“状态”catch_basins_lyredit_features更新=basin_feature打印f”{basin_feature更新。属性[“FacilityID”]}status to {basin_feature.attributes['Status']}"冲洗=真正的除了继续更新catch_basins_featurescleaning_updates真正的update_basins时间睡眠60

  3. 设置一个“永远在线”的任务PythonAnywhere以持续运行脚本。这是一个非常简单的过程。只需设置一个PythonAnywhere帐户(免费层可能适合此应用程序),上传脚本文件,并将脚本添加到Tasks选项卡上作为Always-On Task。现在,脚本每隔60秒将最近的检查/清洁记录写入catch basin属性表:
  4. 最后,用一个简单的街机表达来表示每个盆的状态(当前、过期或需要注意):
    var现在=现在varlast_cleaning=美元的特性LastCleaningvarcleaning_age=DateDiff现在last_cleaning“年”如果cleaning_age<1& &美元的特性状态==“CleaningComplete”返回“当前”}其他的如果美元的特性状态==“NeedsAttention”返回“需要关注”}其他的如果cleaning_age>1返回“过期”}其他的如果IsEmpty美元的特性状态返回“记录缺失或不完整”}

我希望这对某人有帮助。请随时提供建议或提出问题。大家坚持住!

10评论
DrewMoffitt
通过
新贡献者II

很棒的文章,谢谢!

JeanneBaker1
通过
新的因素

如果你使用的是Portal而不是ArcGIS Online,你可以使用ArcGIS Notebooks而不是PythonAnywhere吗?

JosephRhodes2
通过
偶然的因素

嗨,珍妮,

至少,您必须删除日期查询,因为它使用datetime模块,而该模块不是默认的ArcGIS笔记本库。我认为你不能在笔记本环境中安装额外的Python模块。然而,您可能可以不使用日期查询—它只是用来筛选检查列表,这样脚本就不必梳理每一次检查,只需梳理过去一天的检查。

除此之外,我建议你在一些非生产服务上尝试一下。我很想听听结果如何!

BertKraan
通过
新贡献者II

到目前为止,我花了两天时间在这上面,这是一个教育(谢谢:)),但我不能让它工作。改变的属性应该写回功能层在第42行,对吗?没有发生,也没有执行第43行…

我修改了overlap_rows合并两个单独的字段在fc和表(…左_on='GlobalID_x', right_on='foreignkey' )since I have a unrelated GlobalID in my table ...

看看我的调试器:第40行和第41行被执行,我可以看到属性中的新值,但是然后……我不晓得。

知道去哪里找吗?

谢谢你的时间,伯特

JosephRhodes2
通过
偶然的因素

嗨,伯特,

您所说的“我可以看到属性中的新值”是什么意思?这将是剧本的目的,所以我一定是误解了你的描述。

BertKraan
通过
新贡献者II

嗨乔,

我想说我可以在调试器的变量窗口中看到新值,但不能在功能类的实际记录中看到。

我以数据所有者的身份登录,并且功能类已启用编辑。

(老实说,我跟着在ArcGIS Online中使用Join特征可视化相关数据作为一种变通,所以我的产品目前是在线的,没有截止日期受到影响),但如果能了解发生了什么,那就太好了。

JosephRhodes2
通过
偶然的因素

嘿,伯特,

对不起,我没有完全解析你原来的问题。将此方法与globalid同时用作主键和外键将不起作用,因为在相关表中没有任何可匹配的内容。相关表中记录的Global id对于这些记录来说是唯一的,脚本查找相同的属性值。

但是,您可以使用GlobalID作为主键,GUID作为外键来构建关系。ArcGIS将自动用GlobalID填充目标GUID字段,它将为您提供可以作为字符串匹配的键。

我很高兴你有解决办法。在有数千条记录的情况下,这可能会有问题,因为连接每个特征使用一个信用。但是听起来信用使用对于您的特定应用程序是可以接受的,所以做得好!

BertKraan
通过
新贡献者II

一周后,我又试了一次我的剧本版本。我用笔记本一步一步地看到和理解一行一行发生了什么:

在我有了一些理解之后,我有了一个成功的df。合并I switched back to vscode and used the structure of your script to complete my own ... now it works and my co-workers can see the updated symbology. The workaround I described earliere isn't as good as this because you cannot take a view offline in collector, let alone the credits.

再次感谢你的博客和你的回复!

伯特

通过 匿名用户
不适用

我很害怕。在Web Map中没有其他的方法与相关的记录进行符号化吗?到目前为止,我已经对这个话题做了相当多的研究,如果不是的话,我也会相信,但它仍然令人失望的是,必须运行一个外部脚本,在AGOL中自动为弹出框工作。

感谢您撰写本教程!我将不得不为我的项目寻找另一种方式,因为我不愿意为项目提供脚本支持,但我可能有一天不得不为其他事情尝试这种方式,而且看起来它确实可以完成工作。

LindsaySpencer
新贡献者III

伟大的阅读-我在同一条船上@anonymous55用户和我可以说,我不想通过脚本来支持这一点。此外,这个过程似乎只处理最近的相关记录。我的需求是总结单个特性的相关记录集,并使用该特性集确定符号学。请为这个想法投票如果你觉得有用的话!

标签