Domanda

Vorrei implementare un modo per visualizzare un elenco di indirizzi memorizzati ordinati per vicinanza a un determinato indirizzo.

Gli indirizzi nell'elenco verranno archiviati in una tabella del database. Parti separate hanno campi separati (abbiamo campi per codice postale, nome della città, ecc.), Quindi non è solo un varchar gigante. Questi sono inseriti dall'utente e a causa della natura del sistema potrebbe non essere sempre completo (alcuni potrebbero mancare il codice postale e altri potrebbero avere poco più di città e stato).

Anche se questo è per un'applicazione intranet, non ho problemi a utilizzare risorse esterne, incluso l'accesso a servizi Web Internet e simili. Preferirei davvero farlo rotolare il mio a meno che non sarebbe banale fare me stesso. Se Google o Yahoo! offre già un servizio gratuito, sono più che disposto a verificarlo. La parola chiave è che deve essere gratuito, in quanto non sono libero di introdurre alcun costo aggiuntivo in questo progetto per questa funzione in quanto è già un bonus "perk" per così dire.

Ci sto pensando proprio come molti brick & amp; negozi di mortaio fanno il loro " Trova una posizione " caratteristica. Mostrarlo in una semplice tabella ordinata in modo appropriato e visualizzare la distanza (in, diciamo, miglia) è fantastico. Mostrare un mash-up della mappa è ancora più interessante, ma posso sicuramente convivere con il semplice recupero della distanza e la gestione di tutti i display e l'ordinamento successivi.

Il problema con semplici algoritmi a distanza è la natura dei dati. Dal momento che tutto o parte dell'indirizzo può essere indefinito, non ho nulla di conveniente come lat / long coords. Inoltre, anche se richiedo i codici postali, il 90% degli indirizzi avrà probabilmente gli stessi cinque codici postali.

Anche se non è necessario essere velocissimi, tutto ciò che richiede più di sette secondi per essere visualizzato sulla pagina a causa della latenza potrebbe essere troppo lungo perché l'utente medio possa aspettare, come sappiamo. Se un servizio così ipotetico supporta l'invio di una serie di indirizzi contemporaneamente invece di interrogarne uno alla volta, sarebbe fantastico. Tuttavia, non dovrei pensare che l'elenco degli indirizzi supererebbe il totale di 50, se così tanti.

È stato utile?

Soluzione

Google e Yahoo! forniscono entrambi servizi di geocodifica gratuitamente. Puoi calcolare la distanza utilizzando la formula Haversine ( implementato in .NET o SQL ). Entrambi i servizi ti permetteranno di effettuare ricerche parziali (solo codice postale, solo città) e ti faranno sapere quale sia la precisione dei loro risultati (in modo da poter escludere posizioni senza informazioni significative, sebbene Yahoo! fornisca più informazioni di precisione di Google).

Altri suggerimenti

L'API di Google Maps non ti è utile a causa dei loro termini di utilizzo. Tuttavia, Yahoo offre un servizio REST per trasformare gli indirizzi in coordinate Long / Lat, che è possibile utilizzare per calcolare le distanze. È qui .

Richiedi loro di inserire un codice postale, quindi crea una tabella di database che associ il codice postale alle coppie latitudine / longitudine (o trovane uno online). Non so come sia dove lavori ma qui, il codice postale può essere specifico per diversi metri, quindi dovrebbe essere abbastanza preciso. Quindi utilizzare questo metodo per calcolare la distanza tra due codici postali:

public static double distance(double lat1, double lon1, double lat2, double lon2, char unit)
{
  double theta = lon1 - lon2;
  double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) +
    Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
  dist = Math.Acos(dist);
  dist = rad2deg(dist);
  dist = dist * 60 * 1.1515;
  if (unit == 'K')
  {
    dist = dist * 1.609344;
  }
  else if (unit == 'N')
  {
    dist = dist * 0.8684;
  }
  return (dist);
}

private static double deg2rad(double deg)
{
  return (deg * Math.PI / 180.0);
}

private static double rad2deg(double rad)
{
  return (rad / Math.PI * 180.0);
}

Il vantaggio di usare il proprio codice rispetto a un servizio di geocodifica è che puoi quindi fare un sacco di calcoli più interessanti sui dati e archiviare oggetti accanto ad essi nel tuo db.

Non puoi semplicemente utilizzare l'API di google maps per ottenere le distanze e ordinarle dalla tua parte?

http://code.google.com/apis/maps/

Suggerirei di indagare sull'API di google maps.

Richiederebbe di disporre di una connessione esterna (e per farlo correttamente deviare i dati su di esso su un servizio Web) ma fornisce ciò di cui hai bisogno, ovvero la distanza chiedendo un percorso tra 2 punti e ottenendo la distanza da esso.

Riferimento API dell'API delle indicazioni

Una cosa che abbiamo fatto nella mia azienda è imbrogliare e usare la latitudine / longitudine del codice postale (approssimativamente il centro dell'area del codice postale). Non è perfetto, ma è abbastanza vicino per quelli che mi trovano x entro miglia di y tipi di ricerche. Ciò è particolarmente utile quando gli indirizzi non possono essere riconosciuti dai servizi di pulizia degli indirizzi.

Ad un certo punto mi sono imbattuto in un codice postale gratuito nella tabella di ricerca di latitudine / longitudine da utilizzare in questa approssimazione. Mi dispiace di non avere più il collegamento a questo.

Dai un'occhiata a questo sito Web: http://geocoder.us/help/utility.shtml

Puoi elaborare i record, 1 ogni 15 secondi in questo modo: http://geocoder.us/service/distance?zip1=95472&zip2=94305

Hanno anche un servizio di abbonamento senza limiti di tempo

Qualcun altro l'ha già fatto su Daft Logic (modifica: errore di battitura). Usano l'API di Google Maps con la Formula del grande cerchio . Non credo sia difficile da implementare.

Aggiorna : in pratica, devi solo ottenere le coordinate dal tuo fornitore preferito, quindi eseguire il calcolo con il tuo codice. Puoi precaricare le coordinate dei negozi, quando gli utenti forniscono la loro posizione, puoi anche usarlo per la convalida. Quindi, quando viene effettuata la richiesta, è possibile solo cercare la posizione del cliente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top