Prezados leitores,

 

nesse artigo será demonstrado como desenhar um mapa utilizando uma biblioteca chamada Sharpmap com C#.

Nos últimos anos houve um aumento significativo do uso de SIG (Sistemas de Informações Geográficas), principalmente com a expansão do Google, e de um servidor de mapas chamado de Mapserv, sendo este último um software livre, com o foco em desenvolvimento de soluções WebGis, isto é, poderá se feitas consultas e pesquisas aos dados espaciais através da internet utilizando qualquer browser.

            Porém visto a necessidade de acessar os dados tanto em aplicações web como desktop, existiu a necessidade de se procurar outro software para auxiliar nesse processo, e após uma grande pesquisa foi escolhido o Sharpmap.

Sharpmap é uma biblioteca espacial de fácil utilização, podendo ser aplicada a aplicações web e desktop. Ela provê acesso a uma grande quantidade de tipos de dados espaciais, permitindo consultas e renderização de mapas. A biblioteca foi desenvolvida em C# utilizando .Net framework 2.0, além de ser uma biblioteca sob a licença LGPL.

            Abaixo é mostrada uma tela bem simples para visualização dos dados através de Shapefile, sendo este, um conjunto de arquivos que formam um repositório de dados vetoriais. As extensões dos arquivos são: *.shp, *.shx e *.dbf, cada um armazenando informações relevantes da realidade a que buscam mostrar.

 

            Para esse formulário  será preciso:

<!--[if !supportLists]-->·         <!--[endif]-->4 buttons

<!--[if !supportLists]-->·         <!--[endif]-->1 textbox

<!--[if !supportLists]-->·         <!--[endif]-->1 picturebox

 

A primeira coisa a se fazer é criar um projeto, fazer o download da biblioteca Sharpmap e adicioná-la como referência ao novo projeto criado. Após isso, adicione ao projeto uma classe C#.

Após essa classe ter sido criada, vamos adicionar essas linhas de código abaixo:

 

using System.Drawing; // Através disso é permitido retornar imagens

using System.Windows.Forms; //Através desse é possível conseguir o evento do clique do mouse

using SharpMap; //Adiciona as bibliotecas Sharpmap

 

//aqui é a classe mapa, onde é possível ser feita a criação dos mapas

public class Mapa

{

    string nomemapa, caminhomapa;

    SharpMap.Map myMap = new SharpMap.Map(new Size(300, 200)); //essa linha ria o objeto mapa, e declara que o tamanho o  mapa será de 300x200

    const float ZOOM_FACTOR = 0.3f; //diz o valor do zoom inicial

    public Mapa() { }

 

    public Map getMapa()

    {

        return this.myMap;

    }

    public Mapa(string nomemapa, string caminhomapa)

    {

        this.nomemapa = nomemapa;

        this.caminhomapa = caminhomapa;

    }

    public void instanciaMapa(string nomemapa, string caminhomapa)

    {

        //Caso o contrutor tenha sido inicializado como vazio, será necessário chamar esse método passando o nome e o caminho do shapefile a ser exibido

        this.nomemapa = nomemapa;

        this.caminhomapa = caminhomapa;

    }

 

    public Image gerarMapa()

    {

        //como a instância do objeto mapa já foi feita, será apenas configurado o mapa

        myMap.BackColor = Color.White;

        //cor do fundo do mapa

        SharpMap.Layers.VectorLayer myLayer = new SharpMap.Layers.VectorLayer(this.nomemapa);

        //Esta sendo criado o objeto do tipo Layer com determinado nome

        myLayer.Style.Fill = new SolidBrush(Color.Green);

        //será a cor do mapa

        myLayer.Style.Outline = new Pen(Color.Black);

        //aqui está sendo ditto que o mapa terá uma linha contornando ele na cor preta

        myLayer.Style.EnableOutline = true;

        //Essa linha habilita o contorno do mapa

        myLayer.DataSource = new SharpMap.Data.Providers.ShapeFile(this.caminhomapa);

        //aqui determina o caminho físico do shapefile

        myMap.Layers.Add(myLayer);

        //adiciono o layer ao objeto do tipo mapa

        myMap.ZoomToExtents();

        //aqui é exibido o mapa em toda sua extensão.

        return myMap.GetMap();

        //É retornado o mapa, esse método precisa ser do tipo Imagem

    }

