简单操作:使用相关记录的符号学

6174
10
03-25-2020上午10:31
JosephRhodes2
通过
偶然的因素
7 10 6174年

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

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

设置起来非常简单:

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

以上每个步骤的详细信息:

  1. 自解释的。我将字段命名为“Status”和“LastCleaning”。
  2. 写脚本的末尾显示这篇文章抓住从相关表记录从过去一天,由时间和删除重复的记录排序相关资产(以防有两个检查/清洗记录在过去24小时内——例如,一个失败的检验周三下午解决周四早上),然后使用一个惟一的标识符(“FacilityID”)来更新资产的数据最近的检查/清洗。大声喊出迈克尔·邓肯有关日期查询的帮助。
    arcgis进口地理信息系统arcgis特性进口FeatureLayer进口熊猫作为pdarcgis特性进口SpatialDataFramedatetime进口datetimetimedelta进口时间地理信息系统地理信息系统f“https://someorg.maps.arcgis.com”“someuser”“somepass”defupdate_basins一天datetime今天-timedelta1string_day一天strftime' % Y - % - % d % H: % m: % S的where_queryf" datechecked >= DATE '{string_day}'"catch_basins地理信息系统内容得到“21343 f6579b74cf212576e5614db8866”catch_basins_lyrcatch_basins0catch_basins_sdfSpatialDataFramefrom_layercatch_basins_lyrcatch_basins_fsetcatch_basins_lyr查询catch_basins_featurescatch_basins_fset功能cleanings_url“https://services9.arcgis.com/iERASXD4kaw1L6en/arcgis/rest/services/this_is_an_example/FeatureServer/1”cleanings_lyrFeatureLayercleanings_urlcleanings_sdfSpatialDataFramefrom_layercleanings_lyrcleanings_fsetcleanings_lyr查询在哪里where_queryout_fields“检查日期,设备id,状态”cleanings_featurescleanings_fsetdf特性cleanings_sdfsort_values“DateInspected”提升dfdfdrop_duplicates子集“FacilityID”overlap_rowspd合并catch_basins_sdf正确的df如何“内心”“FacilityID”catch_basin_featurescatch_basins_fset功能cleaning_updatescleanings_fset功能cleaning_updates反向def更新盆地做一FacilityIDoverlap_rows“FacilityID”试一试basin_featureffcatch_basin_features如果f属性“FacilityID”= =FacilityID0cleaning_featureffcleanings_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选项卡上。现在,脚本每隔60秒将最近的检查/清洁记录写入catch basin属性表:
  4. 最后,用一个简单的街机表达来表示每个盆的状态(当前、过期或需要注意):
    var现在现在varlast_cleaning美元的特性LastCleaningvarcleaning_ageDateDiff现在last_cleaning“年”如果cleaning_age<1& &美元的特性状态= =“CleaningComplete”返回“当前”其他的如果美元的特性状态= =“NeedsAttention”返回“需要关注”其他的如果cleaning_age>1返回“过期”其他的如果IsEmpty美元的特性状态返回“记录缺失或不完整”

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

10评论
DrewMoffitt
通过
新贡献者II

很棒的文章,谢谢!

JeanneBaker1
通过
新的因素

如果你使用Portal而不是ArcGIS Online,你能使用ArcGIS notebook而不是PythonAnywhere吗?

JosephRhodes2
通过
偶然的因素

嗨,珍妮,

至少,您必须删除日期查询,因为它使用了datetime模块,而该模块不是默认的ArcGIS笔记本库.我不认为您可以在notebook环境中安装额外的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用户和我可以说,我不想通过脚本来支持这个。此外,这个过程似乎只处理最近的相关记录。我的需要是总结单个特征的相关记录集,并使用该特征集来确定符号学。请为这个想法投票如果你觉得有用的话!

标签