街机表达:如何在第三层添加多个交叉的特征?

92
4
一个月前
一个настасия0328
新贡献者III

你好,我正在寻找一种方法在街机表达属性规则添加多个功能(parkA层)与插入或更新的多边形功能(bufferA)相交到第三层(国家公园层)。

我设法准备了一个表达式,只添加一个与缓冲多边形相交的单一特征-请参阅下面的表达式。但是我还没有找到添加多个功能的方法。

我的最终目标是建立一个Attribute Rules的批量计算来实现这一点,即一次性添加、更新或删除NationalPark层中与每个buffer feature相关的所有feature。首先,我试图通过代码设置一个即时计算,但它只适用于单个功能。有没有办法通过缓冲区选择多个特征并将它们添加到第三层?

提前感谢任何想法!

//此规则设置在bufferA(多边形)//目标字段://插入和更新//从应用程序评估中排除//决定编辑模式(" Insert "或" Update ") var mode = $editcontext. var = $editcontext. var = $editcontext. vareditType // get parkA feature(多边形)var parkA = FeatureSetByName($datastore, "parkA", ["*"], false) var parkA_intersect = Intersects(parkA, Geometry($feature)) var parkA_first = First(fsparkA_firstIntersect) //如果$feature没有与任何parkA多边形相交,返回错误if (parkA_first == null) return {"errorMessage": "缓冲区必须与parkA多边形相交。"} //创建结果dict var result = {"attributes":{}} //初始化添加和更新的编辑数组var adding = [] var updates = [] if(mode == "INSERT") {var add = {"geometry":几何(parkA_first), "attributes": {"Status_A": parkA_first。statusA}} Push(adding, add)} if(mode == "UPDATE") {var UPDATE = {"geometry": geometry (parkA_first), "attributes": {"Status_A": parkA_first。statusA}} Push(updates, update)} //返回返回{"result": result, "edit": [{"className": "NationalPark", " adding ":添加,"updates":更新}]}

标签(2)
0荣誉
4回复
JohannesLindner
常规赛MVP

而不是使用parkA_intersect的First()特征,你需要循环遍历特征集:

// get parkA feature (polygon) var parkA = FeatureSetByName($datastore, "parkA", ["*"], false) var parkA_intersect = Intersects(parkA, Geometry($feature)) //如果$feature没有与任何parkA多边形相交,返回错误if (Count(parkA_intersect) == 0) return {"errorMessage": "Buffer must be intersection with parkA polygon."} / /创建结果dict var ={"属性 ": { } } // 初始化编辑数组添加和更新var = = [] [] var更新补充说如果(模式= =“插入”)的{parkA_intersect p (var) {var添加={“几何”:几何(p),“属性”:{“Status_A”:p.statusA}}推(补充说,添加)}}如果(模式= =“更新”)的{parkA_intersect p (var) {var更新={“objectID”:p.OBJECTID,“几何”:几何(p),“属性”:{“Status_A”:p.statusA}}推(更新,更新)}}

关于更新对象的注意事项:您需要指定要更新的特性。您可以通过提供objectID或globalID来实现这一点,请参见上面代码中的第34行。

属性规则字典关键字- arcgis Pro |文档


祝你有愉快的一天!
约翰内斯
0荣誉
MikeMillerGIS
通过 Esri经常贡献者
Esri经常贡献者

修改了一些代码

-需要在FeatureSetByName中返回几何图形,但如果你没有改变相交多边形的几何图形,你不需要返回几何图形

-如果你要循环一个FS,不要调用count。count调用导致对所有字段的层进行查询,这可能代价很高。只需使用循环来确定是否有任何特性

-我不确定你在插入和更新上要做什么。对相交特征没有影响。听起来好像您正在尝试从它上面的点更新多边形的属性。

列出你想要的多边形层的字段,没有理由返回所有的字段

-如果你没有编辑$特性,你不需要返回结果

-我对结果有点困惑,所以也许下面的代码更改可以帮助你

// get parkA feature (polygon) var parkA = FeatureSetByName($datastore, "parkA", ["OBJECTID"], true) var parkA_intersect = Intersects(parkA, Geometry($feature)) var updated_rows = [] var copied_rows = [] for(var p in parkA_intersect) {var updated_row = {"OBJECTID":p。OBJECTID, "attributes": {"Status_A": $feature。statusA}}} Push(updated_rows, updated_row) var copied_row = {" geometry": geometry (p), "attributes": {" Status_A": p.s atusa}}} Push(copied_rows, copied_row)} if (Count(updated_rows) == 0){return {"errorMessage": "缓冲区必须与parkA多边形相交。"}} //返回返回{"edit": [{"className": "NationalPark", "updates": updated_rows}, {"className": "CopiedClass", "add": copied_rows}]}

0荣誉
一个настасия0328
新贡献者III

你好Mike,谢谢你的回复!

我尝试了建议的代码,但不幸的是,它遇到了一个错误,说移动失败,旋转相关特性失败[bufferA]无法定位请求的行对象。

我想做的更新是,一旦缓冲区移动,那么在NationalPark layer中删除ParkA原来的相交特征,然后根据缓冲区的新位置将新的ParkA相交特征添加到NationalPark layer中-请看下图。
我想通过批量计算属性规则来设置更新功能作为最终目标-这可能吗?
例如,插入一个缓冲区,在移动缓冲区之前,
a0328_0 - 1671149444935. - jpeg
一旦缓冲区被移动,它应该是这样的
a0328_1 - 1671149444954. - jpeg

0荣誉
一个настасия0328
新贡献者III

Johannes,谢谢你的回复!

插入模式适用于循环,但不幸的是,对于更新模式,它不起作用。出现错误,说“移动失败,旋转相关特性失败[bufferA]请求的行对象无法定位。”

我想做的更新是,一旦缓冲区移动,那么在NationalPark layer中删除ParkA原来的相交特征,然后根据缓冲区的新位置将新的ParkA相交特征添加到NationalPark layer中-请看下图。
我想通过批量计算属性规则来设置更新功能作为最终目标-这可能吗?

例如,插入一个缓冲区,在移动缓冲区之前,
Screenshot1.jpg
一旦缓冲区被移动,它应该是这样的
Screenshot3.jpg

0荣誉