    public Image atualizarMapa()

    {

        return myMap.GetMap();

    }

    public Image moverMapa(MouseEventArgs e)

    {

        SharpMap.Geometries.Point ponto = myMap.ImageToWorld(e.Location);

        //nessa linha ele cria um objeto ponto, pegando como valor o click do mouse, e mudando a posição do mapa

        myMap.Center.X = ponto.X;

        myMap.Center.Y = ponto.Y;

        return myMap.GetMap();

    }

    public Image zoomIn()

    {

        myMap.Zoom -= myMap.Zoom * ZOOM_FACTOR;

        return myMap.GetMap();

    }

    public Image zoomOut()

    {

        myMap.Zoom += myMap.Zoom * ZOOM_FACTOR;

        return myMap.GetMap();

    }

    public Image fullExtent()

    {

        myMap.ZoomToExtents();

        return myMap.GetMap();

    }

}

 

            Após a classe ter sido construída, está na hora de fazer os botões funcionarem e instanciar o objeto mapa. Para isso é necessário se criar o formulário e instanciar um objeto do tipo Mapa assim, o código ficará parecido com esse abaixo:

 

using System;

using System.Collections;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using SharpMap;

using System.IO.Ports;

 

namespace TesteSharpMap

{

    public partial class Form1 : Form

    {

        PortaSerial porta = new PortaSerial();

        Mapa myMap = new Mapa();

        public Form1()

        {

            InitializeComponent();

 

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

 

        } 

            Após isso serão feitas as chamadas aos métodos para se criar o desenhar o mapa, o código abaixo é do botão Procurar, que através desse botão será procurar o shapefile no computador e exibido o mapa na tela.

        private void button1_Click(object sender, EventArgs e)

        {

 

            OpenFileDialog arquivo = new OpenFileDialog();

            arquivo.Filter = "Arquivo Shape(*.shp)|*.shp";

            if (arquivo.ShowDialog()==DialogResult.OK)

            {

                textBox1.Text = arquivo.FileName;

                myMap.instanciaMapa("Meu Mapa", textBox1.Text);

                pictureBox1.Image = myMap.gerarMapa();

            }

        }

O resultado de ter clicado nesse botão será o mapa exibido no picturebox, como mostrado na figura abaixo:




            Tendo o mapa já publicado, agora será a vez do botão Zoom In, funcionar, ao clicar nele basta fazer uma chamada ao método zoomIn. Como mostrado abaixo:

        private void zoomin_Click(object sender, EventArgs e)

        {

            try

            {

                pictureBox1.Image = myMap.zoomIn();

            }

            catch

            {

                MessageBox.Show("Mapa não iniciado");

            }

        }

            O outro botão será o zoomOut, o código segue abaixo:

        private void zoomout_Click(object sender, EventArgs e)

        {

            try

            {

                pictureBox1.Image = myMap.zoomOut();

            }

            catch

            {

                MessageBox.Show("Mapa não iniciado");

            }

        }

            E por último será a vez do botão zoomExtent, que através dele é possível visualizar o mapa em toda sua extensão:

        private void zoomfull_Click(object sender, EventArgs e)

        {

 

            try

            {

                pictureBox1.Image = myMap.fullExtent();

            }

            catch

            {

                MessageBox.Show("Mapa não iniciado");

            }

        }

  Tendo feito isso, basta apenas compilar o código e verificar os mapas serem renderizados.

Os próximo artigos mostrarão como conectar a um GPS através de uma porta serial, lê as mensagens NMEA que ele retorna e interpretá-las.