Я хотел бы идентифицировать линейные особенности, такие как дороги и реки, на растровых картах и преобразовать их в линейный пространственный объект (класс SpatialLines
), используя R.
Пакеты raster
и sp
могут использоваться для преобразования объектов из растров в векторные объекты многоугольника (класс SpatialPolygons
). rasterToPolygons()
будет извлекать ячейки определенного значения из растра и возвращать объект многоугольника. Продукт можно упростить, используя параметр dissolve=TRUE
, который вызывает процедуры в пакете rgeos
для этого.
Все это работает отлично, но я бы предпочел, чтобы это был объект SpatialLines
. Как я могу это сделать?
Рассмотрим следующий пример:
## Produce a sinuous linear feature on a raster as an example
library(raster)
r <- raster(nrow=400, ncol=400, xmn=0, ymn=0, xmx=400, ymx=400)
r[] <- NA
x <-seq(1, 100, by=0.01)
r[cellFromRowCol(r, round((sin(0.2*x) + cos(0.06*x)+2)*100), round(x*4))] <- 1
## Quick trick to make it three cells wide
r[edge(r, type="outer")] <- 1
## Plot
plot(r, legend=FALSE, axes=FALSE)
## Convert linear feature to a SpatialPolygons object
library(rgeos)
rPoly <- rasterToPolygons(r, fun=function(x) x==1, dissolve=TRUE)
plot(rPoly)
Лучше ли было бы найти осевую линию через многоугольник?
Или существует ли доступный код для этого?
EDIT: Благодаря @mdsumner для указания, что это называется скелетонизацией.