Devland

from developers to developers
Welcome to Devland Sign in | Join | Help
in Search

Alessio Vecchi blog

Geolocalizzazione con Google HTTP Service

Ormai credo che a quasi tutti sia capitato di dover integrare il proprio sito web (e non) con qualche sistema di geolocalizzazione.

I motivi possono essere molteplici: dal visulizzare un punto su una mappa, al ricercare l'indirizzo del negozio più vicino, al calcolo del percorso tra due indirizzi, ecc,

Spesso capita di avere un database con un elenco di indirizzi e di volere trovare la latitudine e longitudine per poi salvarla sul database stesso.

Per prima cosa bisogna appogiarsi a un servizio esterno che permette di localizzare il nostro indirizzo in coordinate terrestri (latitudine e longitudine).

Per questo esempio utilizziamo il servizio di Geocoding fornito da Google:

http://code.google.com/intl/it/apis/maps/documentation/geocoding/index.html

Leggendo la documentazione si scopre che basta fare un chiamata in HTTP GET al segunete indirizzo web:

http://maps.google.com/maps/geo

nella query string bisogna fornire questi parametri obbligatori:

  • q (indirizzo),
  • key (la GoogleMap API Key),
  • sensor (a false),
  • output (il formato dell'output: xml, json, ecc)

Se proviamo a fare una chiamata di prova mettendo come indirizzo milano:

http://maps.google.com/maps/geo?q=milano&sensor=false&key=&output=xml

si ottiene il seguente risultato:

<?xml version="1.0" encoding="UTF-8" ?>
<kml xmlns="http://earth.google.com/kml/2.0"><Response>
<name>milano</name>
<Status>
<code>200</code>
<request>geocode</request>
</Status>
<Placemark id="p1">
    <address>Milano, Italia</address>
[..]
<Point><coordinates>9.1881408,45.4636889,0</coordinates></Point>
  </Placemark>
</Response></kml>

Per effettuare un HTTP GET mi appoggio a una comoda classe di utility PostSubmitter scaricabile da:

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

Ovviamente si possono usare le classi del framework .net.

A questo punto scrivere una classa che dato un indirizzo ci fornisce la longitudine e la latitudine è una banalità:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Configuration;
using System.Globalization;

namespace GeoLocator
{
    public class GeoLocator
    {
        private String GoogleGeoServiceUrl = ConfigurationManager.AppSettings["GoogleGeoServiceUrl"];
        private String GoogleMapAPIKey = ConfigurationManager.AppSettings["GoogleMapAPIKey"];
        private XNamespace GoogleNS = ConfigurationManager.AppSettings["GoogleNS"];

        public GeoLocator()
        {

        }

        public GeoLocator(String geoServiceUrl, String mapAPIKey, String googleNS)
        {
            this.GoogleGeoServiceUrl = geoServiceUrl;
            this.GoogleMapAPIKey = mapAPIKey;
            this.GoogleNS = googleNS;
        }
        
        public GeoCoordinate GetGeoCoordinate(String address)
        {
            PostSubmitter post = new PostSubmitter();
            post.PostItems.Add("q", address);
            post.PostItems.Add("key", GoogleMapAPIKey);
            post.PostItems.Add("sensor", "false");
            post.PostItems.Add("output", "xml");
            post.PostItems.Add("gl", ".it");
            post.Url = GoogleGeoServiceUrl;
            post.Type = PostSubmitter.PostTypeEnum.Get;
            String xmlText = post.Post();          
            XDocument doc = XDocument.Parse(xmlText);

            XElement coordinate =
                doc.
                Descendants(GoogleNS + "coordinates").
                FirstOrDefault();


            GeoCoordinate geoCoordinate =null;
            if (coordinate != null)
            {
                String[] coords = coordinate.Value.Split(',');

                geoCoordinate = new GeoCoordinate()
                {
                    Latitude = decimal.Parse(coords[0], CultureInfo.CreateSpecificCulture("en-us")),
                    Longitude = decimal.Parse(coords[1], CultureInfo.CreateSpecificCulture("en-us"))
                };
            }
            
            return geoCoordinate;
        }
    }

    public class GeoCoordinate
    {
        public decimal Latitude { get; set; }
        public decimal Longitude { get; set; }
    }
}

dove l'App.config è così strutturato:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="GoogleGeoServiceUrl" value="http://maps.google.com/maps/geo" />
        <add key="GoogleMapAPIKey" value="inserire la propria chiave" />
        <add key="GoogleNS" value="http://earth.google.com/kml/2.0" />
    </appSettings>
</configuration>

 

Nei file allegati al post c'è un esempio completo con un progetto di test che utilizza la libreria.

Scarica HTTPServiceGeoLocator.zip 

Comments

No Comments

Leave a Comment

(required) 
(optional)
(required) 
Submit
Powered by Community Server (Commercial Edition), by Telligent Systems