2012-05-23 34 views
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正常工作與一個JSON文件,但我試圖使用 代碼不止一個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}]; 

感謝您的建議@無害的,但我希望能夠通過在參數中傳遞選定的.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++) { 
+0

跟着你的問題的鏈接,但我沒有找到任何json文件腳本標記引用。正如@harmlessdragon建議的那樣,你可以在你的問題中添加更多的代碼嗎? –

回答

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文件的信息。

+0

不要騷擾,但習慣上使用對原始問題的評論來詢問這樣的澄清問題。它只是減少每個人的困惑。 –

+1

我不能添加評論主要職位(由於代表),否則我會......計劃在稍後修改我的答案。 :) – rcheuk

+0

明白了 - 忘記了特權事件阻止評論 - 我的壞 - 一切都很好。 –