我有一个需要清理的大型AddressIds数据集。最终用户可以自己输入属于AddressId的坐标,因此一些AddressIds具有许多(> 20)经度和纬度略有不同(有时只有几米)。例如:
AddressID Longitude Latitude
1234 77.037692 38.89864
1234 77.037872 38.88775
1234 77.048522 38.78553
现在,我想在R的帮助下确定哪个经度和哪个纬度是最准确的。取中等或类似的东西是不可能的,因为坐标略有不同,几乎从未输入完全相同的坐标。
我的想法是,与其他经度(分别为纬度)的最短距离的经度(分别为纬度)应该是最准确的。现在我想知道哪种方法和方法可以用来回答这样的问题。
答案 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非常接近。
但是,嘿,我今天学到了一些关于球面坐标系的东西,所以即使这种情况下降到地狱我也很享受。