Como desativar a navegação do mapa no ArcGIS Server JavaScript API v4.x

Nov 16 2020

Na versão 3.x mais antiga do ArcGIS Server JavaScript API, era possível desabilitar a navegação do mapa usando disableMapNavigation()como explicado em Desabilitando mapa no ArcGIS API para Javascript

Qual é o equivalente para desativar a navegação do mapa na versão 4.x do ArcGIS Server JavaScript API? O caso de uso é impedir a navegação do mapa temporariamente, enquanto uma consulta externa está em execução.

O mapView tem uma propriedade de navegação que permite que certos tipos de navegação sejam desabilitados, como no exemplo emhttps://developers.arcgis.com/javascript/latest/sample-code/sandbox/index.html?sample=view-disable-navigation, mas isso não parece permitir que toda a navegação seja desativada.

Por exemplo, mesmo ao usar:

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

o usuário pode deslocar o mapa com o mouse, aplicar zoom com um clique duplo, girar o mapa com o botão direito do mouse, etc.

Respostas

4 DrorBogin Nov 16 2020 at 12:55

Parece desabilitar completamente a navegação no mapa (sob uma condição, como você pediu), você precisaria parar a propagação de eventos de certos eventos.

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

Isso irá parar todos esses eventos, se você deseja desativar um evento de clicar ou arrastar apenas com o botão direito do mouse (no caso de você deseja desativar apenas a rotação, por exemplo), então os eventos click, drage double-clicktambém têm uma propriedade de botão que você pode usar:

Valor Descrição
0 clique com o botão esquerdo (ou toque)
1 clique com o botão do meio
2 clique com o botão direito

* Retirado da visualização da documentação do evento

EDITAR

Depois de perguntar sobre Shift+Left-click+Dragcomo desativar o zoom também, voltei aos documentos e encontrei este exemplo

Aparentemente, você pode adicionar a definição de uma tecla do teclado pressionada ao evento para impedir que o evento borbulhe.

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

Além da excelente resposta de Dror, para evitar que o usuário use os botões Zoom In / Out, você pode criar um widget de Zoom que pode ser removido conforme necessário.

Remova o zoom padrão ao instanciar a visualização usando a palavra-chave ui e não inclua o controle de zoom:

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

Em seguida, adicione / remova um controle de zoom conforme necessário:

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

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

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