4

.Net の GEPlugin コントロールを使用して Google Earth でコーディングを始めたばかりですが、まだまだ学ぶことがたくさんあります。

困惑したのは、ポリゴンをドラッグしようとしたときです。

以下のメソッドは、mousemove イベントが発生するたびに呼び出され、ポリゴンの元の形状を維持しながらポリゴンの各ポイントを移動する必要があります。各ポイントの緯度/経度は変更されますが、ポリゴンはマップ上の位置を移動しません。

ポリゴン内のポイントを移動すると再描画されますか?メソッドを呼び出して再描画を強制する必要がありますか?

ありがとう!

private void DoMouseMove(IKmlMouseEvent mouseEvent)
    {
        if (isDragging)
        {
            mouseEvent.preventDefault();

            var placemark = mouseEvent.getTarget() as IKmlPlacemark;

            if (placemark == null)
            {
                return;
            }

            IKmlPolygon polygon = placemark.getGeometry() as IKmlPolygon;


            if (polygon != null)
            {
                float latOffset = startLatLong.Latitude - mouseEvent.getLatitude();
                float longOffset = startLatLong.Longitude - mouseEvent.getLongitude();

                KmlLinearRingCoClass outer = polygon.getOuterBoundary();
                KmlCoordArrayCoClass coordsArray = outer.getCoordinates();

                for(int i = 0; i < coordsArray.getLength(); i++)
                {
                    KmlCoordCoClass currentPoint = coordsArray.get(i);
                    currentPoint.setLatLngAlt(currentPoint.getLatitude() + latOffset, 
                        currentPoint.getLongitude() + longOffset, 0);
                }
            }
        }
    }
4

2 に答える 2

2

これらの問題を解決するために投票することを検討してください

次のリンクでいくつかのヒントを見つけることができます。

http://earth-api-utility-library.googlecode.com/svn/trunk/extensions/examples/ruler.html

于 2011-02-04T14:25:16.690 に答える
1

アップデート:

拡張ライブラリをリリースしました: 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 でドラッグを実装する方法についての洞察が得られることを願っています。また、将来、問題を解決したら、ライブラリをリリースする予定です :)

于 2013-01-22T11:23:55.793 に答える