Ege: I don't believe that this code is enough to get coercion between sp
and spatstat:
pts <- cbind(c(120:123,121,125),c(100,100,104,102,99,98))
pt2 <- cbind(c(124,124,123,118,124,125),c(100,97,100,104,106,110))
library(sp)
library(spatstat)
L1 <- SpatialLines(list(Lines(list(Line(pts)), "X")))
L2 <- SpatialLines(list(Lines(list(Line(pt2)), "X")))
l1 <- as.psp(L1)
l2 <- as.psp(L2)
int <- crossing.psp(l1, l2)
Are we relying on some other code, or perhaps a specific version of
spatstat or its family? (I know ways to convert from Spatial to psp, but I
was taken by this apparent lack of infrastructure - and I'm very keen on
seeing more bridges between these rich worlds).
Cheers, Mike
On Fri, 26 Jan 2018 at 17:48 Ege Rubak <rubak at math.aau.dk> wrote:
The `psp` class in spatstat consists of individual line segments and
`selfcrossing.psp` checks whether each individual line intersects one of
the other lines, which happens at all the points in your plot.
If instead you treat each of the two line sequences as a `psp` you can
check find the crossings of the two `psp` objects. I.e., continuing your
code (with `spatstat` and `maptools` loaded):
L1 <- SpatialLines(list(Lines(list(Line(pts)), "X")))
L2 <- SpatialLines(list(Lines(list(Line(pt2)), "X")))
l1 <- as.psp(L1)
l2 <- as.psp(L2)
int <- crossing.psp(l1, l2)
This gives you the four intersections between the lines. I don't know of
a simple way to do the next task in `spatstat`. A useful function if you
are going to try to write some code is `test.crossing.psp` which gives
you a logical matrix indicating which segments cross.
Cheers,
Ege
On 01/25/2018 11:26 PM, Glenn Stauffer wrote:
I have a Spatial Lines object I would like to split at every point where
line self-intersects (crosses or touches itself), or anywhere lines touch
each other, if there are multiple lines.
I've tried using spatstat to convert the SpatialLines to a psp object and
then use the selfcrossing.psp function to find the intersection points
example below). But that seems to identify all the nodes, not just the
points where the line crosses. Also, even if it identified only the
crossings (which is what I want), I am not sure how to perform the next
and split the lines at those points.
So, 1) I need to identify the crossings/touches, and 2) split the lines
those points.
Essentially, what I am looking for is an R equivalent to the planarize
function in ArgGIS. Is there a relatively easy way to do this in R?
Thanks,
Glenn
Here is an example of what I have tried.
pts <- cbind(c(120:123,121,125),c(100,100,104,102,99,98))
pt2 <- cbind(c(124,124,123,118,124,125),c(100,97,100,104,106,110))
projstr <- "+init=epsg:3071" # make everything in meters
L <- SpatialLines(list(Lines(list(Line(pts),Line(pt2)),"X")),proj4string
CRS(projstr))
plot(L)
PSP <- as.psp.SpatialLines(L)
int <- selfcrossing.psp(PSP)
plot(int,add=TRUE,col="red") # identifies more than just the crossings
[[alternative HTML version deleted]]