如何绘制 density.lpp 中的特定片段

how to plot specific segment from density.lpp

我使用 density.lpp 进行核密度估计。我想在其中选择特定的部分并通过所选部分绘制估计值。例如,我有一条道路是两个路段的组合。每个部分都有不同的长度,所以我不知道每个部分被分成多少部分。

这里是顶点的位置和路段 ID。 https://www.dropbox.com/s/fmuul0b6lus279c/R.csv?dl=0

这是我用来在网络上创建空间线数据框和随机点并获得密度估计的代码。

有没有办法知道每个段被分成多少块?或者,如果我想绘制所选细分市场的位置与估计值,我该怎么做?使用 dimyx=100 创建了 199 个估计点,但我不知道其中有多少属于 Swid=1 或 Swid=2。

我使用的一种方法是,使用 gDistance 它在这个问题上工作得很好,因为这些段连接到一个方向但是,当有 4 种连接方式时,一些 lambda 值连接到另一个段,这是不属于那个段。我提供图片并圈出2个点,当我使用gDistance时,那些点连接到其他段。有任何想法吗?

R=read.csv("R.csv",header=T,sep=",")
R2.1=dplyr::select(R, X01,Y01,Swid)

coordinates(R2.1) = c("X01", "Y01")
proj4string(R2.1)=CRS("+proj=utm +zone=17 +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0")
plot(R2.1,main="nodes on the road")


## 
LineXX <- lapply(split(R2.1, R2.1$Swid), function(x) Lines(list(Line(coordinates(x))), x$Swid[1L]))

## 
linesXY <- SpatialLines(LineXX)
data <- data.frame(Swid = unique(R2.1$Swid))
rownames(data) <- data$Swid
lxy <- SpatialLinesDataFrame(linesXY, data)
proj4string(lxy)=proj4string(trtrtt.original)

W.1=as.linnet.SpatialLines(lxy)

Rand1=runiflpp(250, W.1) 
Rand1XY=coords(Rand1)[,1:2]

W2=owin(xrange=c(142751.98, 214311.26), yrange=c(3353111, 3399329))

Trpp=ppp(x=Rand1XY$x, y=Rand1XY$y, window=W2)    ### planar point object
L.orig=lpp(Trpp,W.1) # discrete 
plot(L.orig,main="Original with accidents")


S1=bw.scott(L.orig)[1]  # in case to change bandwitdh
Try274=density(L.orig,S1,distance="path",continuous=TRUE,dimyx=100)  
L=as.linnet(L.orig)
length(Try274[!is.na(Try274$v)])
[1] 199

这是关于 spatstat 包的问题。

density.lpp 的结果是 class linim 的对象。对于任何此类对象,您可以使用 as.data.frame 来提取数据。这会为网络上的每个样本点生成一个包含一行的数据框。对于每个样本点,数据是xc, yc(最近像素中心的坐标),x,y(网络上样本点的精确坐标),seg(段标识符),tp(沿线段的相对位置)和 values(密度值)。如果按 seg 列拆分数据框,您将获得网络各个段的数据。

不过,您似乎需要有关 density.lpp 内部运作的信息。为了在计算阶段获得足够的准确性,density.lpp 将每个网段细分为许多短段(使用一组复杂的规则)。 当最终结果被离散化为 linim 对象并返回时,此信息将丢失。属性 "dx" 报告在计算阶段使用的短段的长度,仅此而已。

如果你直接给我发邮件,我可以告诉你如何提取内部信息。