我目前正在使用谷歌地图融合表获取县信息,以显示德克萨斯州的县界。德克萨斯州有200多个县。我循环遍历每个县的值数组,并需要根据数组中的值对县进行颜色编码。该县有4种颜色级别:Stop
,Warning
,Watch
和Open
。一切似乎都在起作用,只是颜色只适用于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;
}
答案 0 :(得分:0)
如果您的公司不想推送数据并且您正在编写仅供员工使用的内部应用程序,那么您不想使用Fusion Tables。 Fusion Tables中的数据通常可供公众使用,并以两种方式发布:
根据您的意见,我更了解您在做什么。我相信loadTexas
函数中调用styleLayer
函数创建FusionTablesStyle
对象的代码是正确的。
看起来可疑的部分是loadTexas
函数和loadFusionLayer
函数中代码的排序。 var where
函数中还缺少loadFusionLayer
声明。我不认为这会导致问题(至少不会出现在你所显示的代码中),但它无意中创建了一个全局,因此在后面的代码中纠正了这个问题。我建议进行以下更改:
var fusionTablesOptions
,并使用fusionTablesOptions
为ftLayer
FusionTablesLayer
设置所有选项。< / LI>
var ftLayer
的声明,以便将其分配到:null
。aryCounty
数组,构建styles
数组,并将其分配给fusionTablesOptions.styles
属性。fusionTablesOptions.map
分配给google.maps.Map
名为map
的现有实例(并删除loadTexas
函数中的以下代码行:ftLayer.setMap(map);
)。< / LI>
fusionTablesOptions.query
分配给loadFusionLayer
函数中构建的对象。fusionTablesOptions
属性,创建一个google.maps.FusionTablesLayer
的新实例,将fusionTablesOptions
传递给构造函数。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);