Calculate total miles traveled from vectors of lat / lon

前端 未结 3 552
我在风中等你
我在风中等你 2020-12-02 02:10

I have a data frame with data about a driver and the route they followed. I\'m trying to figure out the total mileage traveled. I\'m using the geosphere packa

相关标签:
3条回答
  • 2020-12-02 02:35

    Be VERY careful with missing data, as distVincentyEllipsoid() returns 0 for distance between any two points with missing coordinates c(NA, NA), c(NA, NA).

    0 讨论(0)
  • 2020-12-02 02:38

    How about this?

    ## Setup
    library(geosphere)
    metersPerMile <- 1609.34
    pts <- df1[c("lon", "lat")]
    
    ## Pass in two derived data.frames that are lagged by one point
    segDists <- distVincentyEllipsoid(p1 = pts[-nrow(df),], 
                                      p2 = pts[-1,])
    sum(segDists)/metersPerMile
    # [1] 1013.919
    

    (To use one of the faster distance calculation algorithms, just substitute distCosine, distVincentySphere, or distHaversine for distVincentyEllipsoid in the call above.)

    0 讨论(0)
  • 2020-12-02 02:45
    library(geodist)
    geodist(df, sequential = TRUE, measure = "geodesic") # sequence of distance increments
    sum(geodist(df, sequential = TRUE, measure = "geodesic")) # total distance in metres
    sum(geodist(df, sequential = TRUE, measure = "geodesic")) * 0.00062137 # total distance in miles
    

    Geodesic distances are necessary here because of the long distances involved. The result is 1013.915, slightly different from less-accurate Vincenty distances of geosphere. Street network distances can also be calculated with

    library(dodgr)
    dodgr_dists(from = df)
    

    ... but there has to be a street network, which is not the case for (lat = 76, lon = -110). Where there is a street network, that will by default give you all pair-wise distances routed through the street network , from which the sequential increments are the off-diagonal.

    0 讨论(0)
提交回复
热议问题