Спасибо @patL и @Wimpel, я использовал ваши предложения, чтобы найти решение этой проблемы.
Сначала я создаю пространственные линии заданного расстояния и пеленгов от начальной точки, используя destPoint::geosphere
. Затем я использую gIntersection::rgeos
, чтобы получить пространственные точки, где каждый разрез пересекает береговую линию. Наконец, я вычисляю расстояние от исходной точки до всех точек пересечения для каждой линии пересечения, соответственно, используя gDistance::rgeos
, и устанавливаю минимальное значение, т.е. ближайшее пересечение.
загрузка пакетов
pkgs=c("sp","rgeos","geosphere","rgdal") # list packages
lapply(pkgs,require,character.only=T) # load packages
создать данные
побережье
coords<-structure(list(lon =c(-6.1468506,-3.7628174,-3.24646,
-3.9605713,-4.4549561,-4.7955322,-4.553833,-5.9710693,-6.1468506),
lat=c(53.884916,54.807017,53.46189,53.363665,53.507651,53.363665,53.126998,53.298056,53.884916)), class = "data.frame", row.names = c(NA,-9L))
l=Line(coords)
sl=SpatialLines(list(Lines(list(l),ID="a")),proj4string=CRS("+init=epsg:4326"))
точка
sp=SpatialPoints(coords[5,]+0.02,proj4string=CRS("+init=epsg:4326"))
p=coordinates(sp) # needed for destPoint::geosphere
создать линии разреза
b=seq(0,315,45) # list bearings
tr=list() # container for transect lines
for(i in 1:length(b)){
tr[[i]]<-SpatialLines(list(Lines(list(Line(list(rbind(p,destPoint(p=p,b=b[i],d=200000))))),ID="a")),proj4string=CRS("+init=epsg:4326")) # create spatial lines 200km to bearing i from origin
}
расчет расстояния
minDistance=list() # container for distances
for(j in 1:length(tr)){ # for transect i
intersects=gIntersection(sl,tr[[j]]) # intersect with coastline
minDistance[[j]]=min(distGeo(sp,intersects)) # calculate distances and use minimum
}
do.call(rbind,minDistance)
В действительности исходной точкой является фрейм данных пространственной точки, и этот процесс повторяется многократно для нескольких сайтов. При выполнении пересечения также имеется ряд результатов NULL, поэтому цикл включает в себя оператор if.