Search code examples
javascriptgoogle-earth-plugin

Google Earth API link.setHref not working when using variable


The variable is getting the correct data but is not working in the href parameter. I added a button with the variable to see it in the browser. If I put the hard code value, which is commented, it works.

<?php
@session_start();
$idcoord = $_GET['search_fd0'];
$kmlpath = "http://nonprasa.t15.org/kml/PR" . $idcoord . "/doc.kml";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title>Google Earth API Sample</title>
<script src="http://www.google.com/jsapi?key=ABQIAAAAuPsJpk3MBtDpJ4G8cqBnjRRaGTYH6UMl8mADNa0YKuWNNa8VNxQCzVBXTx2DYyXGsTOxpWhvIG7Djw" type="text/javascript"></script>
<script type="text/javascript">
      function addSampleButton(caption, clickHandler) {
    var btn = document.createElement('input');
    btn.type = 'button';
    btn.value = caption;

    if (btn.attachEvent)
      btn.attachEvent('onclick', clickHandler);
    else
      btn.addEventListener('click', clickHandler, false);

    // add the button to the Sample UI
    document.getElementById('sample-ui').appendChild(btn);

  }

  function addSampleUIHtml(html) {
    document.getElementById('sample-ui').innerHTML += html;
  }
</script>
<script type="text/javascript">
var ge;

google.load("earth", "1");

function init() {
//  var kmlfile = '\"<?php echo $kmlpath; ?>\"';
 var kmlfile = '<?php echo $kmlpath;?>'; 
  google.earth.createInstance('map3d', initCallback, failureCallback);


  addSampleButton(kmlfile, buttonClick);
}

function initCallback(instance) {
  ge = instance;
  ge.getWindow().setVisibility(true);

  // add a navigation control
  ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);

  // add some layers
  ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, true);
  ge.getLayerRoot().enableLayerById(ge.LAYER_ROADS, true);


  createNetworkLink();

  document.getElementById('installed-plugin-version').innerHTML =
    ge.getPluginVersion().toString();

}

function failureCallback(errorCode) {
}

function createNetworkLink() {
  var networkLink = ge.createNetworkLink("");
  networkLink.setDescription("NetworkLink open to fetched content");
  networkLink.setName("Open NetworkLink");
  networkLink.setFlyToView(true);

  // create a Link object
  var link = ge.createLink("");
 //link.setHref("http://nonprasa.t15.org/kml/PR0302013/doc.kml);

  link.setHref (kmlfile);


  // attach the Link to the NetworkLink
  networkLink.setLink(link);

  // add the NetworkLink feature to Earth
  ge.getFeatures().appendChild(networkLink);

    // look at the placemark we created
  var la = ge.createLookAt('');
  la.set(18, -67,
    0, // altitude
ge.ALTITUDE_RELATIVE_TO_GROUND,
0, // heading
0, // straight-down tilt
1500 // range (inverse of zoom)
);
  ge.getView().setAbstractView(la);

}

function buttonClick() {
// Get the current view.
var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);

// Zoom out to x times the current range.
lookAt.setRange(lookAt.getRange() * 5.0);

// Update the view in Google Earth.
ge.getView().setAbstractView(lookAt);
}

</script>
  </head>
  <body onload="init()" style="font-family: arial, sans-serif; font-size: 8px; border: 0;">
    <div id="sample-ui"></div> 
    <div id="map3d" style="width: 1200px; height: 800px;"></div>
    <br>
    <div>Installed Plugin Version: <span id="installed-plugin-version" style="font-weight: bold;">Loading...</span></div>
  </body>


Solution

  • The javascript variable kmlfile is local to the init function, so it is always going to be undefined when you attempt to use it in the createNetworkLink function.

    To highlight what I mean take a look at the following, I have removed the other code for clarity...

    function init() {
      var kmlfile = '<?php echo $kmlpath;?>'; // kmlfile defined here
    }
    
    function createNetworkLink() {
      link.setHref(kmlfile); // kmlfile is undefined here
      alert(kmlfile); // this would have told you as much...
    }
    

    To fix it you could make kmlfile a global variable so that it is available within the scope of the createNetworkLink function. To do this simply create the variable outside the init method,, just like you have with your ge variable.

    Again, take a look at the following with other code removed for clarity.

    <script type="text/javascript">
    var ge;
    var kmlfile; // kmlfile defined here
    
    function init() {
      kmlfile = '<?php echo $kmlpath;?>'; // set the variable 
    }
    
    function createNetworkLink() {
      link.setHref(kmlfile); // kmlfile is now available here
    }
    </script>