Chalalo Land

Tecnologías ASP.NET y un poco Más

Contacto


 Si quierer cooperar, yo feliz, muy agradecido :)

De donde me Visitan?

Locations of visitors to this page

Generic Content

Si te gustaron los articulos, y te animas te estaría muy agradecido!


Recent Posts

Tags

Community

Blogs de MVP

Amigos Geeks

Blogs Imperdibles

GODS

Archives

Email Notifications

[Tutorial] Google Maps, JQuery y ASP.NET ejemplo práctico de este Mix

Hola!, ha pasado un tiempo sin postear, lamentablemente he estado súper corto de tiempo, pero sin embargo quiero compartir algo con ustedes.

Hace un tiempo un buen amigo mío me comentó la inquietud de hacer algo con google maps, para distintos dispositivos, lo que me pareció bastante interesante. El tema es que me desperté con ese bicho de programar y leer documentación así que , antes que te aburras leyendo esto, te muestro el ejemplo final en un video para que te entusiasmes.

Como vez, vamos a mostrar las panaderías cercanas, pero con nuestra información, la que esta almacenada en una Base de Datos y mediante un WS vamos a obtener estos datos para mostrarlos en el mapa y además, vamos a agregar una leyenda para cada uno de estos puntos

Revisemos los pasos a seguir para obtener este resultado…

Paso 1: Obtener el Key desde google Map

Debes obtenerlo desde la siguiente URL:  API key for Google Maps , debes contar con una cuenta en gmail, y registrar de que servidor vas a utilizar esta API (no necesario para probar en Localhost).  Luego vas a obtener la key , que con la cual tienes que hacer referencia a la API.
En mi caso:

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true&amp;key=ABQIAAAA3e9bpW5mHEGS7LVaB4R-3BQx6TWrfC8bNfnC-vtzzHJYkwhD6xTwJS9V3UI-UBnyi98SwuzCxumFSw" type="text/javascript"></script>


<
script src="jquery-1.4.1.min.js" type="text/javascript"></script>

Paso 2: Crear el div para el mapa

 

<body>

    <div id="map_canvas" style="width: 580px; height: 381px">

    </div>

    <ul id="list">

    </ul>

</body>

Este va a ser el contenedor de nuestro mapa, además tenemos un tag ul para mostrar los puntos que vamos a marcar.

 

Paso 3: Crear el  Código JavaScript

 

Luego viendo la documentación de la Api, vamos a configurar las siguientes características:

Icono de Marca Personalizado

