Benutzerdefiniertes Schwenken mit ArcGIS Engine

8

Aufgrund einiger Einschränkungen, auf die ich nicht eingehen werde, musste ich ein benutzerdefiniertes Panning in meiner Anwendung implementieren.

In der ArcGIS-API-Referenz wird die Verwendung der folgenden Methoden vorgeschlagen:

IScreenDisplay2.PanStart(IPoint start)    // Starts a pan
IScreenDisplay2.PanMoveTo(IPoint moveTo)  // Moves to a point
IScreenDisplay2.PanEnd()                  // Ends the pan

Jede dieser Methoden wird in den folgenden Ereignishandlern aufgerufen:

IMapControl4.OnMouseDown     // Call PanStart()
IMapControl4.OnMouseMove     // Call PanMoveTo()
IMapControl4.OnMouseUp       // Call PanEnd()

Das alles funktioniert also gut, die Ereignisse werden behandelt, das Schwenken beginnt, alle sind glücklich.

-aber-

Wo der Bildschirm tatsächlich schwenkt, habe ich meinen Cursor nicht gezogen. Die Karte gleitet in einem etwas deterministischen Muster herum, aber ich kann anscheinend nicht herausfinden, wie ich die Aktivitäten der API kompensieren kann. Ich konnte keine aufschlussreiche Dokumentation finden.

Hat jemand Erfahrung mit diesem Teil der API? Beispielcode oder Dokumentation wäre toll!

Brücke
quelle
1
Haben Sie versucht, eine Debug-Anweisung einzurichten , um IDisplayTransformation.DeviceFrame auszudrucken, während die Map jeden Pan abschließt? In der Vergangenheit habe ich festgestellt, dass unter bestimmten Bedingungen die Rahmengröße des Geräts auf einen unangemessenen Wert geändert wird.
Kirk Kuykendall
@Kirk - Das DeviceFrameändert sich beim Schwenken überhaupt nicht. Das ist aber zu erwarten, richtig? Der Geräterahmen ist nur die Größe des Rahmens in Gerätekoordinaten (Pixel)
Brücke
Richtig, es sollte sich nicht ändern. Haben Sie versucht, ITransformEvents.VisibleBoundsUpdated auf der displaytransformation-Instanz anzuhören? Vielleicht wird es zweimal aufgerufen? Haben Sie stattdessen versucht, stattdessen TrackPan aufzurufen ?
Kirk Kuykendall
@ Kirk Kein Glück VisibleBoundsUpdated, zweimal anzurufen . Ich würde verwenden , TrackPan()aber ich muss Griff Mausereignisse fortzusetzen , während Schwenken und sie werden während eines unterdrücktTrackPan
tbridge
Können Sie den Code in den Ereignishandlern veröffentlichen? Beendet das Schwenken OnMouseUp und landet nur an einem unerwarteten Ort? Haben Sie versucht, einen Punkt aus dem X, Y von OnMouseDown und OnMouseUp zu erstellen? Entsprechen sie dem Ort, an dem das Schwenken beginnt und endet?
Jakub Sisak GeoGraphics

Antworten:

2

Ich habe diese @ Version 10 SP 1 ausprobiert, aber sie sollte auf jeder Version funktionieren.

public class PanTool extends BaseCommand implements ITool {
private HookHelper hookHelper = null;
private IScreenDisplay display;

public PanTool()    {
    this.category = "Text";
    this.caption = "Text";
    this.message = "Text";
    this.toolTip = "Text";
    this.name = "Text";
    this.bitmapPath = System.getProperty("user.dir") + "/cmdbitmaps/your_icon.bmp";
    this.enabled = true;
}

@Override
public void onCreate(Object hook)   {
    if (hook == null)
        return;
    try {
        hookHelper = new HookHelper();
        hookHelper.setHookByRef(hook);
    } catch (Exception e)   {
        e.printStackTrace();
    }
}

@Override
public void onClick()   {
    try {
        MapControl map = (MapControl) ((ToolbarControl) hookHelper.getHook()).getBuddy();
        map.setCurrentToolByRef(this);
    } catch (Exception e)   {
        e.printStackTrace();
    }
}

@Override
public void onMouseDown(int button, int shift, int x, int y) throws IOException, AutomationException {
    if(button == 1) {
        MapControl map = (MapControl) ((ToolbarControl) hookHelper.getHook()).getBuddy();
        display = map.getActiveView().getScreenDisplay();

        display.panStart(display.getDisplayTransformation().toMapPoint(x, y));
    }
}

@Override
public void onMouseUp(int button, int shift, int x, int y) throws IOException, AutomationException {
    if(button == 1 && display != null)  {
        display.panStop();
        MapControl map = (MapControl) ((ToolbarControl) hookHelper.getHook()).getBuddy();

        map.getActiveView().refresh();
    }
}

@Override
public void onMouseMove(int button, int shift, int x, int y) throws IOException, AutomationException {
    if(button == 1 && display != null)  {
        display.panMoveTo(display.getDisplayTransformation().toMapPoint(x, y));
    }
}

@Override
public boolean onContextMenu(int x, int y) throws IOException, AutomationException {
    return false;
}


@Override
public boolean deactivate() throws IOException, AutomationException {
    return true;
}

@Override
public int getCursor() throws IOException, AutomationException {
    return esriSystemMouseCursor.esriSystemMouseCursorHand;
}

@Override
public void onDblClick() throws IOException, AutomationException {

}

@Override
public void onKeyDown(int keyCode, int shift) throws IOException, AutomationException {

}

@Override
public void onKeyUp(int arg0, int arg1) throws IOException, AutomationException {

}

@Override
public void refresh(int arg0) throws IOException, AutomationException {

}

}}

Mike
quelle