Note that there are some explanatory texts on larger screens.

plurals
  1. POsetAbstractView() prevents mousedown events from propagating to KmlFeatures
    text
    copied!<p>Using the Google Earth plugin, I want to be able to allow the user to select placemarks on the ground while the camera is moving, but am not sure how this is possible. It seems that when you call setAbstractView(), even with the flyToSpeed set to SPEED_TELEPORT, the Google Earth plugin ignores any mouse down events except for those to the GEGlobe. </p> <p>Here's the code, altered slightly (from <a href="http://code.google.com/apis/ajax/playground/#draggable_placemark" rel="nofollow">http://code.google.com/apis/ajax/playground/#draggable_placemark</a>) to illustrate my issue:</p> <pre><code>var ge; var placemark; var dragInfo = null; var la; var lat = 37; var lon = -122; google.load("earth", "1"); function init() { google.earth.createInstance('map3d', initCallback, failureCallback); } function tick() { la.set(lat, lon, 0, // altitude ge.ALTITUDE_RELATIVE_TO_GROUND, 0, // heading 0, // straight-down tilt 5000 // range (inverse of zoom) ); ge.getView().setAbstractView(la); lon = lon + 0.00000001; } 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); // create the placemark placemark = ge.createPlacemark(''); var point = ge.createPoint(''); point.setLatitude(lat); point.setLongitude(lon); placemark.setGeometry(point); // add the placemark to the earth DOM ge.getFeatures().appendChild(placemark); // look at the placemark we created la = ge.createLookAt(''); placemark.setName('Drag Me!'); ge.getOptions().setFlyToSpeed(ge.SPEED_TELEPORT); tick(); // Comment this next line out and the drag works as expected. google.earth.addEventListener(ge, "frameend", tick); // listen for mousedown on the window (look specifically for point placemarks) google.earth.addEventListener(ge.getWindow(), 'mousedown', function(event) { console.log("target type = " + event.getTarget().getType()); if (event.getTarget().getType() == 'KmlPlacemark' &amp;&amp; event.getTarget().getGeometry().getType() == 'KmlPoint') { //event.preventDefault(); var placemark = event.getTarget(); dragInfo = { placemark: event.getTarget(), dragged: false }; } }); // listen for mousemove on the globe google.earth.addEventListener(ge.getGlobe(), 'mousemove', function(event) { if (dragInfo) { event.preventDefault(); var point = dragInfo.placemark.getGeometry(); point.setLatitude(event.getLatitude()); point.setLongitude(event.getLongitude()); dragInfo.dragged = true; } }); // listen for mouseup on the window google.earth.addEventListener(ge.getWindow(), 'mouseup', function(event) { if (dragInfo) { if (dragInfo.dragged) { // if the placemark was dragged, prevent balloons from popping up event.preventDefault(); } dragInfo = null; } }); document.getElementById('installed-plugin-version').innerHTML = ge.getPluginVersion().toString(); } function failureCallback(errorCode) { } </code></pre> <p>​ If you comment out line 56, where tick() is called at each frameend, everything works as in the unaltered code: you can successfully drag the place mark. But when line 56 is in, you can't. So the problem is really with setAbstractView keeping mousedown events from propagating to either the globe or whatever placemark or feature was being clicked. </p> <p>Any ideas? Is there a workaround for this? </p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload