【问题标题】:as.linnet function causes to hang the machineas.linnet 函数导致挂机
【发布时间】:2016-12-18 11:03:41
【问题描述】:

我正在使用以下代码将 shapefile 读取为 linnet 对象,在我使用 as.linnet 的最后一行中,进程只是挂起,我必须强制退出 Rstudio,不知道出了什么问题?我在 CRAN 和 github 上都尝试了这两个包,但都有相同的结果:Rstudio 挂起。

library(spatstat)
library(maptools)
library(sp)
setwd("~/documents/rwork/traced")
roads<-readShapeSpatial('NLroads')
spatstat.roads<-as.psp(roads)
#when I do head(spatstat.roads), it gives me only 5 line segments
#while the shapefile has 174 line segments
plot(spatstat.roads)
final_roads<-as.linnet(spatstat.roads)

我不知道是不是我的 shapefile 有问题?我也不知道是什么意思:

In as.psp.SpatialLinesDataFrame(roads) : 1 columns of data frame discarded

here 是我正在读取的行数据。任何帮助都会很棒。谢谢。

【问题讨论】:

    标签: spatstat


    【解决方案1】:

    简短的回答:您的数据集很大;在最后一行设置参数sparse=TRUE,然后给计算机几分钟。

    长答案:SpatialLines 对象基本上是曲线列表,每条曲线由一系列直线段组成。您的数据集roads 有 174 条曲线,总共由 38635 条直线段组成(因此每条曲线中平均有超过 200 条线段)。当您执行as.psp(roads) 时,您只提取直线段,因此其中有 38635 个(如果您键入对象的名称,这将被打印出来,或者您可以使用 nsegments 来计算它们)。当您键入 head(spatstat.roads) 时,您只会获得前 5 个条目。

    您的数据集是一个SpatialLinesDataFrame,其中每条曲线都带有附加数据。这些额外的数据列目前被as.psp 忽略,因此它会发出警告,指出它已忽略它们。如果需要,可以从原始对象中提取它们。

    命令as.linnet(spatstat.roads) 调用函数as.linnet.psp。这试图猜测您打算加入线性网络中的哪些线段。它通过查找两个不同段具有相同端点或非常接近端点的情况来做到这一点。参数eps 控制接近阈值。更重要的是,参数sparse 确定是否使用网络拓扑的稀疏矩阵表示。对于这种大小的数据集,你肯定需要稀疏矩阵,所以设置sparse=TRUE

    【讨论】:

    • 谢谢。我会试试你的建议。我将另外发布两个问题,以免在这里混淆。
    • 谢谢你,我听从了你的建议,将顶点数减少到 5000,并按照你的建议另外使用了 sparse=TRUE。它要快得多。您能否告诉我将来如何在带入 spatstat 之前检查顶点数,以便我可以事先减少它们。谢谢
    • 我不知道您如何检查您可能正在使用的 GIS 软件中的顶点数。快速计算 R 中 SpatialLines 对象中的顶点数:length(unlist(coordinates(roads)))/2-length(roads) 其中roads 是您的对象。请考虑接受答案,以便我们看到您的问题已解决。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2014-05-11
    • 2014-08-14
    相关资源
    最近更新 更多