0

先週、このファイル mappanslow.html を http://code.google.com/p/gmaps-samples-v3/source/browse/trunk/talks/io2011/map-usability/mappanslow.html?spec=svn265&r=で見つけました。 265 を使用しており、json ファイルからデータを取得する方法を知っていることは非常に役に立ちました。現在、このマップを V3 で再コーディングしてい ます http://www.ville.rimouski.qc.ca/styles/carte/carte.jspと私の問題は、ユーザーがどのデータを (異なるデータから) 選択できる必要があるかということですjson ファイル) は、「Imprimer」の下の選択ボックスで必要なものを選択すると表示されます。mappaslow.html は 1 つの json ファイルで正常に動作しますが、複数の json ファイルにコードを使用しようとしました。たとえば、すべてのファイルを次のようにリストすると、次のようになります。

<script type="text/javascript" src="file1.json"></script>
<script type="text/javascript" src="file2.json"></script>
<script type="text/javascript" src="file3.json"></script>

表示されるデータは、常に最後のデータ (file3.json) からのものです。

この問題を回避する方法を知っている人はいますか?

mappaslow.html からのコードがあります。

<script type="text/javascript" src="markers.json"></script>
<script type="text/javascript">
var map;        
var timeout;        
var m = [];        
function init() {          
  map = new google.maps.Map(document.getElementById('map'), {
    center: new google.maps.LatLng(44.85471, -93.24185),
    zoom: 17,
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    mapTypeControl: false
  });
  google.maps.event.addListener(map, 'bounds_changed', function() {
    clearMarkers();
    if (timeout) {
      window.clearTimeout(timeout);
    }
    timeout = window.setTimeout(function() {
      addMarkers();

    }, 500);
  });
}
function addMarkers() {
  var bounds = map.getBounds();
  for (var i = 0; i < markers.length; i++) {
    var pos = new google.maps.LatLng(markers[i].lat, markers[i].lng);
    if (bounds.contains(pos)) {
      var marker = new google.maps.Marker({
        map: map,
        position: pos
      });
      m.push(marker);
    }
  }
}

function clearMarkers() {          
  for (var i = 0, marker; marker = m[i]; i++) {            
    marker.setMap(null);
  }
  m = [];
}
google.maps.event.addDomListener(window, 'load', init);
</script>  

この例と私のマップで使用される json ファイルは次のようになります。

var markers = [
{"lat":44.86065444748757, "lng":-93.26223975870084},
{"lat":44.84990797511595, "lng":-93.22287578639873}];

