English 中文(简体)
从不同json 文件中获取数据
原标题:Getting data from different json files

I found this file mappanslow.html last week on http://code.google.com/p/gmaps-samples-v3/source/browse/trunk/talks/io2011/map-usability/mappanslow.html?spec=svn265&r=265 and it was very useful for me to know how to get data from a json file. I m re-coding in V3 this map at present http://www.ville.rimouski.qc.ca/styles/carte/carte.jsp and my problem is that the user must be able to choose which data (from different json file) will be displayed by selecting what he wants in the select box under "Imprimer". mappaslow.html works fine with one json file but I tried to use the code for more than one json file and, if I list, per example, all my files like this:

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

显示的数据总是来自上一个数据(文件3.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}];

感谢您的建议@harllessdragon, 但我希望能够通过将选中的.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);
 ...

我尝试过很多方法,但总是导致语法错误或一些没有定义的东西。

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


@harlessdragon, 我终于找到了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++) {
最佳回答

最新编辑:

举个例子:

http://www.json.org/js.html>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” rel=“no follow” >http://freecode-freecode.blogspot.com/2007/06/hashmap-object-in-javacept- like.html

在上述代码中,有些语法可能是错误的,因为我在Javascript中并不经常使用代码,但我应该传达需要做什么的一般想法。

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

也许我们需要的是文件1.json、文件2.json和文件3.json的资料。

我有一些假设,但我猜到发生了什么:

如果您有文件1.json、文件2.json、文件3.json等, 并且您正在学习 var 标记 = [> 的例子, 那么您已经创建了3个同名变量, 这些变量相互覆盖, 这就是为什么文件3.json, 也就是您最后创建的文件3.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 文件有一个不同名称的变量, 并确保上述方法被更改为新名称。 这可能意味着您将有三个不同功能: 添加 JSONFile1 Markers, 添加JSONFile2markers, 添加JSONFile2Markers, 添加JSONFile3Markers, 每个函数处理不同的变量。 或者, 您可以创建一个基于参数检查的函数, 用于添加标记的文件 。

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

这只是伪代码的一个例子。

如果这不是问题所在,请提供有关json档案的更多资料。

问题回答

暂无回答




相关问题
Why do I get "map.set_center is not a function"?

This code have been working until I updated last night. The code works perfectly on my localhost, but I get an error on my test server. The error message (from Firebug) is "map.set_center is not a ...

The state of GMaps v3

I m about to start a Google map based project and am wondering if the release version of GMaps v3 has most of the features that are available in v2, or if it would be best to stick with v2 for now. Is ...

Bouncy marker in Google Maps v3

In Google Maps API v2 we can set to marker an option bouncy:true. It adds to marker eye-candy ability - after dragging this marker, it is bouncing. Is it possible to do in API v3 ?

GUnload() a single Google Map

I ve got some Javascript/HTML code which displays a variable number of maps dependent on what the user selects. I ve worked how to dynamically create multiple maps on a page - that s well documented. ...

How to change Gmap markers color?

I ve a custom google map with different points: Markers[0] = new Array(new GMarker(new GLatLng(45.0, 9.0)), "Location1", "<strong>Address Line</strong><br/>Some information"); ...

热门标签