R 如何沿直线找到路径,直到它第一次与多边形相交?

R 如何沿直线找到路径,直到它第一次与多边形相交?,r,sf,R,Sf,我有一条与多边形相交的有序点序列的路径。我想提取第一个多边形相交之前的直线部分 我试图通过计算与多边形的差异来分割路径,但直线也会在其自身交点上分割(参见示例)。我需要从起点一直提取路径的完整部分,直到它第一次与多边形相交(示例中为蓝色正方形) #一条与自身相交的不稳定线 l=sf::st_线串(cbind(cos((0:100)*pi/50),sin((0:100)*pi/15))) #与直线相交的多边形 p=sf::st_多边形(列表(cbind(c(-3,-.3,-.2,-.2,-.3),

我有一条与多边形相交的有序点序列的路径。我想提取第一个多边形相交之前的直线部分

我试图通过计算与多边形的差异来分割路径,但直线也会在其自身交点上分割(参见示例)。我需要从起点一直提取路径的完整部分,直到它第一次与多边形相交(示例中为蓝色正方形)

#一条与自身相交的不稳定线
l=sf::st_线串(cbind(cos((0:100)*pi/50),sin((0:100)*pi/15)))
#与直线相交的多边形
p=sf::st_多边形(列表(cbind(c(-3,-.3,-.2,-.2,-.3),c(-3,-.2,-.2,-.3)))
#问题的形象化
地块(l)
绘图(p,add=TRUE,col=“蓝色”)
#当路径自身相交和分开时,获取差异的第一个片段不起作用
d=sf::st_差(l,p)
绘图(sf::st_linestring(d[[1]]),add=TRUE,col=“red”)

在本例中,路径由所有交点分割(甚至在其自身上),因此路径的第一部分不会一直延伸到多边形。我怀疑sf包中有一个函数专门用于我的目的,但我还没有找到它。

自相交的线字符串不是“简单的”(请参见
st_is_simple(l)
),即使它是“有效的”(请参见
st_is_valid(l)
),并且
sf
这里为您提供了一个简单的特性。我们需要做的是使用简单的线串并重建较长的线特征

首先将摆动线与多边形-
d
区分开来,然后是一条多线:

> d = st_difference(l,p)
如果我们将其转换为一个
sfc
,然后将其转换为线串,我们将得到单独线串几何图形中的零件:

> dl = st_cast(st_sfc(d),"LINESTRING")
其中有8个:

> length(dl)
[1] 8
从第一个开始,我们需要跟随多少直到我们到达多边形?让我们来获取线段与多边形的交点-这是一个稀疏列表-如果没有交点,元素长度为0,如果有交点,元素长度大于0:

> sint = st_intersects(dl,p)
该列表的第一个元素不是零是命中多边形的第一行字符串:

> min(which(lengths(sint)>0))
[1] 3
这意味着我们到多边形的线是前三条线:

> dl[1:3]
Geometry set for 3 features 
geometry type:  LINESTRING
dimension:      XY
bbox:           xmin: -0.220294 ymin: -0.9945219 xmax: 1 ymax: 0.9945219
epsg (SRID):    NA
proj4string:    NA
LINESTRING (1 0, 0.9980267 0.2079117, 0.9921147...
LINESTRING (0.9510565 0.8660254, 0.9297765 0.95...
LINESTRING (0.309017 -0.8660254, 0.309017 -0.86...
可以将这些要素合并为一个要素并打印:

> plot(l)
> plot(p,add=TRUE,col="red")
> topoly = st_union(dl[1:3])
> plot(topoly, add=TRUE, lwd=3)

自交线字符串不是“简单的”(请参见
st\u is\u simple(l)
),即使它是“有效的”(请参见
st\u is\u valid(l)
),这里为您提供了一个简单的功能。我们需要做的是使用简单的线串并重建较长的线特征

首先将摆动线与多边形-
d
区分开来,然后是一条多线:

> d = st_difference(l,p)
如果我们将其转换为一个
sfc
,然后将其转换为线串,我们将得到单独线串几何图形中的零件:

> dl = st_cast(st_sfc(d),"LINESTRING")
其中有8个:

> length(dl)
[1] 8
从第一个开始,我们需要跟随多少直到我们到达多边形?让我们来获取线段与多边形的交点-这是一个稀疏列表-如果没有交点,元素长度为0,如果有交点,元素长度大于0:

> sint = st_intersects(dl,p)
该列表的第一个元素不是零是命中多边形的第一行字符串:

> min(which(lengths(sint)>0))
[1] 3
这意味着我们到多边形的线是前三条线:

> dl[1:3]
Geometry set for 3 features 
geometry type:  LINESTRING
dimension:      XY
bbox:           xmin: -0.220294 ymin: -0.9945219 xmax: 1 ymax: 0.9945219
epsg (SRID):    NA
proj4string:    NA
LINESTRING (1 0, 0.9980267 0.2079117, 0.9921147...
LINESTRING (0.9510565 0.8660254, 0.9297765 0.95...
LINESTRING (0.309017 -0.8660254, 0.309017 -0.86...
可以将这些要素合并为一个要素并打印:

> plot(l)
> plot(p,add=TRUE,col="red")
> topoly = st_union(dl[1:3])
> plot(topoly, add=TRUE, lwd=3)

是的-这正是我需要的。非常感谢。这是第二步:将
多行字符串
转换为
行字符串列表
,这一点至关重要。作为
sf
软件包的新手,很难理解为什么
st_intersects
应该为
多行
多点
返回一个值。多线几何体和多线几何体之间的区别完全澄清了这一点。是的,这正是我所需要的。非常感谢。这是第二步:将
多行字符串
转换为
行字符串列表
,这一点至关重要。作为
sf
软件包的新手,很难理解为什么
st_intersects
应该为
多行
多点
返回一个值。多线几何图形和多线几何图形之间的区别完全消除了这一点。