创建有效的数据表达式

可创建数据表达式以在仪表盘中启用数据驱动的元素。 它们使您可以使用您有权访问的数据集构建强大的可视化,从而创建有效的仪表盘。 以下是创建有效的数据表达式的最佳做法。

注:

您可以查看示例数据表达式,以帮助您入门。

数据表达式存在性能折衷,不得用于复杂的工作流或大型数据集。 在这些情况下,如果要使用自己拥有的数据,则建议对托管图层进行重新建模和发布。

  • 使用 FeatureSet 函数查询图层的数据时,仅请求所需的要素和列,并仅在必要时查询几何数据。

    通过在 FeatureSetByPortalItem 函数中指定以下列,以下数据表达式仅从图层中提取所需列,而不从图层中提取几何。 然后,使用 Filter 函数仅返回可视化所需的行。

    var fs = Filter(FeatureSetByPortalItem(Portal('https://www.arcgis.com'),'f8492125f78445b284751ced4e9d6573',0,['Waterbody_Type', 'Sample_Date', 'Mercury'], false),'Mercury > 0.3');

  • 您可以在同一仪表盘的多个元素中重复使用数据表达式。 避免创建多个用于处理并返回相同数据的表达式。
  • 避免在数据表达式中使用几何函数。 几何函数可能影响仪表盘的性能。 相反,请提前处理您的数据。

    以下表达式正在执行 Contains()Buffer() 几何方法,以在国家森林的 50 英里内找到化石燃料开采单位。 国家森林和开采单位的位置信息位于两个不同的图层中。 由于通过 for 循环对数据集中的每个国家森林执行几何方法,因此表达式很慢。

    var p = 'https://arcgis.com/'; 
    var sizeFilter = 'SQMI > 10000';  
    var nfs = Filter(FeatureSetByPortalItem(Portal(p),'3d86e0ee5f34471ab30a1ad19a08c21f',0),sizeFilter);  
    var wells = FeatureSetByPortalItem(Portal(p),'f30ebe47eebc4534b7a385835d6bfedb',0);
    
    var Dict = {  
     'fields': [{ 'name': 'NF_name', 'type': 'esriFieldTypeString' },  
     {'name': 'area','type': 'esriFieldTypeDouble'},  
     {'name': 'n_wells','type': 'esriFieldTypeInteger'}],  
     'geometryType': '',   
     'features': []};  
    
    var counts = 0;   
    var index = 0;  
    
    for (var nf in nfs) { 
        Console(nf)  
        counts = Count(Contains(Buffer(nf, 50, 'miles'), wells))  
        Dict.features[index] = {   
                'attributes': {   
                    'NF_name': nf.NAME,    
                    'area': nf.SQMI,    
                    'n_wells': counts  
                }}   
        index++; };  
    
    return FeatureSet(Dict);

  • 避免将数据表达式用于可通过仪表盘元素的标准配置执行的操作或查询。

    例如,任何数据驱动的元素都可以使用过滤器来产生以下表达式的结果:

    return Filter(FeatureSetByPortalItem(Portal('https://www.arcgis.com'),'f8492125f78445b284751ced4e9d6573',0,['Waterbody_Type', 'Sample_Date', 'Mercury'], false),'Mercury > 0.3');

  • 避免使用数据表达式处理大型数据集。

    以下表达式将列的逗号分隔值转换为单独的行。 此处理是在 for 循环中执行的,一次执行一项功能,导致表达式变慢。

    var fs = FeatureSetByPortalItem(Portal('https://www.arcgis.com'), 'd10b9e8dbd7f4cccbd0a938a06c586e9',0,['Report_road_condition'], false);
      
    var choicesDict =  
    {'fields': [{'name': 'split_choices', 'type': 'esriFieldTypeString'}],  
      'geometryType': '',  
      'features': []};  
     
    var index = 0;  
    
    for (var feature in fs) {  
        var split_array  =  Split(feature["Report_road_condition"], ',')  
        var count_arr = Count(split_array)  
        for(var i = 0; i < count_arr; i++){  
            choicesDict.features[index] = {  
                'attributes': {
             'split_choices':Trim(split_array[i]),   
                } }  
    index++;}  
    };  
    
    return GroupBy(FeatureSet(choicesDict),['split_choices'], [ {name:'split_count',expression:'split_choices',statistic: 'COUNT'}]);

  • 如果基础数据更新,则仅在数据表达式上设置刷新间隔。 将刷新间隔设置为一个反映数据更新频率的值。
    注:
    刷新间隔在移动视图上不受支持。
  • 使用文本编辑器保存数据表达式的副本。 仪表盘中未使用的数据表达式将不会被保存。
  • 不应将数据表达式视为良好数据建模的替代。 应尽可能在将数据导入仪表盘之前对其进行处理。