0

我有一个生成 KML 文件的程序,现在想要循环浏览地标以找到最近的地标。但是我在骑自行车时遇到了问题。

基本上,我将 KML 解析为 Google 地球插件。单击 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);
        }
      });
    }
  }
}

我在地图上有一个“空闲”侦听器,所以理论上,在它找到方向并显示它们之后,我会增加 1,所以我们移动到下一个地标,并且 GetNext 设置为 1,所以我们调用再次指示。

此刻它咆哮起来,IE8(我们的 IT 部门允许我们使用的唯一浏览器)说脚本运行缓慢。我有一种感觉,使用这个循环,它无法听到响应。

编辑 - 抱歉,应该提到,在同一页面上还有一张显示结果的地图。它在只处理一个(在这个循环之外)时确实有效,而目前这个循环只处理三个(因此是 while(i<3))。这样做的目的是处理大量地标,我可以毫无问题地获得 KML 文件中的地标数量。

4

1 回答 1

0

解决了。我没有增加空闲侦听器上的所有内容,而是让空闲侦听器调用移动到下一个点的过程。相关代码:

这会将 KML 文件放入 Google 地球 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,但我将只使用 PlaceMarks 长度:

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;
  }
}

在 Maps API 的空闲侦听器上,它再次调用 GetDir 函数,因此本质上它是第一次调用,并且只要它空闲,就会再次调用,直到我们停止处理它。

基本上,我构建它的目的(对于那些还没有解决它的人)是为了让我可以找到离我点击的地标最近的地标。使用一些额外的代码,它可以让我绕过 KML 文件的地标,从选定的地标开始。

因此,对于任何想要从您的硬盘驱动器路由 KML 文件的方法的人,请使用 Google 地球插件和 Google 地图插件创建一个页面。如上所述,将 KML 加载到 Google 地球中,然后使用 Google 地图和空闲侦听器循环浏览。

于 2013-04-09T08:52:10.197 回答