Я перебираю несколько адресов, чтобы создать «зоны обслуживания» или буферы в зависимости от расстояния до дороги. Чтобы минимизировать время вычислений, я сначала буферизирую сеть, чтобы уменьшить количество узлов в сети. Тем не менее, отсечение сети до кольцевого буфера часто приводит к появлению «бесхозных» дорог, которые больше не связаны ни с чем. Результатом этого является то, что код не может достичь всех узлов, чтобы вычислить расстояние вдоль края (дороги). Я ищу функцию, которая позволила бы мне удалить эти небольшие отключенные сети, чтобы они не выдавали ошибку.
Отключенные сети http://tinypic.com/r/35c3mlu/9
# Convert the road network to local projection (UTM 18N)
roads_utm <- st_transform(roadsReclass, 2959)
for(r in 1:nrow(Addresses)) {
row <- Addresses[r,]
# Coordinates of the address
st_origin <- st_point(c(row$x,row$y))
point <- st_sfc(st_origin, crs = 4326)
point <- st_transform(point, 2959)
#Create buffer around the address and extract smaller road network
buffer <- st_buffer(point,10000)
roads_sub <- st_intersection(buffer, roads_utm)
roads_sub_sf <- st_sf(geometry = roads_sub)
roads_sld <- as(roads_sub_sf, 'Spatial')
roads_sld$length <- line_length(roads_sld)
#Connect the roads in the network
network <- overline(roads_sld, attrib='length')
sln_sub <- SpatialLinesNetwork(network)
# Find the node
xcoord <- st_coordinates(point)[1]
ycoord <- st_coordinates(point)[2]
origin_node <- find_network_nodes(sln_sub, xcoord, ycoord)
#Get number of nodes to use as an iterator
nodes <- sln2points(sln_sub)
nNodes <- length(nodes)
for(n in 1:nNodes){
node <- n
shortRoute <- sum_network_routes(sln_sub, origin_node, node, sumvars = "length")
if(shortRoute$sum_length < 10000){
shortRoutes <- rbind(shortRoutes,shortRoute)
}
}
}
plot(shortRoutes)
Ошибка:
В Structure_properties.c: 4597: Не удалось достичь некоторых вершин. Ошибка в if (shortRoute $ sum_length <10000) {:
пропущенное значение, где требуется ИСТИНА / ЛОЖЬ </p>
Конечно, если у кого-то есть лучший метод для областей обслуживания в R, я был бы рад использовать другой подход.