我有一个点特征层,包含关于水监测位置的信息。这包括一个唯一的位置ID,记录值的上限和下限,以及该位置的当前值(我想成为什么)。(表1)
表1:
Gid | Location_ID | Upper_Limit_m | Lower_Limit_m | Current_Value_m |
1 | 1千瓦 |
880 |
850 | |
2 | GW 2 |
886 | 856 | |
3. | 3兆瓦 |
884 | 854 |
我还有一个表,其中包含上面列出的位置的记录值的历史。(表2)
表2:
Location_ID | 日期 | Recorded_Value |
1千瓦 |
01/06/2021 |
867.3 |
GW 2 |
01/06/2021 | 894.1 |
3兆瓦 |
01/06/2021 | 843.9 |
1千瓦 |
05/06/2021 | 862.4 |
我能够使用Location_ID作为主键在这两个表之间创建关系,使用一对多的基数。
我试图实现的是将表2的Recorded_Value列中的最新值“联接”到表1中的Current_Value列中,用于每个唯一的监视位置(Location_ID)。此外,我需要确保Recorded_Value(来自表2)在上限和下限范围内(来自表1)。
我在想我可能能够使用定义查询(特别是使用SQL)来实现这一点。
这可能吗?如果是这样,在定义查询中使用相关表中的值的语法是什么?或者有没有其他方法可以实现这个目标?
有几种可能性,这取决于您使用的是什么。
如果你有一个企业地理数据库,显示最新的记录是非常容易的:创建一个查询层(存储在地图文档中)或一个数据库视图(存储在数据库中)使用以下SQL:
选择t1。*, t2。*从表1 t1内部连接(SELECT Location_ID,最大(日期)从表2组通过Location_ID)Location_ID = MaxDates。Location_IDINNER JOIN Table2 t2 ON MaxDates.Location_ID = t2.Location_ID AND MaxDates.MaxDate = t2.Date
这两个工具都可以在“层和表视图”工具集中的数据管理工具箱中找到。然而,确保记录在边界内将更加复杂。
如果你在ArcGIS Pro中工作,你可以使用属性规则。
https://pro.arcgis.com/en/pro-app/2.7/help/data/geodatabases/overview/an-overview-of-attribute-rules..。
//约束规则//表2 //触发:插入,更新//如果Recorded_Value不在表1中定义的上限和下限范围内,则拒绝编辑//加载表1 var tbl_1 = FeatureSetByName($datastore, "Table1", "*", false) //过滤表1通过Location_ID var loc_id = $feature. .Location_ID var loc =第一(过滤器(tbl_1“Location_ID = @loc_id”))/ /测试值在允许范围内,返回true或false var val = $特性。Recorded_Value if(val >= loc. value)Lower_Limit_m&& val <= loc.Upper_Limit_m) { return true } return false
//计算规则//表2 // field: Recorded_Value //触发器:Insert //如果在表2中添加一条新记录,Recorded_Value将被写入表1。CurrentValue_m //假设您添加的记录是最新的记录!//加载表1并获取location var loc_id = $feature的globalID。LocationID var g_id = First(Filter(FeatureSetByName($datastore, "Table1", ["Location_ID", "GlobalID"], false), "Location_ID = @loc_id")))。GlobalID //将Rcorded_Value写入Table1。Current_Value_m返回{"result": $feature。Recorded_Value, "edit": [ { "className": "Table1", "updates": [ {"globalID": g_id, "attributes": {"Current_Value_m": $feature.Recorded_Value}}, ] } ] }
如果以上方法都不适用,可以使用Python脚本,但每次插入新记录时都必须手动运行该脚本。