.NET: Criando e mostrando rotas com o Google Maps – C#

Recentemente, respondi uma thread nos fóruns do MSDN, cujo caso era mostrar uma rota usando o Google Maps no controle WebBrowser. O problema do inquiridor era um erro de script que acontecia no carregamento do Google Maps. Nós trabalhamos em conjunto e conseguimos resolver!

Daí resolvi postar o código aqui no blog, junto com um demo, pois achei o assunto bem interessante!

Criando rotas com o Google Maps

Segue o código das rotinas mais importantes se você não quiser baixar o projeto:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace HL.GoogleMaps.Rotas
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// Navega para uma rota composta por um ou mais pontos geográficos
        /// </summary>
        /// <param name="points">Um array/coleção contendo uma lista de pontos geográficos necessários para se criar a rota. Os pontos deve estar ordenados do inicial para o final!</param>
        public void NavigateToRoute(IEnumerable<string> points)
        {
            string baseAdress = "https://www.google.com.br/maps/dir/";

            StringBuilder url = new StringBuilder(baseAdress);
            foreach (string point in points)
            {
                url.Append(Uri.EscapeDataString(point));
                url.Append("/");
            }

            webBrowser1.Navigate(new Uri(url.ToString()));
        }

        /// <summary>
        /// Este método serve para corrigir problemas de script relacionados ao WebBrowser, e DEVE ser chamado na inicialização do form!
        /// </summary>
        private void FixBrowser()
        {
            try
            {
                Microsoft.Win32.RegistryKey regDM = null;
                bool is64 = Environment.Is64BitOperatingSystem;
                string KeyPath = "";
                if (is64)
                {
                    KeyPath = "SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION";
                }
                else
                {
                    KeyPath = "SOFTWARE\\Microsoft\\Internet Explorer\\MAIN\\FeatureControl\\FEATURE_BROWSER_EMULATION";
                }

                regDM = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(KeyPath, false);
                if (regDM == null)
                {
                    regDM = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(KeyPath);
                }

                Microsoft.Win32.RegistryKey Sleutel = null;
                if ((regDM != null))
                {
                    string location = System.Environment.GetCommandLineArgs()[0];
                    string appName = System.IO.Path.GetFileName(location);
                    if (regDM.GetValue(appName) == null)
                    {
                        //Sleutel onbekend
                        regDM = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(KeyPath, true);
                        Sleutel = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(KeyPath, Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree);

                        //What OS are we using
                        Version OsVersion = System.Environment.OSVersion.Version;

                        if (OsVersion.Major == 6 & OsVersion.Minor == 1)
                        {
                            //WIN 7
                            Sleutel.SetValue(appName, 9000, Microsoft.Win32.RegistryValueKind.DWord);
                        }
                        else if (OsVersion.Major == 6 & OsVersion.Minor == 2)
                        {
                            //WIN 8
                            Sleutel.SetValue(appName, 10000, Microsoft.Win32.RegistryValueKind.DWord);
                        }
                        else if (OsVersion.Major == 5 & OsVersion.Minor == 1)
                        {
                            //WIN xp
                            Sleutel.SetValue(appName, 8000, Microsoft.Win32.RegistryValueKind.DWord);
                        }

                        Sleutel.Close();
                    }
                }


            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ocorreu um erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Chamada necessária:
            FixBrowser();
        }

    }
}

E abaixo os links:

Download do Demo e o código fonte: HL.GoogleMaps.Rotas.zip

Thread do MSDN mencionada: Erro Google Maps C#

Ah, e se você programa em VB.NET, pode usar este conversor aqui para converter o código!

O código está comentado, então eu acho que dispensa explicações. Até a próxima!

Anúncios

5 comentários

  1. Ótimo relato,
    Gostaria de ver a possibilidade de eu criar vários pontos em uma mesma rota e, ainda se possível, definir qual a melhor rota a ser executada.
    Obrigado.

  2. Boa tarde!

    Muito bom seu programa, gostaria de saber se eu conseguiria extrair a rota gerada para outro form.

  3. Bom dia!
    Estou com problema de acesso negada ao acessar FEATURE_BROWSER_EMULATION. Como Posso resolver isso ?

  4. Muito Obrigado, procuro a dias uma solução para este problema e acredito que este seja o único POST que resolve o problema via código e com eficiência.

Deixe um comentário :)

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s