2013-10-24 54 views
2

我試圖創建一塊功能來有效地返回一組地基座標。我曾使用Google的地理編碼器有效地創建一次性地面座標,但是我想將它集成到一個系統中,最終通過使用一個時間塊創建一系列基於陸地的座標系,所以函數被調用直到必要條件確定陸基座標的數量。我認爲下面的代碼應該可以工作,但是當函數被調用時,頁面(使用JSFiddle)會崩潰。使用地理編碼返回地面座標數組的問題

我對此感到茫然,因爲我相信每次找到基於位置的座標時都應該減少數字,如果找不到該座標,則會調用該函數直到找到一個(這將在未來的某個時間點)。

任何指導,將不勝感激。公共小提琴是http://jsfiddle.net/grabbeh/sajfb/

var map; 
var coords = []; 
var geocoder = new google.maps.Geocoder(); 

window.onload = function() { 
    center = new google.maps.LatLng(40.717, -74.006); 

    var options = { 
    zoom: 1, 
    center: center, 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 

    map = new google.maps.Map(document.getElementById('map'), options); 
    //randomLandBasedCoords(2, function(coords){ 
    // addMarkersToMap(coords); 
    //}); 
    }; 

function addMarkersToMap(places) { 
    for (var i = 0, j = places.length; i < j; i++) { 
    placeMarker(places[i]); 
    }; 
}; 

function placeMarker(location) { 
var marker = new google.maps.Marker({ 
    position: location, 
    map: map, 
    flat: true, 
    }); 
}; 

function randomLandBasedCoords(number, fn) { 
    if (number > 0) { 
    while (number > 0) { 
     // create random coordinate 
     var lng = (Math.random() * 360 - 180); 
     var lat = (Math.random() * 180 - 90); 
     var randomCoordinate = new google.maps.LatLng(lat, lng); 

     // call geocoder function to check if coordinate is land-based with a timeout to control flow (maybe) 
     setTimeout(geocoder.geocode({ 
      location: randomCoordinate 
      }, function (results, status) { 
       if (status == "OK" && results) { 
        var landCoordinate = randomCoordinate; 
        coords.push(landCoordinate); 
        number--; 
       } 
      }), 250); 
     } 
    } 
    return fn(coords); 
} 

回答

1

試試這個:

來自同一個站點
function randomLandBasedCoords(number,fn) { 
    // create random coordinate 
    var lng = (Math.random() * 360 - 180); 
    var lat = (Math.random() * 180 - 90); 
    var randomCoordinate = new google.maps.LatLng(lat, lng); 

    // call geocoder function to check if coordinate is land-based 
    geocoder.geocode({ 
     location: randomCoordinate 
    }, function (results, status) { 
     if (status == "ZERO_RESULTS") { 
      randomLandBasedCoords(number,fn); 
     } else if (status == "OK" && results) { 
      var landCoordinate = randomCoordinate; 
      coords.push(landCoordinate); 
      if (coords.length < number) { 
       randomLandBasedCoords(number,fn); 
      } else { 
       return fn(coords); 
      } 
     } 
    }); 
} 
+1

嘿亞歷克斯,謝謝你。這絕對是一種改進,但仍處於地圖上出現非陸地座標的位置。即使在'數字'爲1的情況下也是如此。總而言之,這讓我感到困惑。 http://jsfiddle.net/grabbeh/jsLZS/是小提琴。 – Michael

+0

實際上,看起來像是我可以根據地理編碼器結果進行微調的東西,據推測,我會接受這是正確的:) – Michael

1

它看起來像代碼翻倒時,你做你的「//調用地理編碼器功能檢查,如果協調是陸基」功能。

錯誤:

Error: useless setTimeout call (missing quotes around argument?) 
}), 250); 

有沒有到調試,現在的時間,但這裏是我已經成功地在過去看起來更簡單使用的樣本:

if (status == google.maps.GeocoderStatus.OK) { // -- Has a result been returned ? 
    DO process stuff 
}else{ // -- Location not returned - must be in the sea ! 
    DO in the sea stuff 
} 

可能有幫助嗎?

+0

一點額外的,我使用這個代碼 - 「如果(結果[0] .formatted_address.indexOf( 'UK')== -1){ // - 檢查選擇的位置是否在英國「,以檢查選擇的位置是否在英國。 - 可能有些用處... –

+0

感謝帕特 - 我想我留在了與現有代碼類似的位置。刪除setTimeout不會導致任何改進。將繼續修補... – Michael

相關問題