我正在使用Google Earth插件api创建并向用户显示地标。
创建并显示地标的示例代码:
function createPlacemark(){
var polygonPlacemark = ge.createPlacemark('Polygon');
var polygon = ge.createPolygon('');
polygon.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
polygonPlacemark.setGeometry(polygon);
var outer = ge.createLinearRing('');
polygon.setOuterBoundary(outer);
var coords = outer.getCoordinates();
coords.pushLatLngAlt(35.3,33.3544921875,1200);
coords.pushLatLngAlt(35.3,33.3544921875,1200);
coords.pushLatLngAlt(35.3,33.3544921875,1000);
coords.pushLatLngAlt(35.3,33.3544921875,1000);
ge.getFeatures().appendChild(polygonPlacemark);
}
现在,我需要知道用户是否单击了地标(我使用事件监听器来完成),以及他单击的地标中该点的经度,纬度和高度。
问题是Google Earth返回地球表面而不是被点击的地标上的“ click”事件的值。在某些情况下,多边形不在地面上(例如示例代码),并且值不适当。
我试图找到一种方法来获取单击地标时打开的气球的位置,但没有成功。
有没有办法获得这些价值?
编辑:
我正在使用类似于以下简化代码的东西:
<html>
<head>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
var ge;
google.load("earth", "1");
function init() {
google.earth.createInstance('map3d', initCB, failureCB);
}
function initCB(instance) {
ge = instance;
ge.getWindow().setVisibility(true);
}
function failureCB(errorCode) {
}
google.setOnLoadCallback(init);
function createPlacemark(){
var polygonPlacemark = ge.createPlacemark('Polygon');
var polygon = ge.createPolygon('');
polygon.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
polygonPlacemark.setGeometry(polygon);
var outer = ge.createLinearRing('');
polygon.setOuterBoundary(outer);
polygonPlacemark.setDescription('test');
var coords = outer.getCoordinates();
coords.pushLatLngAlt(35.3,33.3544921875,1200);
coords.pushLatLngAlt(35.35,33.3544921875,1200);
coords.pushLatLngAlt(35.35,33.3544921875,1000);
coords.pushLatLngAlt(35.3,33.3544921875,1000);
ge.getFeatures().appendChild(polygonPlacemark);
lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
lookAt.setLatitude(35.33);
lookAt.setLongitude(33.3544921875);
lookAt.setRange(4500);
lookAt.setTilt(45);
lookAt.setHeading(90);
// Update the view in Google Earth
ge.getView().setAbstractView(lookAt);
google.earth.addEventListener(polygonPlacemark , 'click', doEvent);
}
function doEvent(event) {
document.getElementById("alt").value=event.getAltitude();
document.getElementById("lon").value=event.getLongitude();
document.getElementById("lat").value=event.getLatitude();
}
</script>
</head>
<body>
<div id="map3d" style="height: 820px; width: 1680px;"></div>
<button id="bCreatePlacemark" type="button" onclick="createPlacemark()">Create Placemark</button><br>
<input id="lon" /><br>
<input id="lat" /><br>
<input id="alt" />
</body>
</html>
最佳答案
您没有显示如何附加事件处理程序,但是听起来您已将其附加到GEGlobe或GEWindow对象而不是KmlPlacemarks。
要将事件侦听器附加到特定地标,您可以执行类似的操作。
google.earth.addEventListener(polygonPlacemark , 'click', doSomething);
function doSomething(event) {
var lat = event.getTarget().getGeometry().getLatitude();
var lng = event.getTarget().getGeometry().getLongitude();
// do something with lat, lng
}
如果要创建一个“全部捕获”事件处理程序来处理所有地标上的单击事件,则可以使用
GEGlobe
对象,然后使用条件逻辑来筛选地标对象,以完成此操作。google.earth.addEventListener(ge.getGlobe(), 'click', doSomething);
function doSomething(event) {
if (event.getTarget().getType() == 'KmlPlacemark') { //check the event target
var lat = event.getTarget().getGeometry().getLatitude();
var lng = event.getTarget().getGeometry().getLongitude();
// do something with lat, lng
}
}
编辑:
根据您的评论,听起来您想将click事件附加到
polygon
本身,然后提取事件发生的位置。如果是这样,这应该工作。google.earth.addEventListener(polygon , 'click', doSomething);
function doSomething(event) {
var lat = event.getLatitude();
var lng = event.getLongitude();
var alt = event.getaltitude();
// do something with lat, lng, alt
}