Po ostatnim pytaniu możesz skorzystać z funkcji oferowanych przez pakiet rgeos , aby rozwiązać problem. Ze względu na odtwarzalność pobrałem plik kształtu dróg tanzańskich z DIVA-GIS i umieściłem go w bieżącym katalogu roboczym. Do nadchodzących zadań potrzebne będą trzy pakiety:
- rgdal do ogólnego przetwarzania danych przestrzennych
- raster do rasteryzacji danych pliku shapefile
- rgeos, aby sprawdzić skrzyżowanie dróg z szablonem rastrowym i obliczyć długości dróg
W związku z tym Twoje pierwsze wiersze mogłyby wyglądać następująco:
library(rgdal)
library(raster)
library(rgeos)
Następnie musisz zaimportować dane pliku kształtu. Zauważ, że pliki kształtów DIVA-GIS są dystrybuowane w EPSG: 4326, więc wyświetlę plik kształtu do EPSG: 21037 (UTM 37S), aby zajmować się licznikami, a nie stopniami.
roads <- readOGR(dsn = ".", layer = "TZA_roads")
roads_utm <- spTransform(roads, CRS("+init=epsg:21037"))
Do późniejszej rasteryzacji potrzebny będzie szablon rastrowy obejmujący zasięg przestrzenny pliku kształtu. Szablon rastrowy składa się domyślnie z 10 wierszy i 10 kolumn, co pozwala uniknąć zbyt długich czasów obliczeń.
roads_utm_rst <- raster(extent(roads_utm), crs = projection(roads_utm))
Teraz, gdy szablon jest skonfigurowany, przejdź przez wszystkie komórki rastra (który obecnie składa się tylko z wartości NA). Przypisując wartość „1” do bieżącej komórki, a następnie wykonując rasterToPolygons
, wynikowy plik kształtu „tmp_shp” automatycznie przechowuje zakres aktualnie przetwarzanego piksela. gIntersects
wykrywa, czy ten zakres pokrywa się z drogami. Jeśli nie, funkcja zwróci wartość „0”. W przeciwnym razie plik kształtu drogi jest przycinany przez bieżącą komórkę, a całkowita długość „linii przestrzennych” w tej komórce jest obliczana za pomocą gLength
.
lengths <- sapply(1:ncell(roads_utm_rst), function(i) {
tmp_rst <- roads_utm_rst
tmp_rst[i] <- 1
tmp_shp <- rasterToPolygons(tmp_rst)
if (gIntersects(roads_utm, tmp_shp)) {
roads_utm_crp <- crop(roads_utm, tmp_shp)
roads_utm_crp_length <- gLength(roads_utm_crp)
return(roads_utm_crp_length)
} else {
return(0)
}
})
Na koniec możesz wstawić obliczone długości (które są konwertowane na kilometry) do szablonu rastra i wizualnie zweryfikować swoje wyniki.
roads_utm_rst[] <- lengths / 1000
library(RColorBrewer)
spplot(roads_utm_rst, scales = list(draw = TRUE), xlab = "x", ylab = "y",
col.regions = colorRampPalette(brewer.pal(9, "YlOrRd")),
sp.layout = list("sp.lines", roads_utm),
par.settings = list(fontsize = list(text = 15)), at = seq(0, 1800, 200))
vignette('over', package = 'sp')
może pomóc.