Panorámica personalizada con ArcGIS Engine

8

Debido a algunas restricciones, a las que no entraré, me he visto en la necesidad de implementar una panorámica personalizada en mi aplicación.

La referencia de la API de ArcGIS sugiere utilizar los siguientes métodos:

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

Cada uno de estos métodos se llama en los siguientes controladores de eventos (respectivamente):

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

Todo eso funciona bien, los eventos se manejan, comienza el panorama, todos están felices.

-pero-

Donde la pantalla realmente se desplaza no es donde he arrastrado el cursor. El mapa se desliza en un patrón algo determinista, pero parece que no puedo entender cómo compensar lo que está haciendo la API. No he podido encontrar ninguna documentación esclarecedora.

¿Alguien tiene experiencia con esta parte de la API? ¡Un código de muestra o documentación sería genial!

tbridge
fuente
1
¿ Intentó configurar una declaración de depuración para imprimir IDisplayTransformation.DeviceFrame a medida que el mapa completa cada panorámica? En el pasado, he notado que bajo ciertas condiciones el tamaño del marco del dispositivo cambia a un valor inapropiado.
Kirk Kuykendall
@Kirk - El DeviceFrameno cambia en absoluto cuando se desplaza. Sin embargo, eso es de esperar, ¿correcto? El marco del dispositivo tiene el tamaño del marco en las coordenadas del dispositivo (píxeles)
tbridge
Correcto, no debería cambiar. ¿ Intentó escuchar ITransformEvents.VisibleBoundsUpdated en la instancia de displaytransformation ? Tal vez se llama dos veces? Además, ¿intentaste llamar a TrackPan en su lugar?
Kirk Kuykendall
@Kirk No tuve suerte con VisibleBoundsUpdatedllamar dos veces. Me gustaría utilizar TrackPan(), pero tengo que seguir los eventos del ratón mango durante la exploración y que están suprimida durante unaTrackPan
tbridge
¿Puedes publicar el código en los controladores de eventos? ¿La panorámica termina en OnMouseUp y acaba en una ubicación inesperada? ¿Has intentado crear un punto a partir de la X, Y de OnMouseDown y OnMouseUp? ¿Corresponden con dónde comienza y termina la panorámica?
Jakub Sisak GeoGraphics

Respuestas:

2

Probé esta @ versión 10 SP 1 pero debería funcionar en cualquier versión.

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 {

}

}}

Miguel
fuente