【问题标题】:Method to determine 'true' address location in R在 R 中确定“真实”地址位置的方法
【发布时间】:2017-01-15 13:34:26
【问题描述】:

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

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

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

我的想法是,与另一个经度(分别是纬度)的距离最短的经度(分别是纬度)应该是最准确的。现在我想知道我最适合使用哪种包和方法来回答这样的问题。

【问题讨论】:

  • 与您相关的内容! gis.stackexchange.com/questions/7555/…
  • 如果一个AddressId只有两条记录,应该如何记录最准确?平均两条记录还是随机选择一条?
  • 看一下ggmap包。函数 geocode 将根据谷歌返回地址的纬度和经度。当然,这是否是“真的”还有待商榷。

标签: r geocoding prediction


【解决方案1】:

我尝试使用我在 cmets 中链接的方法,只需要基本功能:

# 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)]

结果与仅计算经度和纬度的方法部分不同,可能是因为您给定的经度/纬度非常接近。

但是,嘿,我今天学到了一些关于球坐标系的知识,所以即使这被否决了,我也玩得很开心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多