确定R中“真实”地址位置的方法

时间:2017-01-15 13:34:27

标签: r geocoding prediction

我有一个需要清理的大型AddressIds数据集。最终用户可以自己输入属于AddressId的坐标,因此一些AddressIds具有许多(> 20)经度和纬度略有不同(有时只有几米)。例如:

AddressID      Longitude        Latitude
1234           77.037692        38.89864
1234           77.037872        38.88775
1234           77.048522        38.78553

现在,我想在R的帮助下确定哪个经度和哪个纬度是最准确的。取中等或类似的东西是不可能的,因为坐标略有不同,几乎从未输入完全相同的坐标。

我的想法是,与其他经度(分别为纬度)的最短距离的经度(分别为纬度)应该是最准确的。现在我想知道哪种方法和方法可以用来回答这样的问题。

1 个答案:

答案 0 :(得分:2)

我使用了我在评论中链接的方法,只需要基本功能:

# Read in data.
df <- read.table(header = TRUE, text = "AddressID      Longitude        Latitude
1234           77.037692        38.89864
                 1234           77.037872        38.88775
                 1234           77.048522        38.78553")


# Get the radians.
df$LongitudeRadians <- df$Longitude * pi / 180
df$LatitudeRadians <- df$Latitude * pi / 180

# Get the cartesian coordinates.
df$x <- sin(df$LatitudeRadians) * cos(df$LongitudeRadians)
df$y <- sin(df$LatitudeRadians) * sin(df$LongitudeRadians)
df$z <- cos(df$LatitudeRadians)

# Get the means.
avgs <- aggregate.data.frame(df[c(1,6:8)], by = list(df$AddressID), FUN = "mean")

# Convert back to degrees.
avgs$LongitudeRadians <- atan2(avgs$y, avgs$x)
avgs$LatitudeRadians <- atan2(sqrt(avgs$x^2 + avgs$y^2), avgs$z)

avgs$Longitude <- avgs$LongitudeRadians * 180 / pi
avgs$Latitude <- avgs$LatitudeRadians * 180 / pi

avgs <- avgs[c(2,8:9)]

结果是分数与仅采用经度和纬度的方法不同,可能是因为你给定的long / lat非常接近。

但是,嘿,我今天学到了一些关于球面坐标系的东西,所以即使这种情况下降到地狱我也很享受。