アップデート:
拡張ライブラリをリリースしました: https://bitbucket.org/mutopia/earth
https://bitbucket.org/mutopia/earth/src/master/sample/index.htmlを参照して実行してください。
サンプル コード クラスの drag() メソッドを参照してください。このメソッドは、setDragMode()
とを呼び出しaddDragEvent()
て、 のドラッグを有効にしKmlPolygon
ます。
私は、earth-api-utility-library のtakeOverCameraと 3 つのイベントを使用して、これを正常に実装しました。
setDragMode: function (mode) {
// summary:
// Sets dragging mode on and off
if (mode == this.dragMode) {
Log.info('Drag mode is already', mode);
} else {
this.dragMode = mode;
Log.info('Drag mode set', mode);
if (mode) {
this.addEvent(this.ge.getGlobe(), 'mousemove', this.dragMouseMoveCallback);
this.addEvent(this.ge.getGlobe(), 'mouseup', this.dragMouseUpCallback);
this.addEvent(this.ge.getView(), 'viewchange', this.dragViewChange, false);
} else {
this.removeEvent(this.ge.getGlobe(), 'mousemove', this.dragMouseMoveCallback);
this.removeEvent(this.ge.getGlobe(), 'mouseup', this.dragMouseUpCallback);
this.removeEvent(this.ge.getView(), 'viewchange', this.dragViewChange, false);
}
}
},
これは、はるかに大きなプロジェクト内のユーティリティ ライブラリにあります。dragMode
イベントを追加および削除するブール値です。これら 3 つのイベントは、ドラッグしたときの動作を制御します。addEvent
そしてremoveEvent
、私自身のラッパー関数です:
addEvent: function (targetObject, eventID, listenerCallback, capture) {
// summary:
// Convenience method for google.earth.addEventListener
capture = setDefault(capture, true);
google.earth.addEventListener(targetObject, eventID, listenerCallback, capture);
},
removeEvent: function (targetObject, eventID, listenerCallback, capture) {
// summary:
// Convenience method for google.earth.removeEventListener
capture = setDefault(capture, true);
google.earth.removeEventListener(targetObject, eventID, listenerCallback, capture);
},
些細なことは無視して、すべての重要なものはそれらのイベントへのコールバックにあります。イベントはカメラをロックし、mousedown
ドラッグしているポリゴンを設定しますdragObject
(これは私が使用している単なる変数です)。元の緯度経度座標を保存します。
this.dragMouseDownCallback = lang.hitch(this, function (event) {
var obj = event.getTarget();
this.lockCamera(true);
this.setSelected(obj);
this.dragObject = obj;
this.dragLatOrigin = this.dragLatLast = event.getLatitude();
this.dragLngOrigin = this.dragLngLast = event.getLongitude();
}
mousemove
コールバックは、最新の緯度経度座標に更新されます。
this.dragMouseMoveCallback = lang.hitch(this, function (event) {
if (this.dragObject) {
var lat = event.getLatitude();
var lng = event.getLongitude();
var latDiff = lat - this.dragLatLast;
var lngDiff = lng - this.dragLngLast;
if (Math.abs(latDiff) > this.dragSensitivity || Math.abs(lngDiff > this.dragSensitivity)) {
this.addPolyCoords(this.dragObject, [latDiff, lngDiff]);
this.dragLatLast = lat;
this.dragLngLast = lng;
}
}
});
ここでは、あまりにも頻繁に更新されるのを防ぐために、派手な感度値を使用しています。最後にaddPolyCoords
、多角形の既存の座標に緯度経度値を追加する独自の関数でもあります - 効果的に地球上を移動します。これは、座標ごとに組み込み関数setLatitude()
と関数を使用して行います。ポリゴンがオブジェクトsetLongitude()
である場合、次のように座標を取得できます。KmlPolyon
polygon.getGeometry().getOuterBoundary().getCoordinates()
そしてもちろん、mousedown
コールバックはドラッグ モードをオフにして、マウスを動かしてもポリゴンがドラッグされ続けないようにします。
this.dragMouseUpCallback = lang.hitch(this, function (event) {
if (this.dragObject) {
Log.info('Stop drag', this.dragObject.getType());
setTimeout(lang.hitch(this, function () {
this.lockCamera(false);
this.setSelected(null);
}), 100);
this._dragEvent(event);
this.dragObject = this.dragLatOrigin = this.dragLngOrigin = this.dragLatLast = this.dragLngLast = null;
}
});
そして最後に、_dragEvent
最終的な座標がマウス イベントが終了した実際の座標であることを確認するために呼び出されます (最新のmousemove
呼び出しではありません)。
_dragEvent: function (event) {
// summary:
// Helper function for moving drag object
var latDiff = event.getLatitude() - this.dragLatLast;
var lngDiff = event.getLongitude() - this.dragLngLast;
if (!(latDiff == 0 && lngDiff == 0)) {
this.addPolyCoords(this.dragObject, [latDiff, lngDiff]);
Log.info('Moved ' + latDiff + ', ' + lngDiff);
}
},
mousemove
コールバックはそれほど重要ではなく、実際には無視できます。これを使用する唯一の理由は、ユーザーがマウスを動かしたときにポリゴンが動くことを示すためです。削除すると、マウスを持ち上げたときにオブジェクトが移動します。
この信じられないほど長い回答から、Google Earth API でドラッグを実装する方法についての洞察が得られることを願っています。また、将来、問題を解決したら、ライブラリをリリースする予定です :)