Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Implementare ricerca comuni in relazione ad un raggio espresso in km

    Salve a tutti,
    ho creato per un sito che tratta annunci immobiliari una pagina in cui c'è la possibilità di filtrare gli annunci ricercati in base a regione, provincia e comune.
    Ovviamente la lista delle relative località viene prelevata da un db e in base alla scelta effettuata tramite delle dropdown i dati vengono filtrati, e fin qui niente di fantastico, normale amministrazione direi senonchè il cliente mi ha fatto una richiesta che mi ha lasciato abbastanza disorientato.
    Vorrebbe effettuare la ricerca in base al chilometraggio!!! e cioè scelto un comune (tramite dropdown) ci sarà un'altra dropdown con un lista del tipo:
    nel raggio di - 3 km - 5 km - 10 km - etc.
    quindi da come potete intuire il risultato dovrà contenere tutti i comuni compresi nel raggio scelto a partire dal comune scelto, avete una vaga idea di come si potrebbe implementare ???
    Si potrebbe aggiungere nella base dati in corrispondenza di ogni comune delle coordinate bidimensionali rispetto ad una mappa virtuale e poi durante l'interrogazione eseguire i relativi calcoli, mi sembra una soluzione un pò grossolana e dispendiosa in termini di tempo.
    Avete qualche suggerimento?
    Sapete se google map fornisce nelle sue API un qualche servizio che restituisce questo tipo di quey?

    grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    703
    e se ti appoggiassi ad un altro webservice?
    http://www.geonames.org/ questo sembra ben fatto

    vedi ad esempio qua=> http://www.geonames.org/maps/google_44.862_9.545.html
    io ho scelto una città e mi da nella colonna km to center la lista di tutti i posti e la relativa distanza.. forse questo dato è accessibile anche da webservice, prova a informarti ciao

  3. #3
    non so la tua sorgente dati, ma dovresti avere l'elenco dei comuni con latitudine e longitudine.

    se non l'hai puoi scaricare il database dal sito che ti ha suggerito cleaner.

    a questo punto è facile:
    dalla dropdownlisti scegli ad esempio Torino, sai che Torino ha posizione x,y (lat,lon)
    scegli il raggio ad esempio 5KM

    ora fai:

    xmax = x + 5km
    xmin = x - 5km

    idem per y

    ora puoi fare una query e prendere tutti i comuni compresi tra xmax, xmin, ymax, ymin
    (in verità hai fatto un quadrato e non un cerchio).

    questa una soluzione semplice,
    altrimenti ti fai le belle formule trigonometriche (che non ricordo nemmeno) per calcolare la distanza da un punto ad un altro e ti prendi tutti quelli di 5km.

    ciao

  4. #4
    intanto un grazie mille a tutti e due, mi sono scaricato dal sito suggerito da cleaner il file dati txt contenente i luoghi con relative coordinate, ora devo trasportare il tutto su db.
    Il punto cruciale era come effettuare il calcolo, ho visto che il sito fornisce dei webservice però a questo punto in effetti (come da suggerimento di Gluck74) sarebbe meglio, se cè una corrispondenza diretta tra km e coordinate, farsi il calcolo in locale invece di interrogare ogni volta il webservice.
    A titolo informativo ho visto che anche google (http://code.google.com/intl/it-IT/ap...places/#Limits) fornisce un webservice apposito.
    Ora provo a studiarmi la soluzione del calcolo in locale...

  5. #5
    x Gluck74
    correggimi se sbaglio ma il tuo calcolo non è corretto e cioè non cè una corrispondenza diretta.
    Per esempio se io ho 35° 43' 9" e 35° 43' 8" non posso avere una corrispondenza diretta con un unità di misura del tipo metri/km o sbaglio?
    In rete ho trovato diverse formule implementate in c# che dati due punti espressi in latitudine e longitudine ritornano la distanza in km, posso usare una di queste soluzioni anche se così facendo non posso effettuare un filtro diretto sui dati (latitudine e longitudine) ma devo calcolare per esempio dato un punto (una provincia) la distanza con ogni altro punto presente sul db.
    Se si considera il calcolo su un intera regione in relazione ad ogni comune la mole di calcoli diventa abbastanza pesante, però non vedo altra soluzione ammenochè esiste una corrispondenza diretta come da tuo suggerimento, se però mi spieghi meglio che non lho molto capito...
    grazie

  6. #6
    Errata corrige

    leggendo meglio ho visto che c'è una corrispondenza diretta, anche se non precisissima a quanto pare, ma per quello che devo fare io va più che bene...

  7. #7
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Ciao, se non ricordo male, si dovrebbe utilizzare la proiezione di Mercatore :

    codice:
    class Program
        {
            static void Main(string[] args)
            {
                double y = MercatorProjection.latToY(45.24191993424553);//latitudine di partenza
                
                double dis_Y_NORD = y + 2500; // linea di 5 km, 2,5 a nord e 2,5 a sud del punto
                double dis_Y_SUD = y - 2500;
    
                double LAT_SUD = MercatorProjection.yToLat(dis_Y_SUD); // latitudine (2,5 km a sud del punto)
                double LAT_NORD = MercatorProjection.yToLat(dis_Y_NORD); // latitudine (2,5 km a nord del punto)
            }
        }
        /********************************************************/
        //by Florian Müller
        public static class MercatorProjection
        {
            private static readonly double R_MAJOR = 6378137.0;
            private static readonly double R_MINOR = 6356752.3142;
            private static readonly double RATIO = R_MINOR / R_MAJOR;
            private static readonly double ECCENT = Math.Sqrt(1.0 - (RATIO * RATIO));
            private static readonly double COM = 0.5 * ECCENT;
    
            private static readonly double DEG2RAD = Math.PI / 180.0;
            private static readonly double RAD2Deg = 180.0 / Math.PI;
            private static readonly double PI_2 = Math.PI / 2.0;
    
            public static double[] toPixel(double lon, double lat)
            {
                return new double[] { lonToX(lon), latToY(lat) };
            }
    
            public static double[] toGeoCoord(double x, double y)
            {
                return new double[] { xToLon(x), yToLat(y) };
            }
    
            public static double lonToX(double lon)
            {
                return R_MAJOR * DegToRad(lon);
            }
    
            public static double latToY(double lat)
            {
                lat = Math.Min(89.5, Math.Max(lat, -89.5));
                double phi = DegToRad(lat);
                double sinphi = Math.Sin(phi);
                double con = ECCENT * sinphi;
                con = Math.Pow(((1.0 - con) / (1.0 + con)), COM);
                double ts = Math.Tan(0.5 * ((Math.PI * 0.5) - phi)) / con;
                return 0 - R_MAJOR * Math.Log(ts);
            }
    
            public static double xToLon(double x)
            {
                return RadToDeg(x) / R_MAJOR;
            }
    
            public static double yToLat(double y)
            {
                double ts = Math.Exp(-y / R_MAJOR);
                double phi = PI_2 - 2 * Math.Atan(ts);
                double dphi = 1.0;
                int i = 0;
                while ((Math.Abs(dphi) > 0.000000001) && (i < 15))
                {
                    double con = ECCENT * Math.Sin(phi);
                    dphi = PI_2 - 2 * Math.Atan(ts * Math.Pow((1.0 - con) / (1.0 + con), COM)) - phi;
                    phi += dphi;
                    i++;
                }
                return RadToDeg(phi);
            }
    
            private static double RadToDeg(double rad)
            {
                return rad * RAD2Deg;
            }
    
            private static double DegToRad(double deg)
            {
                return deg * DEG2RAD;
            }
        }
        /********************************************************/
    occhio che più ti avvicini al polo e meno è preciso !!!!

    altra possibilità è quella di usare (se ne hai la possibilità) DirectX e trattare il mondo come una sfera, ma probabilmente è meglio (oltre che più rapido anche meno farraginoso) Mercatore!


  8. #8
    si ma potrei farlo anche senza se è vero che:

    1/60 di grado (e cioè 1') = 1,855 km

    giusto?

  9. #9
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Ciao,
    andando per logica e trattando il mondo come una sfera è probabile (non sono stato a fare i calcoli precisi perchè tanto precisione così non ne avrei tanta!), ma se posso avere maggiore precisione (praticamente si avvicina alla perfezione Mercatore) con poco o nessuno sforzo, beh... opterei per quello!
    senza considerare che, se ad esempio volessi fare una rappresentazione dell'area interessata su una mappa, ad esempio con un cerchio o un quadrato che delimita l'area in base alla scelta effettuata dall'utente (magari con una bella trackBar che allarga o stringe il marcatore in tempo reale), con Mercatore mi ritroverei il lavoro già al 99 % avendo già le coordinate X Y.

    A te la scelta.

  10. #10
    ok grazie, faccio due prove...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.