fbpx

La matrice delle distanze con MapPoint

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:

  1. Geocodifica dei dati
  2. Creazione della matrice delle distanze
  3. 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];

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

7 commenti su “La matrice delle distanze con MapPoint”

  1. 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!

  2. Gian Paolo Calzolaro

    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

  3. 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

  4. Gian Paolo Calzolaro

    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)).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

— il nuovo servizio per i piccoli commercianti —

Bottega Digitale

[]