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");
}
}
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.