scritto da | on | 7 commenti

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

  1. elbarbier
  2. Gian Paolo Calzolaro
  3. elbarbier
  4. Gian Paolo Calzolaro
  5. alessandro
  6. Gian Paolo Calzolaro

Trackback e pingback

Non ci sono trackback e pingback dispinibili per questo articolo

Lascia un Commento

News