Alex Franco

Blog de Alex Franco, aquí podrás encontrar temas de tecnología, desarrollo web y móvil, Python, Django, Mongo, DBs y… otros temas más
Home  /  Codigo  /  Geocode Inverso: Buscar direcciones a partir de Coordenadas con GMaps API v3

Geocode Inverso: Buscar direcciones a partir de Coordenadas con GMaps API v3

Alex Franco API, Direcciones, Geocode, Geocoding, GMaps, Maps 5 Comments

Si no tienes mucha experiencia o tienes dudas con respecto a algo que usemos en este post, puedes consultar los demás ejemplos que se han realizado anteriormente aquí.

En un post anterior, vimos cómo hacer un Geocode Simple, donde obteníamos las coordenadas a partir de una dirección dada, es decir, podríamos poner cualquier combinación de calles, colonias, ciudad, etc. y obtener las coordenadas de esa dirección para colocarlas en un mapa. En este caso es al contrario, buscar direcciones (de acuerdo a la base de datos de Google) a partir de coordenadas.

Lo que haremos se resume en: escribir coordenadas (latitud, Longitud), verificar si existe, si existe, colocar un marcador, centrar y dar zoom en el mapa en la región de la dirección obtenida, si no existe la dirección arrojar un error diciendo que no existe.

Ver Demo Geocoding

Al igual que el ejemplo anterior, es necesario crear un objeto Geocoder, que nos permitirá hacer la interpretación de lo que intentemos buscar.

var geocoder = new google.maps.Geocoder();

El objeto que se obtiene de respuesta es un JSON, donde lo manejaríamos como regularmente se hace en javascript, el resultado es algo como esto:

{
  "status": "OK",
  "results": [ {
    "types": [ "street_address" ],
    "formatted_address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
    "address_components": [ {
      "long_name": "1600",
      "short_name": "1600",
      "types": [ "street_number" ]
    }, {
      "long_name": "Amphitheatre Pkwy",
      "short_name": "Amphitheatre Pkwy",
      "types": [ "route" ]
    }, {
      "long_name": "Mountain View",
      "short_name": "Mountain View",
      "types": [ "locality", "political" ]
    }, {
      "long_name": "California",
      "short_name": "CA",
      "types": [ "administrative_area_level_1", "political" ]
    }, {
      "long_name": "United States",
      "short_name": "US",
      "types": [ "country", "political" ]
    }, {
      "long_name": "94043",
      "short_name": "94043",
      "types": [ "postal_code" ]
    } ],
    "geometry": {
      "location": {
        "lat": 37.4219720,
        "lng": -122.0841430
      },
      "location_type": "ROOFTOP",
      "viewport": {
        "southwest": {
          "lat": 37.4188244,
          "lng": -122.0872906
        },
        "northeast": {
          "lat": 37.4251196,
          "lng": -122.0809954
        }
      }
    }
  } ]
}

Lo único que nos faltaría es el código para validar, interpretar y dibujar. Para esto, hay 3 cosas importantes que debemos tomar en cuenta del JSON que tenemos de respuesta:

  • status: contiene la respuesta del estado de la petición, si fue satisfactoria o si hubo algún error y que tipo de error.
  • geometry.location: la ubicación de la dirección solicitada.
  • geometry.viewport: los límites recomendados para ajustar el zoom del mapa, haciendo un cuadrante con las esquinas Noreste (superior derecha) y Suroeste (inferior izquierda).

Con esto en presente, la función siguiente nos mostrará solamente el primer resultado obtenido, quedando así :

function codeLatLng() {
   var input = $('#latlng').val();
   var latlngStr = input.split(',', 2);
   var lat = parseFloat(latlngStr[0]);
   var lng = parseFloat(latlngStr[1]);
   var latlng = new google.maps.LatLng(lat, lng);
   geocoder.geocode({'latLng': latlng}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
         if (results[0]) {
            map.fitBounds(results[0].geometry.viewport);
            marker.setMap(map);
            marker.setPosition(latlng);
            $('#address').text(results[0].formatted_address);
            infowindow.setContent(results[0].formatted_address);
            infowindow.open(map, marker);
            google.maps.event.addListener(marker, 'click', function(){
               infowindow.setContent(results[0].formatted_address);
               infowindow.open(map, marker);
            });
         } else {
            alert('No results found');
         }
      } else {
         alert('Geocoder failed due to: ' + status);
      }
   });
}

Los primeros 4 renglones de la función realizan la validación y separación de latitud y longitud, para poder formar el objeto latLng, y listo con esto tenemos terminado nuestro ejercicio, puedes verificarlo en funcionamiento en la página de demos:

Ver Demo Geocoding

El código completo quedaría así:

