Integração do AMap em Projetos Vue.js

Para integrar o AMap em projetos Vue, utilizamos os seguintes plugins:

['AMap.InfoWindow', 'AMap.Marker', 'AMap.Polyline', 'AMap.Icon']

Esses componentes permitem criar marcadores, rotas, janelas informativas e ícones personalizados.

Estratégia de implementação:

Pontos intermediários são armazenados num array dinâmico para flexibilidade. Rotas e pontos fixos são reconfigurados apenas quando os dados mudam. Ícones de veículos são dimensionados via AMap.Icon.

Destruição do mapa no ciclo de vida:

    beforeDestroy() {
        this.map.clearEvents('click');
        this.map.destroy()
    },

Inicialização do mapa:

import AMapLoader from '@amap/amap-jsapi-loader';

        inicializarMapa() {
            AMapLoader.load({
                key: "",
                version: "2.0",
                plugins: ['AMap.InfoWindow', 'AMap.Marker', 'AMap.Polyline', 'AMap.Icon'],
            }).then((AMap) => {
                this.mapa = new AMap.Map("mapaContainer", {
                    viewMode: "2D",
                    zoom: 14,
                    center: [121.373811, 31.26834],
                })
                this.configurarEventos();
                this.adicionarMarcadores();
                this.configurarRotas();
                this.criarJanelas();
                this.atualizarDados(this.dadosVeiculo, this.dadosPlanejamento);
            }).catch(() => {
                console.error("Falha no carregamento do mapa");
            });
        },

Configuração de rotas com Polyline:

        configurarRotas() {
            this.rotaVeiculo = new AMap.Polyline({
                mapa: this.mapa,
                opacidade: 1,
                cor: "#00CC33",
                espessura: 4,
                juncao: 'round',
            });
            this.rotaPlanejada = new AMap.Polyline({
                mapa: this.mapa,
                cor: '#95A4BA',
                opacidade: 1,
                espessura: 4,
                estilo: 'tracejado',
            });
        },

Gerenciamento de marcadores:

        adicionarMarcadores() {
            this.marcadorInicial = new AMap.Marker({
                mapa: this.mapa,
                posicao: [121.373811, 31.26834],
                icone: require('@/assets/img/icone_inicio.png'),
                ancora: 'centro-base',
            })
            this.marcadorVeiculo = new AMap.Marker({
                mapa: this.mapa,
                zIndex: 12,
                posicao: [121.373811, 31.26834],
                icone: new AMap.Icon({
                    imagem: require('@/assets/img/icone_veiculo.png'),
                    tamanho: [48, 24],
                }),
                ancora: 'esquerda-meio',
            });
            this.marcadorFinal = new AMap.Marker({
                mapa: this.mapa,
                posicao: [121.373811, 31.26834],
                icone: require('@/assets/img/icone_fim.png'),
                ancora: 'centro-base',
            });
        },
        
        adicionarPontosIntermediarios() {
            this.dados.pontosIntermediarios.forEach((ponto, indice) => {
                const { longitude, latitude, nome, endereco } = ponto
                let marcador = new AMap.Marker({
                    mapa: this.mapa,
                    posicao: [longitude, latitude],
                    icone: require('@/assets/img/icone_intermediario.png'),
                    deslocamento: new AMap.Pixel(-13, -30),
                });
                marcador.on('click', () => this.exibirInfoJanela(ponto));
            });
        },

Configuração de janelas informativas:

        criarJanelas() {
            this.janelaVeiculo = new AMap.InfoWindow({
                personalizada: true,
                fecharAoClique: true,
                conteudo: '',
                deslocamento: new AMap.Pixel(42, -25),
            });
            this.janelaPadrao = new AMap.InfoWindow({
                fecharAoClique: true,
                conteudo: '',
                deslocamento: new AMap.Pixel(0, -16),
            });
        },

Cálculo de ângulo de rotação:

        calcularAngulo(pontoOrigem, pontoDestino) {
            let radianos = Math.atan2(
                pontoDestino[1] - pontoOrigem[1], 
                pontoDestino[0] - pontoOrigem[0]
            );
            let angulo = radianos * 180 / Math.PI;
            if (angulo < 0) angulo += 360;
            if (pontoDestino[1] < pontoOrigem[1]) angulo += 180;
            return Number(angulo);
        },

Atualização dinâmica de dados:

        atualizarDados(dadosVeiculo, dadosRota) {
            this.janelaVeiculo.fechar();
            this.janelaPadrao.fechar();
            
            this.rotaVeiculo.setPath(dadosVeiculo);
            this.marcadorInicial.setPosition(dadosVeiculo[0]);
            
            if (dadosRota.length) {
                this.rotaPlanejada.setPath(dadosRota);
                this.marcadorFinal.setPosition(dadosRota[dadosRota.length - 1]);
                this.marcadorVeiculo.setPosition(dadosRota[0]);
                this.marcadorVeiculo.setAngulo(
                    this.calcularAngulo(dadosRota[0], dadosRota[1])
                );
            } else {
                this.marcadorFinal.setPosition(dadosVeiculo[dadosVeiculo.length - 1]);
                this.marcadorVeiculo.setPosition(dadosVeiculo[dadosVeiculo.length - 1]);
                this.marcadorVeiculo.setAngulo(
                    this.calcularAngulo(
                        dadosVeiculo[dadosVeiculo.length - 2], 
                        dadosVeiculo[dadosVeiculo.length - 1]
                    )
                );
            }
            this.mapa.setCenter(dadosVeiculo[dadosVeiculo.length - 1], true);
            this.mapa.ajustarVisualizacao();
        }

Verificação de coordenadas em rotas:

        verificarCoordenadasNaRota(coordenadas, rota, tolerancia) {
            return AMap.GeometryUtil.isPointOnLine(coordenadas, rota, tolerancia);
        }

Tags: AMap Vue.js javascript Geolocalização DesenvolvimentoWeb

Publicado em 6-29 03:23