2015-08-20 4 views
1

Мне нужно быстро определить, пересекаются ли пространственный многоугольник и пространственная линия. В настоящее время я преобразовываю polgon в пространственную линию и используя gIntersection(). Может ли кто-нибудь предложить потенциально более быстрый метод? Возможно, используя растры вместо пространственной линии или что-то еще. Мне нужно делать это много тысяч раз.Есть ли более быстрая альтернатива «gIntersection»?

# .shp file to Spatial Line 
polygon1 <- readShapeSpatial("C:.../SALandmass.shp") 
polygon1filled <- SpatialPolygons(list(Polygons(list([email protected][[1]]@Polygons[[1]]),ID=1))) 
SL <- as(polygon1filled, "SpatialLines") 


# Test if line between two coordinates cross the shape 
Pt1 = list(x = c(CurrentLong, MapCoordsm$x[i]), y = c(CurrentLat, MapCoordsm$y[i])) 
SpatialLine1 = SpatialLines(list(Lines(Line(cbind(Pt1$x,Pt1$y)), "L1"))) 
cross <- length(gIntersection(SpatialLine1, SL)) 
+0

Я бы предложил перенести этот вопрос [gis.stackexchange] (http://gis.stackexchange.com/questions/tagged/r), обеспечивая более контекст и коды. –

+0

как определяются ваши пространственные линии? в каком измерении вы рассуждаете и что вы пытались сделать до сих пор? –

+0

Я никогда не слышал о 'gIntersect()'. Возможно, вы спрашиваете о 'gIntersects()'? Как вы его используете? –

ответ

2

gIntersection Где возвращает геометрию с пересечением, gIntersects возвращает логическое, указывающее, пересекаются ли две геометрии.

2

Спасибо за вход Edzer и другие.

Я провел некоторое испытание по вашим предложениям, и кажется, что gIntersects() имеет огромное значение. Это в основном то же самое, чтобы сначала преобразовать многоугольник в пространственные линии или просто использовать многоугольник.

Вот результаты теста:

# Original approach 
system.time({   
    Pt1 = list(x = c(long1, long2), y = c(lat1, lat2)) 
    SpatialLine1 = SpatialLines(list(Lines(Line(cbind(Pt1$x,Pt1$y)), "L1"))) 
    cross <- length(gIntersection(SpatialLine1, SL)) 
}) 

## user system elapsed 
## 0.53 0.00 0.53 

# Edzer suggestion: using gIntersects 
system.time({   
    Pt1 = list(x = c(long1, long2), y = c(lat1, lat2)) 
    SpatialLine1 = SpatialLines(list(Lines(Line(cbind(Pt1$x,Pt1$y)), "L1"))) 
    cross <- (gIntersects(SpatialLine1, SL)) 
}) 

# user system elapsed 
# 0.06 0.00 0.06    

# Edzer suggestion 2: using a polygon rather that spacial lines 
system.time({   
    Pt1 = list(x = c(long1, long2), y = c(lat1, lat2)) 
    SpatialLine1 = SpatialLines(list(Lines(Line(cbind(Pt1$x,Pt1$y)), "L1"))) 
    cross <- length(gIntersection(SpatialLine1, polygon1filled)) 
}) 

# user system elapsed 
# 0.43 0.05 0.48    

# Edzer suggestion 1&2: using a polygon rather that spacial lines and gIntersects 
system.time({   
    Pt1 = list(x = c(long1, long2), y = c(lat1, lat2)) 
    SpatialLine1 = SpatialLines(list(Lines(Line(cbind(Pt1$x,Pt1$y)), "L1"))) 
    cross <- (gIntersects(SpatialLine1, polygon1filled)) 
})    

# user system elapsed 
# 0.06 0.00 0.07 
Смежные вопросы