为什么我的Fusion Table图层和样式不起作用?

时间:2012-05-24 23:59:13

标签: google-maps google-maps-api-3 google-fusion-tables

我目前正在使用谷歌地图融合表获取县信息,以显示德克萨斯州的县界。德克萨斯州有200多个县。我循环遍历每个县的值数组,并需要根据数组中的值对县进行颜色编码。该县有4种颜色级别:StopWarningWatchOpen。一切似乎都在起作用,只是颜色只适用于5个县。样式的限制是5,图层的限制也是5,但我只使用1层和4个样式。

有人可以告诉我,我错了吗?或者这是不可能通过API?

以下是代码片段:

var styles = new Array();
var ftLayer = new google.maps.FusionTablesLayer();

function loadTexas() {
    loadFusionLayer('TX');
    ftLayer.setMap(map);
    for (var i = 0; i < aryCounty.length; i++) {
        styleLayer("'State Abbr.' = 'TX' AND 'County Name' = '" +
            aryCounty[i].County + "'", 1000);
    }
    ftLayer.set('styles', styles);
}

function loadFusionLayer(state) {    
    if (state != null) {
        where = "'State Abbr.' IN ('" + state + "')";
    }
    var select = "geometry, 'State Abbr.', 'County Name'";
    ftLayer.setOptions({          
        query: {            
            select: select,            
            from: countyTableId,            
            where: where
        }  
    });        
} 

function styleLayer(where, actualValue) {
    var color = setPolygonColorBy(actualValue);
    styles.push({                        
        where: where,                  
        polygonOptions: {                              
            fillColor: color,            
            fillOpacity: 0.6           
        }          
    });         
}

function setPolygonColorBy(actualValue, divisor) { 
    var status;
    var stop = STATUS_LAYER_STYLES["Stop"].color;
    var warning = STATUS_LAYER_STYLES["Warning"].color;
    var watch = STATUS_LAYER_STYLES["Watch"].color;
    var open = STATUS_LAYER_STYLES["Open"].color;
    if (actualValue >= minValue && actualValue < midValue) {
        status = watch;
    }
    else if (actualValue >=midValue && actualValue < maxValue) {
        status = warning;
    }
    else if (actualValue >= maxValue) {
        status = stop;
    }
    else {
        status = open;
    }
    return status;
}

2 个答案:

答案 0 :(得分:0)

答案更新:

如果您的公司不想推送数据并且您正在编写仅供员工使用的内部应用程序,那么您不想使用Fusion Tables。 Fusion Tables中的数据通常可供公众使用,并以两种方式发布:

enter image description here


2012年5月25日评论的后续行动(如果您决定推进FusionTables):

根据您的意见,我更了解您在做什么。我相信loadTexas函数中调用styleLayer函数创建FusionTablesStyle对象的代码是正确的。

看起来可疑的部分是loadTexas函数和loadFusionLayer函数中代码的排序。 var where函数中还缺少loadFusionLayer声明。我不认为这会导致问题(至少不会出现在你所显示的代码中),但它无意中创建了一个全局,因此在后面的代码中纠正了这个问题。我建议进行以下更改:

  1. 在全球空间中新建var fusionTablesOptions,并使用fusionTablesOptionsftLayer FusionTablesLayer设置所有选项。< / LI>
  2. 更改var ftLayer的声明,以便将其分配到:null
  3. 迭代aryCounty数组,构建styles数组,并将其分配给fusionTablesOptions.styles属性。
  4. fusionTablesOptions.map分配给google.maps.Map名为map的现有实例(并删除loadTexas函数中的以下代码行:ftLayer.setMap(map);)。< / LI>
  5. fusionTablesOptions.query分配给loadFusionLayer函数中构建的对象。
  6. 现在已经设置了所有必需的fusionTablesOptions属性,创建一个google.maps.FusionTablesLayer的新实例,将fusionTablesOptions传递给构造函数。

  7. var styles = new Array();
    //Step 1:
    var fusionTablesOptions = {};
    //Step 2:
    var ftLayer = null;
    
    function loadTexas() {
        //Step 3:       
        for (var i = 0; i < aryCounty.length; i++) {
            //Call to the styleLayer function not shown to reduce code size
        }
        fusionTablesOptions.styles = styles;
        //Step 4:
        fusionTablesOptions.map = map;
        loadFusionLayer('TX');
    }
    
    function loadFusionLayer(state) {    
        var where = null;    //Corrects the missing var keyword
        if (state != null) {
            where = "'State Abbr.' IN ('" + state + "')";
        }
    
        var select = "geometry, 'State Abbr.', 'County Name'";
        //Step 5:
        fusionTablesOptions.query : {            
            select: select,            
            from: countyTableId,            
            where: where
        }
        //Step 6:
        ftLayer = new google.maps.FusionTablesLayer( fusionTablesOptions );
    }
    

    大回答道歉,但我想确保以一种易于审核或实施的方式清楚地传达我的所有建议。

答案 1 :(得分:0)

你真的只有4种款式。您需要将每个县的美元价值计入您自己的Fusion Table。您可以下载US Counties Fusion Table,也许只下载TX县并创建新的FT。然后添加您自己的美元值列。 (一个更简单的更好的方法是将您的actualValues与Counties表合并,但我并不熟悉合并表。您需要实际的值和State-County键值。合并应创建一个由您拥有的新表)

然后您可以按Maps FT Docs

中所述创建4种样式

这里可能存在语法错误。

ftLayer = new google.maps.FusionTablesLayer({
  query: {
    select: 'geometry',
    from: countyTable_with_actualValues_Id },
  styles: [{
    // default color
    where: "'State Abbr.' ='" + state + "'";
    polygonOptions: {
      fillColor: open
    }
  }, {
    where: "'State Abbr.' ='" + state + "' AND actualValue >= " + maxValue;
    polygonOptions: {
      fillColor: stop
    }
  }, {
    where:  "'State Abbr.' ='" + state + "' AND actualValue >= " + minValue + "AND actualValue < " + midValue;
    polygonOptions: {
      fillColor: watch
    },
   // Final condition left as an exercise :-)
  }]
});

ftLayer.setMap(map);