Como desativar a navegação do mapa no ArcGIS Server JavaScript API v4.x
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
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();
});
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);