从不同的json文件中获取数据

时间:2012-05-23 14:33:39

标签: google-maps-api-3

我上周发现了这个文件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适用于一个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++) {

1 个答案:

答案 0 :(得分: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文件的更多信息。