R:计算从一个点到另一个点的距离(以英里为单位)

Mrm*_*eje 3 r geospatial dplyr geosphere

我有以下数据框:

library(dplyr)

d1 <- data_frame(
title = c("base1", "base2", "base3", "base4"),
lat = c(57.3, 58.8, 47.2, 57.8),
long = c(0.4, 3.4, 3.5, 1.2))

d2 <- data_frame(
tas = c("tas1", "tas2", "tas3", "tas4"),
Base= c ("base1", "base2", "base3", "base4"),
lat=c(54.6, 56.4, 54.2, 54.6),
long = c(1.2, 3.4, 3.5, 56.6))
Run Code Online (Sandbox Code Playgroud)

我想做的是计算d2中tas与d1中标题之间的距离(以英里为单位)。因此,在d2中,tas1的坐标为54.6 lat,长度为1.2,在'Base'列中具有'base1'。所以我想计算54.6lat x 1.2long和57.3lat与0.4lon之间的距离。

我尝试使用GeoDistanceInMetresMatrix下面详细介绍的函数来执行此操作,但是该函数并没有给我想要的结构。

下面的文章提供了有关GeoDistanceInMetresMatrix的一些信息

http://eurekastatistics.com/calculating-a-distance-matrix-for-geographic-points-using-r/

这是我希望数据看起来像的样子:

 df <- data_frame(
tas = c("tas1", "tas2", "tas3", "tas4"),
Base= c ("base1", "base2", "base3", "base4"),
lat=c(54.6, 56.4, 54.2, 54.6),
long = c(1.2, 3.4, 3.5, 56.6),
difference_miles = c(23, 35, 56, 23))
Run Code Online (Sandbox Code Playgroud)

我一直在看整个下午,无法完全解决问题,因此不胜感激!

Dav*_*e2e 5

使用geosphere库可以轻松完成此操作:

d1 <- data.frame(
  title = c("base1", "base2", "base3", "base4"),
  lat = c(57.3, 58.8, 47.2, 57.8),
  long = c(0.4, 3.4, 3.5, 1.2))

d2 <- data.frame(
  tas = c("tas1", "tas2", "tas3", "tas4"),
  Base= c ("base1", "base2", "base3", "base4"),
  lat=c(54.6, 56.4, 54.2, 54.6),
  long = c(1.2, 3.4, 3.5, 56.6))

library(geosphere)
#1609.35 is the conversion from miles to meters
dist<-distGeo(d1[, c("long", "lat")], d2[, c("long", "lat")])/1609.35
df<-cbind(d2, difference_miles=dist)
Run Code Online (Sandbox Code Playgroud)


Dan*_*n Y 5

一种方法可能是使用geosphere软件包:

# slightly modify your data because I want to merge it
df1 <- data.frame(
    title = c("base1", "base2", "base3", "base4"),
    lat1  = c(57.3, 58.8, 47.2, 57.8),
    long1 = c(0.4, 3.4, 3.5, 1.2), 
    stringsAsFactors = FALSE)

df2 <- data.frame(
    title = c ("base1", "base2", "base3", "base4"),
    lat2  = c(54.6, 56.4, 54.2, 54.6),
    long2 = c(1.2, 3.4, 3.5, 56.6), 
    stringsAsFactors = FALSE)

# merge your data so you're sure your lat/long pairs make sense
df <- merge(df1, df2, by="title")

# calculate distance according to the Haversine method (shortest dist around sphere)
df$dist_meters <- geosphere::distHaversine(
    p1=df[ , c("long1", "lat1")],
    p2=df[ , c("long2", "lat2")]  )

# convert meters to miles
df$dist_miles = df$dist_meters / 1609.34
Run Code Online (Sandbox Code Playgroud)