ASP .NET - Salvando a posição geográfica atual no SQL Server com Entity Framework (C#)


Hoje eu vou escrever sobre um novo recurso do Entity Framework, disponível a partir da versão 5, (já estamos na versão 6.0) conhecido como Spatial Data ou Dados geográficos.

A versão 5 do Entity Framework, a partir de agora citada apenas como EF5, além de um  novo  modelo de mapeamento Code First (Sem Designer nem XML), nova APi DBContext e  melhorias no desempenho trouxe o recurso  Spatial Data - Dados geográficos agora podem ser expostos em seu modelo usando o DbGeography e os tipos DbGeometry. Com isso podemos ter um campo do tipo DbGeography e através do namespace System.Data.Spatial manipular dados geográficos informando as coordenadas latitude e longitude.

Neste artigo vamos criar uma aplicação ASP .NET Web Forms para salvar a posição geográfica atual do usuário (latitute, longitude) no SQL Server, na coluna com tipo de dados Geography, usando o Entity Framework.

Se você marcar sua posição em um mapa mundi, ela será um simples ponto no mapa. Este ponto é composto por dois componentes : latitude e longitude que informam ao software GPS onde você está.

A partir desta informação outras informações podem ser obtidas como os locais mais próximos, tráfego terrestre, etc.

Recursos usados:
  • Visual Studio Express 2012 for Web
  • SQL Server 2012
  • Entity Framework 6.0

 

Criando a tabela no SQL Server 2012

Vamos criar um banco de dados Cadastro.mdf e a tabela Localizacao com a seguinte estrutura:

Nota: Você pode criar o banco de dados e as tabelas usando o IDE do Visual Studio na janela DataBase Explorer ou Server Explorer.

Criando o projeto no Visual Studio 2012 For Web

Abra o VS 2012 Express for Web e clique em New Project;

A seguir selecione a linguagem C# ou VB .NET e o template ASP .NET Empty Web Application; (este exemplo usa a linguagem C#)

Informe o nome ASP_PosicaoGeografica_EF e clique no botão OK;

Vamos agora criar um  Entity Data Model em nosso projeto com base no banco de dados descrito no início do artigo.

No menu PROJECT clique em Add New Item;

A seguir e selecione o template Data -> ADO .NET Entity Data Model e informe o nome Cadastro.emdx e clique no botão Add;

Selecione o item Generate from database e clique no botão Next>;

Selecione a conexão com o banco de dados Cadastro.mdf e clique no botão Next>;

Selecione a tabela Localizacao. Marque as opções conforme mostra a figura abaixo e clique no botão Finish;

Será gerado o nosso Entity Data Model com o seguinte modelo de entidades mapeadas para as tabelas do banco de dados:

Agora no menu PROJECT clique em Add New Item;

A seguir e selecione o template Web Form  e informe o nome Default.aspx e clique no botão Add;

Inclua uma tabela na página contendo 8 linhas e duas colunas.

A partir da ToolBox inclua no formulário os controles TextBox, Combobox , HiddenField e button conforme o leiaute da figura abaixo:

O código gerado no formulário pode ser visto a seguir:

    <form id="form1" runat="server">
        <table class="auto-style1">
            <tr>
                <td class="auto-style2" colspan="2"><strong>Macoratti .net</strong></td>
            </tr>
            <tr> <td colspan="2" style="background-color: #3399FF">&nbsp;</td> </tr>
            <tr>
                <td>Nome do Local</td>
                <td>
                <asp:TextBox ID="txtNome" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td>Endereço</td>
                <td>
                <asp:TextBox ID="txtEndereco" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td>Cidade</td>
                <td>
                <asp:TextBox ID="txtCidade" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td>Estado</td>
                <td>
                <asp:TextBox ID="txtEstado" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td>País</td>
                <td>
                <asp:DropDownList ID="ddlPais" runat="server">
                    <asp:ListItem Value="1">Brasil</asp:ListItem>
                    <asp:ListItem Value="2">Argentina</asp:ListItem>
                    <asp:ListItem Value="3">Chile</asp:ListItem>
                </asp:DropDownList>
                </td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td>
                <asp:HiddenField ID="hdnLocalizacao" runat="server" />
                </td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td>
                <asp:Button ID="btnSubmeter" runat="server" Text="Salvar"  OnClick="btnSubmit_Click" Width="168px" Height="32px" />
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <asp:Label ID="lblmsg" runat="server" Font-Bold="True" Font-Names="Arial" ForeColor="#CC0000" Text="Label"></asp:Label>
                </td>
            </tr>
        </table>
       <div class="form">
     </div>
    </form>

Na tag <head> da página inclua a linha de código a seguir para usar biblioteca jQuery:

 <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.0.js"></script>

A seguir, ainda entre as tags <head> defina o script abaixo que irá obter a latitude e longitude exibindo-as na página:


    <script type="text/javascript">
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(showPosition, showError);
        }
        else { $("#message").html("A Geolocalização não é suportada neste navegador."); }
        function showPosition(position) {
            var latlondata = position.coords.latitude + "," + position.coords.longitude;
            var latlon = "Latitude : " + position.coords.latitude + " <br/> " + "Longitude : " + position.coords.longitude;
            $("#message").html(latlon);
            $("[id*=hdnLocalizacao]").val(position.coords.longitude + " " + position.coords.latitude);
        }
        function showError(error) {
            if (error.code == 1) {
                $("#message").html("Usuário negou a requisição para geolocalziação.");
            }
            else if (error.code == 2) {
                $("#message").html("Localização informada esta indisponível.");
            }
            else if (error.code == 3) {
                $("#message").html("A requisição para obter a localização do usuário expirou.");
            }
            else {
                $("#message").html("Erro desconhecido.");
            }
        }
    </script>

No code-behind da página Default.aspx.cs inclua o código baixo que irá persistir as informações no Entity Framework:

using System;
using System.Data.Spatial;
namespace ASP_PosicaoGeografica_EF
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            using (var context = new CadastroEntities())
            {
                try
                {
                    context.Localizacoes.Add(new Localizacao()
                    {
                        Nome = txtNome.Text,
                        Endereco = txtEndereco.Text,
                        Cidade = txtCidade.Text,
                        Estado = txtEstado.Text,
                        PaisId = Convert.ToInt32(ddlPais.SelectedValue),
                        Geolocalizacao = DbGeography.FromText("POINT( " + hdnLocalizacao.Value + ")")
                    });
                    context.SaveChanges();
                    lblmsg.Text = "Localização salva com sucesso " + hdnLocalizacao.Value.ToString();
                }
                catch (Exception ex)
                {
                    lblmsg.Text = ex.Message;
                }
            }
        }
    }
}

Executando projeto vemos a seguir uma figura com um exemplo de um resultado obtido para um determinada localização:

Espiando o banco de dados e a tabela Localizacao vemos as informações persistidas conforme abaixo:

Este é um recurso interessante e fácil de implementar que pode lhe ajudar muito em determinados cenários.

Pegue o projeto completo aqui: ASP_PosicaoGeografica_EF.zip

Rom 7:4 Assim também vós, meus irmãos, fostes mortos quanto à lei mediante o corpo de Cristo, para pertencerdes a outro, àquele que ressurgiu dentre os mortos a fim de que demos fruto para Deus.

Rom 7:5 Pois, quando estávamos na carne, as paixões dos pecados, suscitadas pela lei, operavam em nossos membros para darem fruto para a morte.

Rom 7:6 Mas agora fomos libertos da lei, havendo morrido para aquilo em que estávamos retidos, para servirmos em novidade de espírito, e não na velhice da letra.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

    Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti