0

現在、テキサス州の郡の境界を表示するために、郡情報の Google マップ フュージョン テーブルを使用しています。テキサス州には 200 以上の郡があります。各郡の値の配列をループしており、配列の値に基づいて郡を色分けする必要があります。Stop郡には、Warning、の 4 つのレベルの色があり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;
}
4

2 に答える 2

0

あなたは本当に4つのスタイルしか持っていません。各郡の金額を独自のFusionTableに取り込む必要があります。US郡フュージョンテーブル(おそらくTX郡のみ)をダウンロードして、新しいFTを作成することができます。次に、独自のドル値列を追加します。(より簡単なより良いアプローチは、actualValuesをCountiesテーブルとマージすることですが、テーブルのマージには慣れていません。実際のValuesとState-Countyキー値が必要です。マージすると、自分が所有する新しいテーブルが作成されます)

次に、 MapsFTDocsで説明されているように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);
于 2012-05-25T12:02:23.040 に答える
0

回答の更新:

会社がデータのプッシュを望まず、従業員のみが利用できる内部アプリケーションを作成している場合は、Fusion Tables を使用したくありません。Fusion Tables のデータは一般に公開されており、次の 2 つの方法のいずれかで公開されます。

ここに画像の説明を入力


2012 年 5 月 25 日のコメントへのフォローアップ (FusionTables を進めることにした場合):

あなたのコメントで、私はあなたが何をしているのかをよりよく理解しています。オブジェクトを作成する関数をloadTexas呼び出している関数内のコードは正しいと思います。styleLayerFusionTablesStyle

疑わしいと思われる部分は、loadTexas関数と関数内のコードの順序ですloadFusionLayervar where関数の宣言も欠落していloadFusionLayerます。私はそれが問題を引き起こしているとは思わないが (少なくともあなたが示したコードでは)、誤ってグローバルを作成するので、次のコードでその問題を修正した. 次の変更を行うことをお勧めします。

  1. var fusionTablesOptionsグローバル スペースで を新規作成し、を使用して のすべてのオプションをfusionTablesOptions設定します。ftLayer FusionTablesLayer
  2. var ftLayerに割り当てられるようにの宣言を変更しますnull
  3. 配列を繰り返し、aryCounty配列を構築し、それをプロパティstylesに割り当てます。fusionTablesOptions.styles
  4. named:fusionTablesOptions.mapの既存のインスタンスに代入します(そして、関数内のこのコード行を削除します: )。google.maps.MapmaploadTexasftLayer.setMap(map);
  5. fusionTablesOptions.query関数に組み込まれているオブジェクトに割り当てloadFusionLayerます。
  6. 必要なプロパティがすべて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 );
}

大きな答えで申し訳ありませんが、レビューや実装が簡単だと思われる方法で、すべての提案を明確に伝えたいと思いました。

于 2012-05-25T01:40:02.143 に答える