2013-04-08 36 views
0

我有一個程序可以生成KML文件,現在想循環瀏覽地標以找到最近的一個。但是我在通過它們循環時遇到問題。Google Maps API - 想循環瀏覽並獲取KML中的點數

基本上,我將KML解析爲Google地球插件。點擊在谷歌地球插件的地標之一得到它的緯度/經度(如StartLat和StartLon),並開始了這個代碼:

function GetDir() 
{ 
    var PlaceMarks=ge.getElementsByType('KmlPlacemark'); 
    i=0; 
    GetNext=1; 
    while(i<3) 
    { 
    if(GetNext==1) 
    { 
     GetNext=0; 
     var PM2 = PlaceMarks.item(i); 
     var request= 
     { 
     origin: StartLat + ", " + StartLon, 
     destination: PM2.getGeometry().getLatitude() + ", " + PM2.getGeometry().getLongitude(), 
     travelMode: google.maps.DirectionsTravelMode.DRIVING 
     }; 
     directionsService.route(request, function(result, status) 
     { 
     if (status == google.maps.DirectionsStatus.OK) 
     { 
      directionDisplay.setDirections(result); 
     } 
     }); 
    } 
    } 
} 

我有一個「空閒」聽衆在地圖上的話,理論上,在找到方向並顯示它們之後,i增加1,所以我們移動到下一個地標,GetNext設置爲1,所以我們再次調用方向。

目前它咆哮起來,IE8(我們的IT部門允許我們使用的唯一瀏覽器)表示腳本運行緩慢。我有這樣的感覺,使用這個循環,它不能聽取回應。

編輯 - 抱歉,應該提到,在同一頁上還有一張地圖顯示結果。它僅在處理一個(此循環之外)時才起作用,而此時此循環僅處理三個(因此while(i < 3))。目的是爲了處理大量的地標,並且我可以在KML文件中獲得地標數量沒有問題。

回答

0

解決了它。而不是增加Idle偵聽器上的所有內容,而是讓Idle偵聽器調用移至下一個點的過程。相關代碼:

這使KML文件導入到谷歌地球API,並附加代碼,開始循環通過:

function GetKML() 
{ 
    if (currentKmlObject) 
    ge.getFeatures().removeChild(currentKmlObject); 
    var KmlBox = document.getElementById('kml-box'); 
    var KmlString = KmlBox.value; 
    try 
    { 
    currentKmlObject=ge.parseKml(KmlString); 
    ge.getFeatures().appendChild(currentKmlObject); 
    google.earth.addEventListener(currentKmlObject, 'click', function(event) 
    { 
     var placemark = event.getTarget(); 
     StartLat = placemark.getGeometry().getLatitude(); 
     StartLon = placemark.getGeometry().getLongitude(); 
     alert('Start point set. Latitude: ' + StartLat + ' Longitude: ' + StartLon + '. Finding nearest...'); 
     AreWeSearching=1; 
     i=0; 
     GetDir(); 
    }); 
    var PlaceMarks=ge.getElementsByType('KmlPlacemark'); 
    KMLLength=PlaceMarks.getLength(); 
    alert('KML parsed and added. ' + KMLLength + ' points available. Please click which placemark you would like as your START point on the EARTH screen.'); 
    } 
    catch(ex) 
    { 
    alert('Parse error'); 
    } 
} 

這是GETDIR功能,詢問標代碼。目前,這只是上升到10位,但我只是用標長度:

function GetDir() 
{ 
    if(i==10){AreWeSearching=0;} 
    if(AreWeSearching==1) 
    { 
    var PlaceMarks=ge.getElementsByType('KmlPlacemark'); 
    var PM2 = PlaceMarks.item(i); 
    var request= 
    { 
     origin: StartLat + ", " + StartLon, 
     destination: PM2.getGeometry().getLatitude() + ", " + PM2.getGeometry().getLongitude(), 
     travelMode: google.maps.DirectionsTravelMode.DRIVING 
    }; 
    directionsService.route(request, function(result, status) 
    { 
     if (status == google.maps.DirectionsStatus.OK) 
     { 
     directionDisplay.setDirections(result); 
     } 
    }); 
    i=i+1; 
    } 
} 

在地圖API的空閒監聽再次調用GETDIR功能,所以基本上這就是所謂的第一次,每當它閒置時,再次被調用,直到我們停止通過它。

基本上,我爲它建造的(對於那些還沒有完成的人)是這樣,我可以找到最近的地標,我點擊一個地標。使用一些額外的代碼,它將允許我從選定的地標開始繞過KML文件的地標。

因此,對於任何想要從您的硬盤驅動器路由KML文件的方法,請使用Google地球插件和Google地圖插件創建一個頁面。像上面所做的那樣,將KML加載到Google地球中,然後使用Google地圖和Idle偵聽器循環。