$(document).ready(function () {

   if (GBrowserIsCompatible()) {

      var map = new GMap2(document.getElementById("map_canvas"));

      map.setCenter(new GLatLng(-36.809731, -73.042903), 15);

      map.setUIToDefault();

     

      var baseIcon = new GIcon(G_DEFAULT_ICON);

      baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";

      baseIcon.iconSize = new GSize(20, 34);

      baseIcon.shadowSize = new GSize(37, 34);

      baseIcon.iconAnchor = new GPoint(9, 34);

      baseIcon.infoWindowAnchor = new GPoint(9, 2);

      getMarkersWS(map);             

            }

Esta es la primera parte  con esto instanciamos el mapa y lo asignamos al div que tenemos en el body. También damos las coordenadas para ubicar inicialmente el mapa (-36.809731, -73.042903), que es la ciudad donde vivo, y el zoom ,en este caso 15.

Para buscar tu ubicación, utiliza http://itouchmap.com/latlong.html

Luego vamos a modificar el icono partiendo de la base del icono por defecto, cambiamos la sombra y el tamaño,  y como veremos, vamos a modificar  con la función createMarker, que recibe el punto, y el html a imprimir, el icono sobre la marca.

function createMarker(point, htmlVentana) {

       var Icon = new GIcon(baseIcon);

       Icon.image = "empanadas.png";

       markerOptions = { icon: Icon };

       var marker = new GMarker(point, markerOptions);

       GEvent.addListener(marker, "click", function () {

             marker.openInfoWindowHtml(htmlVentana);

        });

       return marker;

     }

Como comentaba antes, esta función se va a encargar de dibujar la marca, asignar además una ventana de información sobre la misma, asociada al evento click.

El ícono que elejí es la de una empanada, ya que es una comida típica Chilena y estamos celebrando el Bicentenario de mi Pais Sonrisa.

image[3]

La ventana a la que le pasamos la variable  (htmlVentana), se va a mostrar sobre el marker:image

Obviamente, los datos son obtenidos desde la base de datos.

Paso 4: Crear la Base de Datos.

Creamos una tabla Panaderías, con la siguiente estructura:image

Con los Datos:

image

Para hacerla como dice Pablo Campos “Short & Good”, voy a crear un modelo LinqToSql para el manejo de datos:

image

Agregamos el WebService y codificamos la función GetPanaderias() que devuelve una lista de Objetos PanaderiaItem.

  <WebMethod()> _

    Public Function GetPanaderias() As List(Of PanaderiaItem)

        Dim Items As New List(Of PanaderiaItem)

        Dim modelo As New ModeloDataContext

        Dim lista = From p In modelo.Panaderias

        For Each p As Panaderia In lista

            Items.Add(New PanaderiaItem With {.nombre = p.nombre, _

                                              .direccion = p.direccion, _

                                              .precio = p.precio, _

                                             .descripcion = p.descripcion, _

                                              .foto = p.foto, _

                                              .lng = p.Lng.ToString, _

                                              .lat = p.Lat.ToString})

        Next

        Return Items

    End Function

 

    Public Class PanaderiaItem

        Public nombre As String

        Public direccion As String

        Public precio As Integer

        Public descripcion As String

        Public foto As String

        Public lng As String

        Public lat As String

    End Class


Paso 5: Obtener los datos del WebService:

 

Vamos a crear un WebService que nos permita recuperar los datos mediante JSON:

function getMarkersWS(map) {

                $.ajax({

                    type: "POST",

                    url: "MiWebService.asmx/GetPanaderias",

                    data: "{}",

                    contentType: "application/json; charset=utf-8",

                    dataType: "json",

                    success: function (response) {

                        var panaderias = response.d;

                        $.each(panaderias, function (index, pan) {

                            var point = new GLatLng(pan.lng, pan.lat);

                            var htmlVentana = "<img src='fotos/" + pan.foto + "'><br> Panadería:" + pan.nombre + "</b><br><i>Precio:" + pan.precio + "</i><br>Direccion:" + pan.direccion;

                            var marker = createMarker(point, htmlVentana);

                            map.addOverlay(marker);

                            $("<li />").html(pan.nombre + "  " + pan.direccion + " <b>" + pan.precio + "</b>").click(function () {

                                marker.openInfoWindowHtml(htmlVentana);

                            }).appendTo("#list");

 

                        });

 

                    },

 

                    failure: function (msg) {

                        alert(msg);

                    }

 

                }); //fin llamada ajax

            } //fin funcion getMarkersWS

Como puedes ver el código , obtenemos los datos desde el WebService, mediante JSON, cuando ocurre el ok (success), y vamos recorriendo la colección de Objetos que nos devuelve el WS con la función $.each de Jquery

 $.each(panaderias, function (index, pan)

Luego armamos el punto (var point) y el mensaje HTML para pasarlo a la función createMarker. Luego vamos a dibujar el listado y vamos agregando el handlers click , para que al pinchar cada elemento, se muestre en el mapa el punto y la ventana. Gracias al encadenamiento de Jquery, podemos finalmente agregarlo al list (appendTo).

$("<li />").html(pan.nombre + "  " + pan.direccion + " <b>" + pan.precio + "</b>").click(function () {

                             marker.openInfoWindowHtml(htmlVentana);

                            }).appendTo("#list");

 

Paso 6: El Proyecto Web.

 

image

Esta es la estructura de nuestro proyecto, como vez es bastante sencillo, y podemos lograr un sistema de seguimiento, por ejemplo refrescando de manera asíncrona los markers.

image

Recursos:

Documentación Api de Google:
http://code.google.com/intl/es-ES/apis/maps/index.html

Búscate en el Mapa
http://itouchmap.com/latlong.html

Descarga la aplicación Sonrisa

image

Como siempre digo, espero que te sirva, y si sigues este blog, sorry que no haya posteado, pero creo que con esto me revindico Sonrisa. Si no te funciona postea porfa, así nos ayudamos entre todos!
Saludos,
Gonzalo

PD: Esta manera es más práctico que marcar de esta manera:

image

Posted: 12/9/2010 23:00 por Gonzalo Perez | con 43 comment(s)
Comparte este post:

Comentarios

Felipe ha opinado:

Nice,

gracias!

# September 13, 2010 4:05 AM

Angel ha opinado:

Muchas gracias, me va a ser de mucha utilidad.

# September 13, 2010 7:57 AM

Tomás Crespo García ha opinado:

Fantástico, muchas gracias, era justo lo que necesitaba

# September 13, 2010 1:09 PM

Sergio ha opinado:

Increible, bastante practico, ahora se podria hacer muchas cosas con este buen post.

GRACIAS.

# September 13, 2010 4:05 PM

Juan Rios ha opinado:

Hola... bastante práctico tu ejemplo... y se le puede dar una gran funcionalidad... pero disculpa mi ignorancia...

¿Qué versión de VS es necesaria para poder usar correctamente jquery?

O jquery lo puedo usar con el IDE que estime más conveniente... te lo pregunto porque hace años que desarrollo en .NET, pero sólo hace uno que lo hago para el ambiente Web...

Ojalá pudieras responderme... saludos... y muchas gracias nuevamente...

# September 13, 2010 4:43 PM

Gonzalo Perez ha opinado:

Hola Juan

Puedes utilizar Jquery con cualquier versión ya que "solo" (digo solo por que es un archivo, que si bien pequeño, es muy importante) es un archivo js,es decir, una librería JS.

Si tienes Visual Studio 2008 o 2010, todo bien, sin embargo, el ejemplo a descargar está construido sobre el Fx 3.5

Saludos,

# September 13, 2010 4:50 PM

Pablo Hormazabal ha opinado:

super bueno el post gonzalo te las mandaste, será de mucha utilidad en unas cosillas que estoy haciendo, un abrazo compadre no vemos

# September 13, 2010 5:16 PM

MVP Factor ha opinado:

Nuestro buen amigo Gonzalo Perez ha escrito un excelente tutorial que demuestra como se puede aplicar

# September 13, 2010 5:23 PM

pregunton cojonero ha opinado:

estupendo !!! salu2grz

# September 13, 2010 8:46 PM

pregunton cojonero ha opinado:

señor, con qué herramienta grabó el video para youtube? salu2grz

# September 13, 2010 8:47 PM

Gonzalo ha opinado:

con camptasia studio, no quedo de lo mejor, pero salva :)dor

# September 13, 2010 9:07 PM

Juan Rios ha opinado:

Gracias por tu respuesta... pero déjame preguntarte una última cosa que me dejó PLOP!...

¿Que es Fx 3.5?

Saludos... y gracias por compartir tanta información...

# September 13, 2010 9:55 PM

Javier Torrecilla ha opinado:

@Juan rios,

Fx 3.5 = .NET Framework 3.5

# September 14, 2010 10:03 AM

Javier Torrecilla ha opinado:

Por cierto Gran Post!

# September 14, 2010 10:04 AM

Juan Rios ha opinado:

@Javier Torrecilla,

Muchas gracias por tu aclaración... :D

# September 15, 2010 12:21 AM

Jesús Bosch ha opinado:

excelente artículo, como siempre!

# September 15, 2010 8:10 AM

Alberto ha opinado:

Hola Amigo, una consulta por que no me salen los marker cuando ejecuto mapa.html.. te agradeceria si me das dicha respuesta.

# September 30, 2010 10:24 AM

Gonzalo Perez ha opinado:

Hola Alberto,

Este ejemplo se conecta a un WS , por lo que tienes que ejecutarlo sobre un Web Server o con Visual Studio, es así?

Además el servicio se conecta a una BD para obtener los markers.

Como  estas abriendo el mapa.html?

# October 1, 2010 12:40 AM

Alberto ha opinado:

Bueno, estoy abriendo el sitio web desde el visual studio 2008 y haciendo el archivo mapa.html como pagina de inicio, al ejecutarlo solo puedo apreciar el mapa, mas no los marker ni la imagen de las empanadas.. Muchisimas gracias por tu atención..

# October 1, 2010 8:38 AM

roberto riveros c ha opinado:

tengo duda igual que alberto, la version de sql servers esta correcta /sql servers 2008/, pero creo que es el conector donde tengo problemas., connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Panaderias.mdf;Integrated Security=True;User Instance=True"

# October 5, 2010 8:52 PM

Gonzalo Perez ha opinado:

Hola Roberto,

Puedes configurar nuevamente la conexión? y luego hacerle un punto de interrupción al servicio, por si esta llegando...

# October 6, 2010 2:29 AM

Ricardo ha opinado:

Gonzalo mira que ejecuto la pagina con al ruta localhost y me muestra el mapa, pero si desde otro equipo la quieren ver llamandola digitando mi ip nos marca este error

---------------------------

Mensaje de página web

---------------------------

Este sitio web requiere una clave diferente del API de Google Maps. Puedes generar una clave nueva en code.google.com/.../maps.

---------------------------

Aceptar  

---------------------------

# October 6, 2010 4:17 PM

Gonzalo Perez ha opinado:

Hola Ricardo,

cambia la clave de la API por una que indique la Ip de la maquina en donde va a estar la pagina.

Saludos,

# October 7, 2010 2:36 PM

Maribel Rios ha opinado:

Hola....

Oye tengo una duda lo que pasa es Que yo ise un ejemplo paracido pero no se como agregar la foto a la etiqueta, estoy tilizando un (GInfoWindow) para mostrar los datos, bueno espero y me puedas ayudar. ok BYE estoy utilizando VB.NET 2005

# October 14, 2010 1:24 AM

Gonzalo Perez ha opinado:

Y con el código de :

createMarker(point, htmlVentana)

Tienes el código por ahi?

# October 14, 2010 4:21 AM

Maribel Ríos ha opinado:

Hola Gonzalo....

Lo que pasa es que no le entiendo bien al codigo que pusiste para agregar la imagen.... pero yo lo ago de esta manera...

Public Sub DibujarIconos(ByVal LatLngIcono As GLatLng)

       Dim icon As New GIcon

       Dim Lng As Double

       Dim NomDire As String

       Dim Arreglo() As String

       Dim Nombre As String

       Dim Direccion As String

       icon.image = "Imagenes/pinmorado.png"

       icon.shadow = "Imagenes/pinmoradosombra.png"

       icon.iconSize = New GSize(32, 32)

       icon.shadowSize = New GSize(56, 32)

       icon.iconAnchor = New GPoint(16, 32)

       icon.infoWindowAnchor = New GPoint(16, 0)

       Dim mOpts As New GMarkerOptions

       mOpts.icon = icon

       mOpts.clickable = True

       Dim marker As GMarker

       marker = New GMarker(LatLngIcono, mOpts)

       NomDire = SacarSBD(i)

       Arreglo = Split(NomDire, ",")

       Nombre = Arreglo(0)

       Direccion = Arreglo(1)

       Dim Window As GInfoWindow

       Window = New GInfoWindow(marker, Nombre & " " & Direccion, False, GListener.Event.click)

       GMap1.addInfoWindow(Window)

End Sub

(En donde nombre y direccion YA traen los valores de la BD).

Bueno adios y espero y me puedas ayudar y muchas gracias....

BYE Saludos

# October 14, 2010 7:45 PM

Gonzalo Perez ha opinado:

function createMarker(point, htmlVentana) {

      var Icon = new GIcon(baseIcon);

      Icon.image = "empanadas.png";

      markerOptions = { icon: Icon };

      var marker = new GMarker(point, markerOptions);

      GEvent.addListener(marker, "click", function () {

            marker.openInfoWindowHtml(htmlVentana);

       });

      return marker;

    }

Esta función , como la estoy utilizando, la puedes reemplazar por la que ocupas, habría que ver la versión que la API que ocupas, yo me guié por la ultima versión y en las funciones propuestas por google.

# October 16, 2010 4:43 AM

Clark ha opinado:

Hola Gonzalo  ,

Buenas mira espero me puedas ayudar por favor estoy intentando conectarme a la Bd con el ejemplo y solo me carga la pagina mas no los datos de la Bd quisera por favor que me ayude, derrepente tengo algo que modificar del ejemplo o de la bd por favor ,

quisera saber si se hace alguna modificacion despues de haber bajado su ejemplo por favor

disculpe mi ignorancia

Gracias de Antemano

# December 28, 2010 6:54 PM

Clark ha opinado:

Disculpa ..

Por siacaso ya cambie la Api de mi coneccion

# December 28, 2010 6:55 PM

Gonzalo Perez ha opinado:

Clark,

Una consulta, que lenguaje estas ocupando? tienes algun ejemplo de conexión con Ajax en tu proyecto?

# December 28, 2010 11:51 PM

Clark ha opinado:

Hola Gonzalo

Estoy usando SQL SERVER 2005 CON ASP.NET 2008

Gracias De antemano ,

# December 29, 2010 5:20 PM

Chalalo Land ha opinado:

Ya se acaba el año, y quería hacer un resumen, no están todos los artículos, si no los que más rescato

# December 31, 2010 2:15 AM

Will ha opinado:

Hola,

Quiero hacer lo mismo que tu pero en ves de utilizar la longitud y latitud, quiero utilizar la direccion del lugar, por ejemplo, "Camilo Enriquez 700".

Saludos y gracias por tu trabajo.

# March 17, 2011 9:40 PM

Nacho ruiz ha opinado:

Mensaje de error del compilador: BC30516: Error de resolución de sobrecarga porque ninguna de las funciones 'New' a las que se tiene acceso acepta este número de argumentos.

Error de código fuente:

Línea 13:     Public Function GetDirecciones() As List(Of Direcciones)

Línea 14:         Dim Items As New List(Of Direcciones)

Línea 15:         Dim modelo As New ModeloDataContext

Buenas no se si alguin puede ayudarme pero el error debe ser muy elemental, alguien sabria decirme por que es este error?

# April 6, 2011 4:34 PM

Luis Vela ha opinado:

Hola, Genial tu post!

Como se puede hacer para agregar nuevas direcciones a la DB desde el mapa?

# April 10, 2011 4:35 AM

Gonzalo Perez ha opinado:

Hola Luis,

Puedes agregarlas con un formview o de la manera común y corriente de agregar un registro, tambien lo puedes hacer por ajax con jquery y un servicio web, o con las posibilidades que brinda el ScriptManager para acceder asyncronamente a un WebService

# April 10, 2011 4:24 PM

Nacho ruiz ha opinado:

Buenas Gonazalo, GENIAL!!! todo pero mi problema es que no se abres los popus de los puntos que tengo almacenados en la BBDD y estoy ya loco de revidas el código, he segido tus pasos uno por uno y no salen! de que pude ser?

Un saludo

# April 11, 2011 10:06 AM

Gonzalo Perez ha opinado:

Hola Nacho,

No aparece ningun error javascript? puedes probarlo con IE y con Firefox + firebug  para ver si está arrojando algun error?

# April 11, 2011 2:17 PM

Raúl Cruz. ha opinado:

Saludos Gonzalo.

Gracias de antemano por tu Post, es magnifico, espero me puedas ayudar, tengo una pagina con ASP en la cual tengo otros controles (dentro de una tabla), al agregar el MAP (el div lo tengo en una celda de la tabla) este se pone al inicio y tapa los controles iniciales, sabes como podria hacer para que el mapa apresca solo en la celda donde esa declarado el DIV.

De antemano gracias por tu respuesta.

Quedo a tus órdenes.

# May 3, 2011 8:26 PM

masantizo ha opinado:

Magnifico aporte, sigue asi, muchos necesitamos una guia practica, y con esto te colocas en el top 10 de mis preferidos.

He reconstruido de cierta manera el proyecto que has proporcionado, pero no logro ver la imagenes en el mapa, y mucho menos las ubicaciones de acuerdo a la informacion en la DB, he comprobado que la conexion con la DB existe, me parece que tengo algo pendiente, supongo que te has topado con este problema.

Agradezco de antemano tu fina atencion, quedo en espera de tus comentarios.  Saludos.

# June 24, 2012 9:37 PM

Gonzalo Perez ha opinado:

Hola!gracias por los comentarios, revisaste la clave que entrega google maps?? Verifica eso, si no te resulta enviame el ejemplo de lo que estas haciendo a chalalo - hotmail.com

Saludos!

# June 26, 2012 3:31 PM

jose inoñan ha opinado:

hola man buenas noches una consulta, dime esta aplicaciom puede correr en un celular o smartphone, yo estoy buscando una aplicacion parecida a esta, la mia es la siguiente....mostrar los centros comerciales mas cercanas a mi posicion.....dime

Google Maps, JQuery mobile y ASP.NET

respondeme a joseph_loveyou@hotmail.com

# August 13, 2012 4:21 AM

Edgardo ha opinado:

Hola Gonzalo, primero felicitarte por tu pagina nos ayudas mucho en tu sitio, ahora voy al grano.

Realize el tutorial pero con Api de Google maps version 3 y me salio excelente, pero se ocurrio separar el Servicio Web en un Sitio Web y la Aplicacion que consume en otro sitio web, pero no he logrado poder correr ambos este es el error que me arroja en firebug.

NetworkError: 404 Not Found - localhost/.../GetDispositivos

como podria configurarlo en asp.net para que pueda correr.

# December 3, 2012 8:58 PM