Cómo deshabilitar la navegación del mapa en la API de JavaScript de ArcGIS Server v4.x

Nov 16 2020

En la versión 3.x anterior de la API de JavaScript de ArcGIS Server, era posible deshabilitar la navegación del mapa usando disableMapNavigation()como se explica en Deshabilitar el mapa en la API de ArcGIS para Javascript.

¿Cuál es el equivalente para deshabilitar la navegación de mapas en la versión 4.x de la API de JavaScript de ArcGIS Server? El caso de uso es evitar la navegación del mapa temporalmente, mientras se ejecuta una consulta externa.

MapView tiene una propiedad de navegación que permite deshabilitar ciertos tipos de navegación, como en el ejemplo enhttps://developers.arcgis.com/javascript/latest/sample-code/sandbox/index.html?sample=view-disable-navigation, pero esto no parece permitir que se deshabilite toda la navegación.

Por ejemplo, incluso cuando se usa:

navigation: {
  gamepad: {enabled: false},
  browserTouchPanEnabled: false,
  momentumEnabled: false,
  mouseWheelZoomEnabled: false
}

el usuario puede desplazar el mapa con el mouse, hacer zoom haciendo doble clic, rotar el mapa con el botón derecho del mouse, etc.

Respuestas

4 DrorBogin Nov 16 2020 at 12:55

Parece que deshabilita completamente la navegación del mapa (bajo una condición, como usted pidió), necesitaría detener la propagación de eventos de ciertos eventos.

view.on(["click", "drag", "double-click", "mouse-wheel", "hold", ], function(event) {
  if(thinking){
    event.stopPropagation();
  }
});

Esto detendrá todos esos eventos, si desea deshabilitar un evento de clic o arrastre solo con el botón derecho del mouse (en caso de que desee deshabilitar solo la rotación, por ejemplo), los eventos click, dragy double-clicktambién tienen una propiedad de botón que puede utilizar:

Valor Descripción
0 clic izquierdo (o toque)
1 clic central
2 clic derecho

* Tomado de la documentación del evento de vista

EDITAR

Después de preguntar sobre la desactivación del Shift+Left-click+Dragzoom también, volví a los documentos y encontré este ejemplo

Aparentemente, puede agregar la definición de una tecla del teclado presionada al evento para evitar que el evento se propague.

view.on("drag", ["Shift"], function(event) {
  event.stopPropagation();
});

view.on("drag", ["Shift", "Control"], function(event) {
  event.stopPropagation();
});
1 StephenLead Nov 16 2020 at 16:14

Además de la excelente respuesta de Dror, para evitar que el usuario use los botones Acercar / Alejar, puede crear un widget de Zoom que luego se puede eliminar según sea necesario.

Elimine el zoom estándar al crear una instancia de la vista con la palabra clave ui y no incluya el control de zoom:

const view = new MapView({
  container: "viewDiv",
  map: map,
  ui: { components: ["attribution"] }
});

Luego agregue / elimine un control de Zoom según sea necesario:

let zoomControl = new Zoom({
  view: view
});

// Enable zoom
view.ui.add(zoomControl, {
  position: "top-left"
});

// Disable zoom
view.ui.remove(zoomControl);