Consideriamo il caso in cui abbiamo bisogno di calcolare la distanza tra n deposti di partenza e m deposti di arrivo. Le operazioni da realizzare per ottenere quanto desiderato sono le seguenti:
- Geocodifica dei dati
- Creazione della matrice delle distanze
- Calcolo della distanza
Con la prima operazione andiamo a trasformare l’indirizzo dei nostri deposti in coordinate geografiche, come abbiamo visto in un post precedente possiamo utilizzare la macro del foglio di calcolo excel2kml-address.xls per ottenere la latitudine e la longitudine dei nostri deposti, tale operazione non sempre perfetta pertanto è necessario verificare i dati che non sono stati geocodificati correttamente, una buona base di partenza sicuramente potrebbe essere di scrivere in maniera corretta ed omogenea tutti i dati all’interno del proprio gestionale.
Con la seconda operazione andiamo ad incrociare la tabella con i depositi di partenza con quella dei depositi di destinazione in modo da avere tutte le combinazioni possibili di partenza ed arrivo. Su questa tabella poi applicheremo la funzione per il calcolo della distanza. Per ottenere la matrice delle distanze utilizziamo una query di creazione tabella:
SELECT [DEPOSITI PARTENZA].[DEPOSITO PARTENZA], [DEPOSITI PARTENZA].LATPAR, [DEPOSITI PARTENZA].LONPAR, [DEPOSITI DESTINAZIONE].[DEPOSITO DESTINAZIONE], [DEPOSITI DESTINAZIONE].LATDES, [DEPOSITI DESTINAZIONE].LONDES, 0.0001 AS DISTANZA INTO [Matrice Distanze] FROM [DEPOSITI DESTINAZIONE], [DEPOSITI PARTENZA]; |
SELECT [DEPOSITI PARTENZA].[DEPOSITO PARTENZA], [DEPOSITI PARTENZA].LATPAR, [DEPOSITI PARTENZA].LONPAR, [DEPOSITI DESTINAZIONE].[DEPOSITO DESTINAZIONE], [DEPOSITI DESTINAZIONE].LATDES, [DEPOSITI DESTINAZIONE].LONDES, 0.0001 AS DISTANZA INTO [Matrice Distanze] FROM [DEPOSITI DESTINAZIONE], [DEPOSITI PARTENZA];
L’ultima operazione è quella che ci consente di calcolare la distanza nella matrice delle distanze, per quesa operazione abbiamo due opzioni, la prima consiste nell’utilizzare una funzione trigonometrica chiamata del seno inverso una formula in trigonometria sferica utile alla navigazione per calcolare le distanze tra due punti su una sfera, in questo caso però otteniamo una distanza in linea d’aria che può essere utile se non ci serve sapere i km effettivi tra due località ma il loro ordine di grandezza. Se invece siamo interessati ad avere un dato preciso dobbiamo ricorrere all’utilizzo di MapPoint che consente il calcolo chilometrico delle distanze tra due punti. Per poter utilizzare il motore cartografico di MapPoint in Access è necessario inserire nei riferimenti nel modulo VBA il riferimento alla libreria di MapPoint, in questo modo possiamo utilizzarne gli oggetti per costruire la funzione che permette il calcolo della distanza. La funzione seguente scrive sulla tabella della matrice delle distanze le distanze tra due punti, per poterla utilizzare bisogna passargli come argomenti il nome della tabella della matrice delle distanze, il nome del campo con la latitudine di partenza, il nome del campo con la longitudine di partenza, il nome del campo con la latitudine di destinazione, il nome del campo con la longitudine di destinazione ed il nome del campo in cui verrà scritta la distanza.
Public Function distanza(TabellaDistanze, CampoLATPAR, CampoLONPAR, CampoLATDES, CampoLONDES, CampoDISTANZA) Dim objApp As New MapPoint.Application Dim objMap As MapPoint.Map Dim objRoute As MapPoint.Route Dim inizio As MapPoint.Location Dim fine As MapPoint.Location Dim db As DAO.Database Dim tabella As DAO.Recordset Dim campo As DAO.Field Set objMap = objApp.ActiveMap Set objRoute = objMap.ActiveRoute objApp.Visible = False objApp.UserControl = False Set db = CurrentDb Set tabella = db.OpenRecordset(TabellaDistanze, dbOpenDynaset) Set campo = tabella.Fields(CampoDISTANZA) Do Until tabella.EOF LATPAR = tabella.Fields(CampoLATPAR) LONPAR = tabella.Fields(CampoLONPAR) LATDES = tabella.Fields(CampoLATDES) LONDES = tabella.Fields(CampoLONDES) Set inizio = objMap.GetLocation(LATPAR, LONPAR) Set fine = objMap.GetLocation(LATDES, LONDES) objRoute.Waypoints.Add inizio objRoute.Waypoints.Add fine objRoute.Calculate distanza = objRoute.Distance tabella.Edit campo = distanza tabella.Update objRoute.Waypoints.Item(1).Delete objRoute.Waypoints.Item(1).Delete tabella.MoveNext Loop objMap.Saved = True objApp.Quit End Function |
Public Function distanza(TabellaDistanze, CampoLATPAR, CampoLONPAR, CampoLATDES, CampoLONDES, CampoDISTANZA) Dim objApp As New MapPoint.Application Dim objMap As MapPoint.Map Dim objRoute As MapPoint.Route Dim inizio As MapPoint.Location Dim fine As MapPoint.Location Dim db As DAO.Database Dim tabella As DAO.Recordset Dim campo As DAO.Field Set objMap = objApp.ActiveMap Set objRoute = objMap.ActiveRoute objApp.Visible = False objApp.UserControl = False Set db = CurrentDb Set tabella = db.OpenRecordset(TabellaDistanze, dbOpenDynaset) Set campo = tabella.Fields(CampoDISTANZA) Do Until tabella.EOF LATPAR = tabella.Fields(CampoLATPAR) LONPAR = tabella.Fields(CampoLONPAR) LATDES = tabella.Fields(CampoLATDES) LONDES = tabella.Fields(CampoLONDES) Set inizio = objMap.GetLocation(LATPAR, LONPAR) Set fine = objMap.GetLocation(LATDES, LONDES) objRoute.Waypoints.Add inizio objRoute.Waypoints.Add fine objRoute.Calculate distanza = objRoute.Distance tabella.Edit campo = distanza tabella.Update objRoute.Waypoints.Item(1).Delete objRoute.Waypoints.Item(1).Delete tabella.MoveNext Loop objMap.Saved = True objApp.Quit End Function
7 commenti su “La matrice delle distanze con MapPoint”
Dove è possibile scaricare il file excel2kml-address.xls?
Ciao e grazie!
è possibile scaricare il file a questo indirizzo
Il link non va, ma ho trovato una soluzione attraverso il sito batchgeo.com/it, col quale riesco a ottenere il file kml.
Non mi è chiaro il passo 2, con che programma devo fare quella query?
Ciao e grazie!
Salve il programma da utilizzare per eseguire è MS Access nel quale vanno create le due tabelle con i punti di partenza e di arrivo. Sto preparando un report sull’utilizzo di MapPoint che a breve sarà disponibile sul sito con maggiori dettagli.
Saluti Gian Paolo
Salve sto cercando un foglio di calcolo già pronto dove mi basterebbe scrivere il nome della città di partenza e il nome della città di arrivo per avere i chilometri percorsi.
Qualcuno mi potrebbe aiutare? Grazie
Buongiorno è possibile costruire un foglio excel con l’algoritmo indicato nell’articolo considerando tutti i comuni italiani ma l’elaborazione sarebbe molto lunga (perchè si tratta di 64.000.000 di combinazioni) altrimenti l’altra possibilità è di utilizzare una formula in excel per calcolare la distanza tra due coordinate geografiche che se hanno longitudine rispettivamente r1 ed r2, e latitudine t1 e t2, hanno coordinate rispettivamente
(R*cos(r1)*cos(t1), R*sin(r1)*cos(t1), R*sin(t1)) e (R*cos(r2)*cos(t2), R*sin(r2)*cos(t2), R*sin(t2)).
Grazie Gian Paolo per il codice. Sto pensando di implementarlo sul mio sito. Saluti