あなたの提案@harmlessdragonに感謝しますが、構造が同一であるため、選択した.jsonの名前をパラメーターに渡すだけで正しい変数を指定できることを望んでいました。何かのようなもの:

  function addMarkers(jsonName) {
  var rightJson = jsonName;
  var bounds = map.getBounds();
  for (var i = 0; i < rightJson.markers.length; i++) {
    var pos = new google.maps.LatLng(rightJson.markers[i].lat, rightJson.markers[i].lng);
 ...

このようなことは可能ですか?私は多くの方法を試しましたが、常に構文エラーまたは未定義の結果になります。

ターゲットは上の 2 番目のリンクのマップであることを忘れないでください。


@harmlessdragon、最終的にjsonファイルの正しい構文を見つけました:

var markers = [{
            "file1": [
                {"lat": "number", "lng": "number"}, {"lat": "number", "lng": "number"}, 
        ]},{"file2": [
                {"lat": "number", "lng": "number"}, {"lat": "number", "lng": "number"}, 
        ]},{"file3": [
                {"lat": "number", "lng": "number"}, {"lat": number, lng: number"}
        ]           

}];

最初のループで正しい数の「ファイル」が認識されていることが警告でわかります。問題は、何かが 2 番目のループに渡されることです。

for (var t = 0; t < markers[i].length; t++) {
4

1 に答える 1

1

最近の編集:

私はここでこの例をやめます:

http://www.json.org/js.html

var myJSONObject = {"bindings": [
    {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
    {"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
    {"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
   ]
};

myJSONObject.bindings[0].method    // "newURI"

ループは次のようになります。

function addMarkers(param) {
   if (param == "1") {
    // if it is for file one, loop through all in file one
    for (t = 0; t < markers.file1.length; t++ ) {
           var pos = new google.maps.LatLng(markers.file1[t].lat, markers.file1[t].lng)
            // then create marker, push map, etc.
     }
   } else if (param == "2") {
     // if it is for file two, loop through all in file two instead
           for (t = 0; t < markers.file2.length; t++ ) {
           var pos = new google.maps.LatLng(markers.file2[t].lat, markers.file2[t].lng)
            // then create marker, push map, etc.
     }
   } else if ( param == "3") {
     for (t = 0; t < markers.file3.length; t++ ) {
           var pos = new google.maps.LatLng(markers.file3[t].lat, markers.file3[t].lng)
            // then create marker, push map, etc.
     }
   }
}

////////////////////////////////////////////////// ///////////////////////////////////////

同じ名前で異なるデータを保存し、データを区別するインジケーターなしでデータを取得することはできません。同じ変数名を使用する場合は、その追加のインジケーターをjsonに追加し、jsonファイルをマージする必要があります。

あなたはこのようなことをすることができます:

var markers = [
      file1: {
                {lat: number, lng: number}, {lat: number, lng: number}, etc.
      }
      file2: {
              {lat: number, lng: number}, {lat: number, lng: number}, etc.
      }
      file3: {
              {lat: number, lng: number}, {lat: number, lng: number}, etc.
      }
 ];

次に、データを取得するには、別のループを追加する必要があります。このjson構造は、配列です。配列内...配列内ですが、これが最も効率的ではないと思います。

      function addMarkers(param) {

            ...

          for (var i = 0; i < markers.length; i++) {
              for (var t = 0; t < markers[i].length; t++) {
                 if (markers[i] == param) {
                   var pos = new google.maps.LatLng(markers[i].lat, markers[i].lng);
                   if (bounds.contains(pos)) {
                     var marker = new google.maps.Marker({
                         map: map,
                         position: pos
                     });
                    m.push(marker);
                  }
                 }
             }

ハッシュマップ構造の調査を検討することをお勧めします。これが私が今調べたものです:

http://freecode-freecode.blogspot.com/2007/06/hashmap-object-in-javascript-like.html

私は定期的にJavascriptでコーディングしていないため、上記のコードでは一部の構文が間違っている可能性がありますが、何をする必要があるかについての一般的な考え方を伝える必要があります。

////////////////////////////////////////////////// ////////////////////////////////////////

おそらく、必要なのはfile1.json、file2.json、およびfile3.jsonに関する情報でした。

私はいくつかの仮定を行っていますが、これが何が起こっているのかについての私の推測です:

files1.json、file2.json、file3.jsonなどがあり、その例に従っている場合var markers = []、同じ名前の3つの変数を作成しました。これらの変数は互いに上書きしているため、files3.jsonは、最後に作成したものが残っています。

この例を機能させるには、次の点に注意する必要があります。

// This method adds a marker by looping through the variable 
// with the name 'markers', which you created
// in the JSON file with var markers = [].
function addMarkers() {
    var bounds = map.getBounds();
    for (var i = 0; i < markers.length; i++) {
      var pos = new google.maps.LatLng(markers[i].lat, markers[i].lng);
      if (bounds.contains(pos)) {
        var marker = new google.maps.Marker({
          map: map,
          position: pos
        });
        m.push(marker);
      }
    }
  }

この例を機能させるには、jsonファイルに別の名前の変数が含まれていることを確認し、新しい名前に対して上記のメソッドが変更されていることを確認する必要があります。つまり、addJSONFile1Markers、addJSONFile2Markers、addJSONFile3Markersの3つの異なる関数があり、各関数は異なる変数を処理します。または、マーカーを追加するファイルであるパラメーターに基づいてチェックする関数を作成することもできます。

function addMarkers(FILE2) {
   if (FILE2 == "file2") {
        // do this for file2
   }
   else if (FILE3 == "file3") {
        // do this for file 3
   }
}

これは擬似コードの単なる例です。

これが問題ではない場合は、jsonファイルに関する詳細情報を提供してください。

于 2012-05-23T15:01:02.043 に答える