0

我上周在 http://code.google.com/p/gmaps-samples-v3/source/browse/trunk/talks/io2011/map-usability/mappanslow.html?spec=svn265&r=上找到了这个文件 mappanslow.html 265 ,知道如何从 json 文件中获取数据对我来说非常有用。我目前正在 V3 中重新编码这张地图 http://www.ville.rimouski.qc.ca/styles/carte/carte.jsp我的问题是用户必须能够选择哪些数据(来自不同的json 文件)将通过在“Imprimer”下的选择框中选择他想要的内容来显示。mappaslow.html 适用于一个 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);
 ...

有可能做这样的事情吗?我尝试了很多方法,但总是导致语法错误或未定义的东西。

别忘了目标是上面第二个链接的地图。。


@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"}
        ]           

}];

我看到一个警告,第一个循环识别了正确数量的“文件”。现在的问题是任何东西都会进入第二个循环:

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 文件具有不同名称的变量,并确保将上述方法更改为新名称。这可能意味着您将拥有 3 个不同的函数:addJSONFile1Markers、addJSONFile2Markers、addJSONFile3Markers,其中每个函数处理不同的变量。或者,您可以创建一个基于参数检查要为其添加标记的文件的函数。

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 回答