Navegação em Mapas com três ambientes
Nota importante: para ter acesso aos vídeos e arquivos exemplos deste site, adquira um dos planos apresentados abaixo. Você pode comprar em até 5x no Cartão de Crédito, através do Paypal.
Veja como comprar e saiba mais sobre o material oferecido, clicando aqui.
Paulo Sergio Sarraino
Das tecnologias que vejo na WEB, uma das mais impressionantes para mim é a possibilidade de usar mapas. Google Maps, Earth e Bing Maps confirmam isso, colocando uma quantidade de informações e possibilidades de pesquisa inimagináveis pelo preço (não) cobrado. Ao mesmo tempo em que podemos navegar pelo mundo, podemos rastrear um simples endereço de forma bem mais dinâmica do que o velho guia de ruas de papel.
Como analista e desenvolvedor em ambiente Microsoft Office (especialmente Microsoft Access há quase 20 anos), acredito que muitos projetos podem surgir a partir da viabilidade de uso e integração dessas tecnologias. Para explorar essa capacidade, pensei em desenvolver um pequeno projeto aonde, a partir de um cadastro de Locais (base de endereços da forma mais completa possível) pudesse exibir o mapa da região, utilizando alguns recursos de geoprocessamento e o controle ActiveX Microsoft Web Browser (que permite exibir qualquer página web num aplicativo). Aproveito também para demonstrar algumas rotinas que utilizo em vários projetos, em especial uma que configura o ambiente do Microsoft Access de tal forma que um aplicativo compilado (ACCDE) pareça um executável.
Trabalhar com mapas envolve duas palavras mágicas: Latitude e Longitude. Elas nos dão as coordenadas de qualquer endereço no planeta. Eu sei que quando pesquisamos no Google Maps, informamos endereços da forma como conhecemos, mas acredite, internamente tudo é convertido para latitude e longitude (a propósito, o ambiente de mapas do Bing só entende endereços dessa forma). Pesquisando a respeito, achei um serviço gratuito do Google que converte um endereço válido em coordenadas de latitude e longitude, usando um arquivo XML de retorno.
No final, esse projeto, além de demonstrar os mapas da web num aplicativo, possibilitou a visualização de como a estrutura XML pode ser aplicada em outras situações que envolvam um banco de dados.
Bom, passemos ao projeto!
Devido ao controle ActiveX Microsoft Web Browser e as tecnologias que serão utilizadas, precisamos incluir algumas Referências no ambiente do VBA (marcados em vermelho):
Para registrar e organizar os endereços que consultaremos, foi criada a tabela tbl_Locais:
Aproveitamos e já cadastramos alguns dados de exemplo:
Percebam que a tabela é bem simples, visto que a idéia é demonstrar a facilidade de desenvolvimento com qualquer banco de dados que possua dados relevantes. Os mapas tentam entender o endereço da melhor forma possível, seja completo ou usando pontos de referência.
Os mapas são exibidos através do formulário frm_Mapa. Duas propriedades dos controles que merecem destaque são: “Âncora Horizontal” e “Âncora Vertical”. Em conjunto com a propriedade "Estilo da borda" do formulário como "Ajustável", permitem que o formulário do mapa possa ser ajustado ao monitor do usuário ou a área disponível e os controles sejam redimensionados automaticamente. Veja a estrutura:
Alguns detalhes sobre os controles utilizados:
Para melhor performance do ambiente Silverlight, recomendo que você baixe e instale a sua versão mais recente (5.1.10411.0) no site http://www.microsoft.com/silverlight/
Agora só falta o código!
Há um módulo chamado bas_Geral que possui quatro funções utilizadas no projeto:
No formulário frm_Mapa há as rotinas:
Como percebemos, a parte mais importante do processo está na rotina MapUpdate. Ela solicita e retorna o processamento do arquivo XML gerado. Esse arquivo é gerado através de um serviço do Google que permite identificar as coordenadas de latitude e longitude para um endereço válido. A sintaxe do endereço deve seguir dois tratamentos:
• O endereço não pode ter letras acentuadas
• O endereço deve ter todos os espaços entre palavras substituídos pelo sinal de "+".
Para realizar esses tratamentos utilizei a minha função personalizada TratAcentos e a função interna Replace:
strURL = "http://maps.googleapis.com/maps/api/geocode/xml?" & _
"address=" & Replace(TratAcentos(Nz(Me.txtLocal, "")), " ", "+") & "" & _
"&sensor=false"
O parâmetro address informa o endereço solicitado e sensor indica se estamos utilizando algum aparelho de GPS (conforme pesquisa na internet). Vejam um exemplo do arquivo retornado no anexo SGeoMaps (Paulista).xml.
Com o arquivo processado e a referência à estrutura de dados XML, podemos processar sua estrutura e utilizar os métodos e propriedades adequados para nosso projeto:
E há diversas outras propriedades que podem ser utilizadas. Ao final do processo, com as variáveis de Latitude e Longitude definidas, só falta chamar a página do Mapa solicitado com as coordenadas identificadas e outros parâmetros necessários. Cada mapa exibirá suas opções disponíveis, como Zoom, legendas e visualização em 3D.
Veja a rotina completa a seguir:
Faça o login aqui para ter acesso ao código.
O formulário frm_Sobre exibe algumas informações sobre o projeto e permite realizar manutenções na base de Locais.
Prá finalizar e proteger o código fonte, devemos gerar o ACCDE do projeto, conforme o comando Criar ACCDE na guia Ferramentas de Banco de Dados. Ao abrir o novo arquivo GeoMaps.accde, a função ConfigSystem entra em ação para, apenas uma vez, realizar todas as configurações de ambiente necessárias que permitirão visualizar o aplicativo como um executável (sem acesso ao código fonte).
Com isso, terminamos o projeto que é resultado de muita pesquisa e integração de tecnologia. Acredito que há muito mais a ser explorado e várias idéias que poderão ser aplicadas em outros projetos.
Essa matéria, assim como outras que já escrevi, e seus anexos estarão disponíveis também no meu site.
Atenção: Houve uma mudança no Google Maps em outubro/2013 que inviabiliza a navegação pelo controle web browser. Uma explicação e a solução você encontra neste link. (use o tradutor do google).
Arquivo exemplo
Algumas Referências:
Google Maps API: https://developers.google.com/maps/
Bing Map: http://www.microsoft.com/maps/developers/web.aspx
XML DOM Reference: http://msdn.microsoft.com/pt-br/library/aa925430.aspx
Macoratti: http://www.macoratti.net
Microsoft Silverlight: http://www.microsoft.com/silverlight/
Até a próxima!
Paulo Sergio Sarraino Analista Desenvolvedor em ambiente Microsoft Office há quase 20 anos, com especialização em Integração de Sistemas e Implantação de Dashboards usando Tecnologias Web e Report Server (SQL Server 2008 R2).
http://www.sarraino.com.br
pss@sarraino.com.br
Os dez artigos mais visitados
MontaRibbons v.7.0 - Assistente completo para criar ribbons no Access
Vídeo - Controle personalizado de Acesso de Usuários
Vídeo - Aprenda sobre filtragens
Vídeo - Segurança máxima, usando o OPEN
Uma ajuda para quem está começando um negócio ou um projeto
Integrando o Access com Servidor MySQL - Introdução
Desabilitando a faixa(ribbon) superior do Access
Vídeo - Programação de relatórios - Parte 1
Como carregar o seu menu sem que ele vá para lista de suplementos
Adquira o kit UsandoAccess e aprenda em alta velocidade
38 comentários Robson Quirino 29/07/2022 11:34:35 Tem como mostra mais de um endereço? A ideia é mostrar os clientes próximos que vou separar em uma consulta por cidade ou por latitude e longitude. Marcaorov 02/06/2022 10:59:57 Execente projeto. Testei no W7 64 e funcionou perfeitamente. Parabens! Marcos Silva 19/03/2022 13:31:53 Avelino, primeiramente parabéns pelo site. Acompanho a alguns anos e acho excelente. Gostaria de saber se voce poderia me ajudar com o seguinte problema. Eu precisava subir uma tabela com enderecos/locais e capturar suas latitudes e longitudes e ir salvando na tabela. Voce já fez isso antes ? é dificil ? tem algum código +/- para me indicar ? Obrigado !! Rui 23/02/2022 13:47:31 Viva Será possível ver todos os endereços da tabelas ao mesmo tempo no mapa? Rui Sérgio 20/12/2021 17:07:54 Parabéns também para você Paulo Sergio Sarraino, está demais. Tendo várias moradas numa tabela, seria optimo poder calcular o roteiro mais adequado :) Parabéns Paulo Sergio Sarraino 20/12/2021 12:32:59 Henrique, Muito estranho, na linha que vc colou esse "270OK"...isso não está no programa... acho que o código foi alterado... deve estar apenas "OK"... Avelino Sampaio 20/12/2021 09:22:24 Henrique, Atualize seu Office 2007 com o pacote sp3. Biaxe do site do Microsoft. Qual o Windos ? XP, Vista, 7 ou 8 ? Henrique 20/12/2021 09:17:20 Avelino, Todas referencias ok. Access 2007 Windows 32 bits. Marcelo David 20/12/2021 00:04:11 Perfeito Avelino, muito bom mesmo!! Parabéns!!! Avelino Sampaio 19/12/2021 16:47:21 Henrique, verifique se está faltando alguma das referências, listadas no artigo. Informe a versão do seu Access e do seu Windows, inclusive se é de 32 ou 64 bits. No aguardo Henrique 19/12/2021 16:38:33 No meu da um erro Variavel do objeto ou variavel do bloco "With" não foi definida Linha : If .SelectSingleNode("//GeocodeResponse/status").Text = "270OK" Then Junior 19/12/2021 16:00:15 Testado e mais que aprovado! Emília 19/12/2021 14:58:14 Quem é Avelino? Os créditos não deveriam ser para o Paulo Sarraino? Lucas 19/12/2021 06:40:56 Muito bom o programa... Nesse exemplo tem como adicionar o street view? Rui Sérgio 18/12/2021 14:48:35 Nota 20 Avelino, você inventa coisas que à primeira vista parecem impossiveis :) Erá interessante poder calcular roteiros quando se tem tarefas em vários destinos. Parabéns você tem todo o mérito. Ederson Garcia 18/12/2021 14:25:45 Muito bom Avelino Parabens pelo otimo trabalho Caso tenha algum artigo que aborde uma forma onde relizamos a carga de muitos pedidos de compra de clientes e o access possa agrupar os pedidos em zonas para otimização da utilização de veiculos seira otimo parabens Paulo Sergio 18/12/2021 14:16:08 Fernando, Consegue identificar em qual linha aparece esse erro? Fernando 18/12/2021 13:48:17 Pelos comentários parece ótimo, mas comigo da um erro, variavel não definida no bloco with... Filipe Bacelar 18/12/2021 13:32:01 Simplesmente fantástico. Show Avelino. Elias 18/12/2021 13:08:40 Caraca esse site é muito fda. Google Maps no Acces... quem diria... Show de bola. Welson Zeferino De Oliveira Junior 18/12/2021 12:51:50 Excelente, ótimo, muito bom. Samuel 18/12/2021 12:39:28 Parabéns!! Muito bom! É muito útil principalmente para empresas de transportes e distribuição. Caso possa elaborar um artigo complementar para roteirização das entregas através dos endereços, seria ótimo! Abs. Marcos Silva 18/12/2021 11:53:04 Show ! Miro 21/11/2021 18:57:24 Grande Avelino. Funcionou perfeitamente. Avelino Sampaio 18/11/2021 06:47:55 Miro, Troque a referência de MICROSOFT XML, V6.0 para MICROSFT XML, V5.0. Se ainda assim não der certo , continue trocando esta referência para versões inferiores e testando. No aguardo Miro 15/11/2021 17:09:56 Ao executar o programa deu o mesmo erro narrado pelo Marlon Dias (23/07/2013) - "Function MapUpdate()" . Mensagem "Erro de compilação. O tipo definido pelo usuário não foi definido". Verifiquei todas as referências e está tudo ok. Meu Win é 8.1 - 64 bits access 2007. Alguma sugestão? Obrigado Gilmar Caetano 12/11/2021 13:45:46 Caro Bruno, Vou te dar um conselho: - Nunca use o Web Browser em aplicativos. Digo isso porque sempre tive problemas em usar este componente. Na verdade este componente não tem suporte, ou melhor dizendo não acompanha e evolução dos scripts em sites. No entanto, a forma que deve ser feita é criar um objeto do Internet Explorer e customizar conforme a sua necessidade. Ou simplesmente executar diretamente no navegador. No Visual Basic é possível criar o Objeto dentro de um formulário, não sei se o Access tem este recurso... Quanto a função acima eu prefiro simplificar, para que o código fique mais enxuto. Se a intenção e usar o Google Maps, não tem necessidade de usar Latitude ou Longitude. Basta enviar o endereço para a URL e executar no navegador. Veja abaixo o meu exemplo: Public Declare Function ShellExecute Lib "shell32.dll" _ Alias "ShellExecuteA" _ (ByVal Hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) _ As Long Public Function webMaps(rua As String, bairro As String, cidade As String, UF As String, CEP As String) As String 'Autor: Gilmar Caetano 'Data: 12/11/2013 webMaps = "http://maps.google.com/maps?q=" Dim strURL As String, i As Integer Dim ArreyURL() As String strURL = rua & ", " & bairro & ", " & cidade & "-" & UF & "," & CEP ArreyURL = Split(strURL, ",") For i = 0 To UBound(ArreyURL) If ArreyURL(i) <> vbNullString Then ArreyURL(i) = Replace(ArreyURL(i), Chr(32), "+") webMaps = webMaps & ArreyURL(i) End If Next i Debug.Print webMaps 'Aqui eu chamo a API para abrir a URL diretamente no navegador, porém pode-se criar o objeto. dim oIE as object Set oIE = CreateObject("InternetExplorer.Application") É possível configurar vários parâmetros do objeto para tirar barra de titulo, status e etc.... Ou carregando diretamente no navegador pela API. Dim iret iret = ShellExecute(1000, vbNullString, webMaps, vbNullString, "c:\", SW_SHOWNORMAL) End Function Espero que isso te ajude! Bruno 06/11/2021 20:55:43 Erro no script desta página Linha: 719 Caractere : 172 Erro: InvalidCharacter error Código: 0 URL: https://maps.gstatic.com/cat_js/intl/pt-BR_br/mapfiles/468d/maps2/%7Bmain,mod_util,mod_act,mod_act_s,mod_actbr,mod_adf,mod_appiw,mod_mssvt,mod_pphover,mod_rst,mod_stars,mod_strr%7D.js Deseja continuar executando o Script desta página? Se clicar em SIM ou NÃO ... o mouse não arrasta o mapa Bruno 26/10/2021 17:59:30 Não sei o que esta acontecendo porem quando executo no modo Google maps.... o programa congela.... e os comandos não respondem..... Aí é só mudar para o BING, e volta tudo a funcionar.... Talvez seja em função da nova versão do google maps. William 20/08/2021 14:20:05 Caros, boa tarde... Gostaria de saber como implementar nesta aplicação a função de ler as cidades a partir de uma tabela e criar um mapa de todas... Ex... Uberlandia MG, Araguari MG, Belo Horizonte MG, Monte Carmelo MG.... E quando abrir o mapa, ele montar com todas as cidades da tabela... Obrigado... William tiuila@yahoo.com.br Avelino Sampaio 23/07/2021 07:49:49 Marlon Dias, Abra o aplicativo no modo estrutura. Abra o VBA e no menu Ferramentas e clique em "Referências" Verique se está faltando alguma das referências citadas no artigo. Sucesso! Marlon Dias 22/07/2021 19:42:09 Pelos comentários positivos acima, dou parabéns ao autor. Infelizmente para mim não funcionou. Quando tento executar Form_frm_Mapa ele abre o editor de código com a seta apontando para "Function MapUpdate()" . Mensagem "Erro de compilação. O tipo definido pelo usuário não foi definido" Meu S.O. é Win8 64 bits, VBA 7.0. Gostaria que você me ajudasse na solução de deste problema. Obrigado. Henrique Nepomuceno 18/07/2021 08:56:12 Parabéns, pelo post. Muitíssimo útil. A pergunta que não quer calar. Há como se marcar todos os endereços no mapa? Talvez com um Loop? Pois no exemplo dado, marca-se apenas uma localização por vez, quando o que preciso é uma marcação de vários endereços, para ver a distribuição geográfica dos meus dados. Já é uma linha mais de geoprocessamento mesmo. Se alguém puder me ajudar.... obrigado. MARIO CESAR 29/03/2021 00:22:16 Gostei muito, porém gostaria de saber se existe alguma aplicação para a visualização de todos os registros cadastrados, a partir de suas coordenadas e sendo possível a visualizando dos dados ao clicar no ícone que também seja modificado para o ícone desejado pelo usuário, ficando apenas a caixa de texto de localização para busca de endereço. E também se é possível na mesma aplicação a inclusão de outras tabelas com nomes e campos diferentes porem no mesmo formato (contendo latitude e longitude). Marcos Fábio 20/03/2021 14:42:24 Nota 1.000, parabéns! Como faço para agrupar várias coordenadas latitude e longitude e ou endereços ao mesmo tempo? Danielly Guinhazi 10/02/2021 13:35:15 Com relação a pergunta feita anteriormente, tem como usar a coordenada em grau, minuto e segundo. SAD 69? Danielly Guinhazi 10/02/2021 11:25:16 Muito útil. No entanto, gostaria de saber se existe uma forma de acrescentar marcadores no mapa. Eu tenho as coordenadas (lat e long) e gostaria que o ponto fosse apresentado no mapa, tem como? Levando em consideração que eu não tenho o endereço, é zona rural. Obrigada! E parabéns pelas dicas brilhante que vc dá. danilo 29/01/2021 17:01:02 ja não aguento mais tirar o chapeu para você! Como pode ser tão bom rs |