var geocoder;
var map;
var infowindow = new google.maps.InfoWindow();
var marker = new google.maps.Marker();

function closeInfoWindow() {
      	infowindow.close();
   }

function initialize() {
  geocoder = new google.maps.Geocoder();
  var latlng = new google.maps.LatLng(20.68009, -101.35403);
  var mapOptions = {
    zoom: 8,
    center: latlng,
    mapTypeId: 'roadmap'
  }
  map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);

  google.maps.event.addListener(map, 'click', function(){
        	closeInfoWindow();
     	  });
}

function codeLatLng() {
  var input = $('#latlng').val();
  var latlngStr = input.split(',', 2);
  var lat = parseFloat(latlngStr[0]);
  var lng = parseFloat(latlngStr[1]);
  var latlng = new google.maps.LatLng(lat, lng);
  geocoder.geocode({'latLng': latlng}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      if (results[0]) {
		map.fitBounds(results[0].geometry.viewport);
                marker.setMap(map);
                marker.setPosition(latlng);
		$('#address').text(results[0].formatted_address);
		infowindow.setContent(results[0].formatted_address);
        infowindow.open(map, marker);
		google.maps.event.addListener(marker, 'click', function(){
            infowindow.setContent(results[0].formatted_address);
	        infowindow.open(map, marker);
        });
      } else {
        alert('No results found');
      }
    } else {
      alert('Geocoder failed due to: ' + status);
    }
  });
}

$(document).ready(function(){
   initialize();
});

Y en el Body solamente esto:

<div>
   <input id="latlng" type="textbox" value="20.68009, -101.35403">
</div>
<div>
   <input type="button" value="Reverse Geocode" onclick="codeLatLng()">
</div>
<table class="width2">
   <tr><td class="unitx1"><strong>Dirección:</strong></td><td><div id="address"></div></td></tr>
</table>
<div id="map_canvas" style="width: 990px; height: 500px"></div>

Espero les sirva y cualquier cosa, ya saben cómo contactarme…

Enjoy this Life!

Relacionado

About Author

Alex Franco

 IT

Previous Article Buscar y trazar rutas con GMaps API v3
Next Article Cómo cambiar la contraseña de root de MySQL en Mac OS X

Related Posts

  • Enviar correo personalizado automáticamente cuando respondan un Formulario de Google

    Enviar correo personalizado automáticamente cuando respondan un Formulario de Google

  • Django + AllAuth + Google OAuth 2.0

    Django + AllAuth + Google OAuth 2.0

  • Agregar número consecutivo y enviar correo al contestar Formulario de Google Drive

5 Comments

  1. Diego Reply
    2013-07-21 at 3:50 pm

    Hola, me tira este error y no he podido solucionarlo
    Uncaugth ReferenceError: ObjectDump is not defined

    en la linea
    if (status == google.maps.GeocoderStatus.OK) {
    ObjectDump(results, “description”);

    • Alex Franco Reply
      2013-07-25 at 10:17 am

      @Diego Oops… lo siento, dejé esa línea por error, es una función que uso para debuguear objetos en javascript, solamente elimina la línea de

      ObjectDump(results, “description”);

      con eso debe funcionar, saludos…

      • Juber
        2016-03-22 at 2:16 pm

        Alex. Tienes un código donde puedas pintar poligonos en el gmaps leyendo las coordenadas desde una base de datos. Ejm. pintar ciudades dentro del estado de Guerrero. Acapulco color rojo=mucha violencia, San marcos color azul= Violencia controlada y así para las otras ciudades.

      • Alex Franco
        2016-04-11 at 12:38 pm

        Aún no he publicado algo así pero lo tomo en cuenta para ir trabajando en ello.

  2. Eduar Rivera Reply
    2019-10-11 at 2:13 pm

    me muestra un error
    , me ayudas porfa , var input = $(‘#latlng’).val(); ReferenceError: $ is not defined

ComentaCancelar respuesta

Posts populares

  • Geocode Simple: Buscar direcciones (coordenadas a partir de direcciones) con GMaps API v3
  • Buscar y trazar rutas con GMaps API v3
  • Recuperar o ver las claves de las redes inalámbricas en tu Mac (o cualquier App)
  • Enviar correo después de contestar Formulario de Google Drive automáticamente

Suscríbete

Suscríbirme!

Quizá te interese

  • Agregar número consecutivo y enviar correo al contestar Formulario de Google Drive
  • Obtener un JSON Cross-Domain con jQuery (rápido Proxy con PHP)
  • Geocode Inverso: Buscar direcciones a partir de Coordenadas con GMaps API v3
  • Marcador arrastrable y cómo obtener su Lat/Lng GMaps API v3
Alex Franco 2009 - 2023