计算仪表板元素中两个重叠web图层面积的数据表达式

220
8
跳到解决方案
12-06-2022 08:21 PM
JasmineSpring
通过
新贡献者II

你好

我试图在我的仪表板上添加一个指示器,显示两个多边形weblayer相交的公顷数。即处理区甘蔗的公顷数。我是街机的新手,所以有点不确定什么是最好的方法。最后的特征集我想有TA的名字,TA公顷,(来自TA网络层)和甘蔗的公顷(交集计算)。

//从门户访问数据层


var port = Portal('http://www.argis.com”)
var TA = FeatureSetByPortalItem(Port, 'itemid', 0)
var sugar = FeatureSetByPortalItem(端口,'itemid', 0)

//创建空字典
var sugarDict = {
字段:[
{name: " TA name ", type:esriFieldString "},
{name: " TA Ha ", type:esriFieldDouble "},
{名称:" TA Sugar ",类型:esriFieldDouble "},
),
几何类型:",
特点:[],
};


//计算处理区域的甘蔗面积-下面的工作在弹出框中很好


var intlayer =交叉(TA,糖);
var intcount = Count(intlayer);
var sugarinTA = 0;
If (intcount > 0){
For (var sugararea in inlayer){
sugarinTA +=面积(交集(TA, sugararea),"公顷")


//循环遍历并在字典中存储属性-不知道如何做到这一点


for (var t in TA){
Var壮举= {
属性:{
TA名称:t[" Name "],
TA Ha: t["Area_ha"],
for (var s in sugarinTA){
Var壮举= {
属性:{
TA Sugar: s[" Sugar inta "],


}推(特性,壮举);

非常感谢你的帮助

0荣誉
3解决方案

接受的解决方案
JohannesLindner
常规赛MVP
//从门户访问数据层var端口=门户('http://www.argis.com') var fsTa = FeatureSetByPortalItem(端口,'itemid', 0) var fsSugar = FeatureSetByPortalItem(端口,'itemid', 0) //创建空字典var sugarDict = {fields:[{名称:"TA_Name",类型:"esriFieldTypeString"},{名称:"TA_Ha",类型:"esriFieldTypeDouble"},], geometryType: "",特征:[],} //循环处理区域特征为(var ta in fsTa){//得到交叉糖区域var intSugar = Intersects(fsSugar, ta) //循环这些特征,得到交叉的和var sugarArea = 0为(var s in intSugar) {sugarArea += area (Intersection(s, ta), "公顷")}//附加到输出dict var f = {attributes: {TA_Name: ta。名称,TA_Ha:区域(ta, "公顷"),TA_Sugar: sugarArea}}特性,f)}//转换为Featureset并返回return Featureset(Text(sugarDict))

祝你有愉快的一天!
约翰内斯

在原帖子中查看解决方案

JohannesLindner
常规赛MVP

格式化代码:

johanneslindner_0 - 1670479234964. - png

johanneslindner_1 - 1670479257402. - png

我添加了另一个图层区域相交,它显示为一个字段,但它没有计算相交面积

这是因为您将与WHA特性的交集放在了一个单独的循环中。它们被计算,然后被覆盖,而不存储在输出字典中。

我还想对阶段进行分组

幸运的是,这在本例中非常简单。我使用When()来获得一个默认值,如果阶段不在这两个组中(例如当它为空时)。

/ /等等/ /循环治疗区域特性(var fsTa ta){/ /得到交叉糖区var intSugar =相交(fsSugar, ta) var sugarArea = 0 (var年代intSugar) {sugarArea + = AreaGeodetic(十字路口(年代,ta),公顷)}/ /得到相交的世界卫生大会区域var intWHA =相交(fsWHA, ta) var WHAArea = 0 (var intWHA w) {WHAArea + = AreaGeodetic(十字路口(w, ta),公顷)}/ /状态值计算var状态=(包括((1、2、3、4),ta. phase),“状态1”,ta。Phase == 5, "Status 2", "Default") //添加到输出的dict var f = {attributes: {TA_Status: Status, TA_Ha: AreaGeodetic(ta, "公顷"),TA_Sugar: sugarArea, TA_WHA: WHAArea}} Push(combinedDict. txt)features, f)} //转换为特征集并返回返回特征集(Text(combinedDict))


祝你有愉快的一天!
约翰内斯

在原帖子中查看解决方案

JohannesLindner
常规赛MVP

循环通过轮-分组它像上面允许我循环通过轮和缓冲和联合??

不,有一点复杂。Buffer(), Union()和Area()不能在feature set上工作,只能在奇异的Features/Geometries上工作(或者在Union的情况下是数组),所以你需要两个循环:

  • 外圈绕了一圈
  • 内循环的特点超过了一个回合

像这样的东西应该工作:

//我们不需要GroupBy,我们只需要组字段var treatmentRounds = distinct (ftreatment, "Round_Num") //轮外循环for(var treatRound in treatmentRounds){//过滤特征集var roundNum = treatRound。查询Round_Num var = " Round_Num " + Iif (roundNum = = null,“为空”,“= @roundNum”)var =过滤器过滤(fsTreatment、查询)/ /内循环过滤特性var buffer_geometries = [] (var f在过滤){/ /缓冲几何,将它添加到数组的推动(buffer_geometries、缓冲区(f 5米))}/ /联盟所有这些缓冲区到一个几何var union_geometry =联盟(buffer_geometries) / var /创建新的输出特性f ={属性:{Round_Treat:roundNum, Area_Treat: AreaGeodetic(union_geometry, "公顷")}}Push(TreatmentDict。features, f)} return Featureset(Text(TreatmentDict))

祝你有愉快的一天!
约翰内斯

在原帖子中查看解决方案

8回答说
JohannesLindner
常规赛MVP
//从门户访问数据层var端口=门户('http://www.argis.com') var fsTa = FeatureSetByPortalItem(端口,'itemid', 0) var fsSugar = FeatureSetByPortalItem(端口,'itemid', 0) //创建空字典var sugarDict = {fields:[{名称:"TA_Name",类型:"esriFieldTypeString"},{名称:"TA_Ha",类型:"esriFieldTypeDouble"},], geometryType: "",特征:[],} //循环处理区域特征为(var ta in fsTa){//得到交叉糖区域var intSugar = Intersects(fsSugar, ta) //循环这些特征,得到交叉的和var sugarArea = 0为(var s in intSugar) {sugarArea += area (Intersection(s, ta), "公顷")}//附加到输出dict var f = {attributes: {TA_Name: ta。名称,TA_Ha:区域(ta, "公顷"),TA_Sugar: sugarArea}}特性,f)}//转换为Featureset并返回return Featureset(Text(sugarDict))

祝你有愉快的一天!
约翰内斯
JasmineSpring
通过
新贡献者II

传奇!效果很好。

我添加了另一个图层区域相交,它显示为一个字段,但它没有计算相交面积。我在下面添加了它。

我还想把相分组,它们是1 2 3 4 5。我想把它们分成两类(5)和(1,2,3,4)

非常感谢你的帮助

var port = Portal('https://qgsp.maps.arcgis.com/”)
var fsTa = FeatureSetByPortalItem(port, 'item', 0)
var fswa = FeatureSetByPortalItem(port,'item', 0)
var fsSugar = FeatureSetByPortalItem(port,'item', 0)

//创建空字典
var CombinedDict = {
字段:[
{name: "TA_Status", type: "esriFieldTypeString"},
{name: "TA_Ha", type: "esriFieldTypeDouble"},
{name: "TA_WHA", type: "esriFieldTypeDouble"},
{name: "TA_Sugar", type: "esriFieldTypeDouble"},
),
geometryType:“”,
特点:[],

//循环处理区域特征
for(var t in fsTa) {
//得到交叉的糖区域
var intWHA = Intersects(fswa, t)
//循环遍历这些特征并获得交集的和
var WHAArea = 0
for(var w in intWHA) {
WHAArea += AreaGeodetic(相交(w, t), "公顷")



//循环处理区域特征
for(var ta in fsTa) {
//得到交叉的糖区域
var intSugar = Intersects(fsSugar, ta)
//循环遍历这些特征并获得交集的和
var sugarArea = 0
for(var s in intSugar) {
sugarArea +=面积(交集(s, ta), "公顷")


//附加到输出字典
var f ={属性:{TA_Status:ta. varPhase, TA_Ha: AreaGeodetic(ta, "公顷"),TA_WHA: WHAArea,TA_Sugar: sugarArea}}
推动(CombinedDict。特性,f)

//转换为Featureset并返回
返回Featureset(文本(CombinedDict)}

0荣誉
JohannesLindner
常规赛MVP

格式化代码:

johanneslindner_0 - 1670479234964. - png

johanneslindner_1 - 1670479257402. - png

我添加了另一个图层区域相交,它显示为一个字段,但它没有计算相交面积

这是因为您将与WHA特性的交集放在了一个单独的循环中。它们被计算,然后被覆盖,而不存储在输出字典中。

我还想对阶段进行分组

幸运的是,这在本例中非常简单。我使用When()来获得一个默认值,如果阶段不在这两个组中(例如当它为空时)。

/ /等等/ /循环治疗区域特性(var fsTa ta){/ /得到交叉糖区var intSugar =相交(fsSugar, ta) var sugarArea = 0 (var年代intSugar) {sugarArea + = AreaGeodetic(十字路口(年代,ta),公顷)}/ /得到相交的世界卫生大会区域var intWHA =相交(fsWHA, ta) var WHAArea = 0 (var intWHA w) {WHAArea + = AreaGeodetic(十字路口(w, ta),公顷)}/ /状态值计算var状态=(包括((1、2、3、4),ta. phase),“状态1”,ta。Phase == 5, "Status 2", "Default") //添加到输出的dict var f = {attributes: {TA_Status: Status, TA_Ha: AreaGeodetic(ta, "公顷"),TA_Sugar: sugarArea, TA_WHA: WHAArea}} Push(combinedDict. txt)features, f)} //转换为特征集并返回返回特征集(Text(combinedDict))


祝你有愉快的一天!
约翰内斯
JasmineSpring
通过
新贡献者II

非常感谢: slightly_smiling_face:非常感谢您的帮助!谢谢你告诉我如何添加代码。

我在缓冲函数中看不到溶解函数或选项。是否有可能缓冲和溶解重叠缓冲区?我想组一个webblayer轮,缓冲区每一轮,并计算在我的仪表板元素的面积。

谢谢你!: slightly_smiling_face:

0荣誉
JohannesLindner
常规赛MVP

联盟().这样,您就可以合并/分解多个几何图形。


祝你有愉快的一天!
约翰内斯
0荣誉
JasmineSpring
通过
新贡献者II

谢谢你!

好吧,我试着去试试。你会用分组by来分隔网页层吗?(有一个圆形区域)然后循环通过一个缓冲区,然后一个联合,然后区域?最后一个Featureset每一轮只有公顷的面积

//从门户访问数据层var端口=门户('https://arcgis.com/') var ftreatment = FeatureSetByPortalItem(端口,'itemID', 0) //创建空字典var TreatmentDict = {fields:[{名称:"Round_Treat",类型:"esriFieldTypeString"},},], geometryType: "",特征:[],} //由round Var treattround设置的组特征= GroupBy(ftreatment,'Round_Num',COUNT) //循环通过轮-分组它会像上面那样允许我循环通过轮和缓冲并联合它们吗?//缓冲区组5m var treatbuff = BufferGeodetic(treattround, 5,'meters') // union解除var treatunion = union (treatbuff) //计算处理的区域var AreaTreated = AreaGeodetic(treatunion, "公顷")//附加到输出dict var f = {attributes: {Round_Treat: . round_num, Area_Treat: AreaTreated}}features, f)} //转换为特征集并返回返回特征集(Text(TreatmentDict))

0荣誉
JohannesLindner
常规赛MVP

循环通过轮-分组它像上面允许我循环通过轮和缓冲和联合??

不,有一点复杂。Buffer(), Union()和Area()不能在feature set上工作,只能在奇异的Features/Geometries上工作(或者在Union的情况下是数组),所以你需要两个循环:

  • 外圈绕了一圈
  • 内循环的特点超过了一个回合

像这样的东西应该工作:

//我们不需要GroupBy,我们只需要组字段var treatmentRounds = distinct (ftreatment, "Round_Num") //轮外循环for(var treatRound in treatmentRounds){//过滤特征集var roundNum = treatRound。查询Round_Num var = " Round_Num " + Iif (roundNum = = null,“为空”,“= @roundNum”)var =过滤器过滤(fsTreatment、查询)/ /内循环过滤特性var buffer_geometries = [] (var f在过滤){/ /缓冲几何,将它添加到数组的推动(buffer_geometries、缓冲区(f 5米))}/ /联盟所有这些缓冲区到一个几何var union_geometry =联盟(buffer_geometries) / var /创建新的输出特性f ={属性:{Round_Treat:roundNum, Area_Treat: AreaGeodetic(union_geometry, "公顷")}}Push(TreatmentDict。features, f)} return Featureset(Text(TreatmentDict))

祝你有愉快的一天!
约翰内斯
JasmineSpring
通过
新贡献者II

非常感谢: slightly_smiling_face:

我也想知道是否有另一种方法可以自动创建这些功能集或从web层进行预处理(它们每天都会更新),以提高仪表板的性能?

也可以将数据表达式添加到元素中,即它被选择器过滤,缓冲区和区域在元素中计算?(即用户选择时间帧)

谢谢!!:)

0荣誉