Panning khusus menggunakan ArcGIS Engine

8

Karena beberapa kendala, yang tidak akan saya bahas, saya merasa perlu menerapkan custom panning di aplikasi saya.

Referensi ArcGIS API menyarankan menggunakan metode berikut:

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

Masing-masing metode ini disebut dalam event handler berikut (masing-masing):

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

Jadi semua itu bekerja dengan baik, acara ditangani, panning dimulai, semua orang senang.

-tapi-

Tempat layar sebenarnya bukan tempat saya menyeret kursor saya. Peta tersebut bergeser dalam pola yang agak deterministik, tetapi saya tidak bisa menemukan cara untuk mengkompensasi apa yang dilakukan API. Saya tidak dapat menemukan dokumentasi yang mencerahkan.

Adakah yang punya pengalaman dengan bagian API ini? Kode contoh atau dokumentasi akan sangat bagus!

tbridge
sumber
1
Apakah Anda mencoba mengatur pernyataan debug untuk mencetak IDisplayTransformation.DeviceFrame saat peta melengkapi setiap pan? Di masa lalu, saya perhatikan dalam kondisi tertentu ukuran bingkai perangkat berubah menjadi nilai yang tidak pantas.
Kirk Kuykendall
@Kirk - Tidak DeviceFrameberubah sama sekali saat panning. Itu yang diharapkan, benar? Bingkai perangkat hanya ukuran bingkai dalam koordinat perangkat (piksel)
tbridge
Benar, seharusnya tidak berubah. Apakah Anda mencoba mendengarkan ITransformEvents.VisibleBoundsTerbarui pada contoh tampilantransformasi? Mungkin dipanggil dua kali? Juga, apakah Anda mencoba memanggil TrackPan sebagai gantinya?
Kirk Kuykendall
@Kirk Tidak beruntung dengan VisibleBoundsUpdatedmenelepon dua kali. Saya akan menggunakan TrackPan()tetapi saya harus terus menangani acara mouse saat panning dan mereka ditekan selama aTrackPan
tbridge
Bisakah Anda memposting kode di event handler. Apakah panning menghentikan OnMouseUp dan berakhir di lokasi yang tidak terduga? Sudahkah Anda mencoba membuat poin dari X, Y dari OnMouseDown dan OnMouseUp? Apakah mereka sesuai dengan di mana panning dimulai dan berakhir.
Jakub Sisak GeoGraphics

Jawaban:

2

Saya mencoba ini @ versi 10 SP 1 tetapi harus bekerja pada versi apa pun.

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
sumber