从SpatialLines对象和基本df创建SpatialLinesDataFrame

时间:2015-10-15 14:44:00

标签: r sp

使用leaflet,我试图绘制一些线条,并根据'speed'变量设置颜色。我的数据从编码的折线级别(即一系列纬度/长点,编码为字母数字字符串)开始,每个EPL都有一个速度值。

我能够解码折线以获得纬线/长线系列(感谢Max,here)并且我能够从这些点系列中创建线段并将它们格式化为{{1对象(感谢Kyle Walker,here)。

我的问题:我可以使用SpatialLines正确绘制线条,但我无法将SpatialLines对象连接到基础数据以创建SpatialLinesDataFrame,因此我无法根据速度变化我怀疑问题是我分配SL段的ID与基本df中的ID不匹配。

我尝试加入的对象leaflet

  1. “sl_object”,一个SpatialLinesDataFrame()个对象,有〜140个观察值,每个段一个;我正在使用上面链接的Kyle代码和一个密钥更改 - 而不是为每个段创建任意迭代ID值,我从我的基础数据中提取关联的ID。 (或者至少我正在尝试。)所以,我已经取代了:

    SpatialLines

    id <- paste0("line", as.character(p))

  2. “speed_object”,一个df,对单个速度变量进行约140次观察,lguy <- data.frame(paths[[p]][1]) id <- unique(lguy[,1])设置为我认为我在上面的SL对象中创建的相同id var。 (观察次数不会超过但可能小于SL对象中的段数。

  3. 我的加入代码:

    row.names

    结果:

    splndf <- SpatialLinesDataFrame(sl = sl_object, data = speed_object)

    谢谢,所有。我发布这部分是因为我看到了一些类似的问题 - 包括一些专门提到改变Kyle伟大工具的ID输出的问题 - 而且还没有找到一个好的答案。

    编辑:包括数据样本。

    来自sl_obj,单个片段:

    row.names of data and Lines IDs do not match

    来自speed_obj的相应记录:

    print(sl_obj)
    
    Slot "ID":
    [1] "4763655"
    
    [[151]]
    An object of class "Lines"
    Slot "Lines":
    [[1]]
    An object of class "Line"
    Slot "coords":
               lon      lat
    1955 -74.05228 40.60397
    1956 -74.05021 40.60465
    1957 -74.04182 40.60737
    1958 -74.03997 40.60795
    1959 -74.03919 40.60821
    

3 个答案:

答案 0 :(得分:4)

要摆脱此错误消息,请通过准备sl_object和/或speed_object来使数据的行号和行ID匹配,或者,如果您确定它们应该是按照它们出现的顺序匹配,使用

splndf <- SpatialLinesDataFrame(sl = sl_object, data = speed_object, match.ID = FALSE)

?SpatialLinesDataFrame中记录了这一点。

答案 1 :(得分:2)

好吧,我明白了。这个错误并不像我提到的那样,我的speed_obj与我的sl_obj的长度不同,如上所述here(&#34; data = class data.frame的对象; 数据中的行数应该等于sl中的Lines元素数

解决方案:使用快速循环来提取所有唯一行ID,然后针对该唯一列表执行左连接以创建详尽的speed_obj(使用NAs,看起来没问题)。

ids <- data.frame()
for (i in (1:length(sl_obj))) {
id <- data.frame(sl_obj@lines[[i]]@ID)
ids <- rbind(ids, id)
}

colnames(ids)[1] <- "linkId"
speed_full <- join(ids, speed_obj)
speed_full_short <- data.frame(speed_obj[,c(-1)])
row.names(speed_full_short) <- speed_full$linkId

splndf <- SpatialLinesDataFrame(sl_obj, data = speed_full_short, match.ID = T)

现在工作正常!

答案 2 :(得分:1)

我可能已经破译了这个问题。

当我拉入空间线数据时,我会检查它所读取的类 “空间线数据框”虽然我知道它是一个简单的线性shapefile,我正在使用readOGR来传入数据,我相信这就是转换发生的地方。考虑到这一点,速度分配相对容易。

sl_object$speed <-  speed_object[ match( sl_object$ID , row.names( speed_object ) ) , "speed" ]

这应该可以解决问题,因为我愿意打赌你的class(sl_object)是“空间线数据框”。

编辑:我收到了与OP相同的错误,让我查看class()

我的印象是,为您填充的错误是因为您试图将数据框强制转换为数据框而R不是它的粉丝。