使用leaflet
,我试图绘制一些线条,并根据'speed'变量设置颜色。我的数据从编码的折线级别(即一系列纬度/长点,编码为字母数字字符串)开始,每个EPL都有一个速度值。
我能够解码折线以获得纬线/长线系列(感谢Max,here)并且我能够从这些点系列中创建线段并将它们格式化为{{1对象(感谢Kyle Walker,here)。
我的问题:我可以使用SpatialLines
正确绘制线条,但我无法将SpatialLines对象连接到基础数据以创建SpatialLinesDataFrame,因此我无法根据速度变化我怀疑问题是我分配SL段的ID与基本df中的ID不匹配。
我尝试加入的对象leaflet
:
“sl_object”,一个SpatialLinesDataFrame()
个对象,有〜140个观察值,每个段一个;我正在使用上面链接的Kyle代码和一个密钥更改 - 而不是为每个段创建任意迭代ID值,我从我的基础数据中提取关联的ID。 (或者至少我正在尝试。)所以,我已经取代了:
SpatialLines
带
id <- paste0("line", as.character(p))
“speed_object”,一个df,对单个速度变量进行约140次观察,lguy <- data.frame(paths[[p]][1])
id <- unique(lguy[,1])
设置为我认为我在上面的SL对象中创建的相同id var。 (观察次数不会超过但可能小于SL对象中的段数。)
我的加入代码:
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
答案 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)
是“空间线数据框”。
class()
我的印象是,为您填充的错误是因为您试图将数据框强制转换为数据框而R不是它的粉丝。