[英]R cran : rasterized polygon and sampling site coordinates
我們正在嘗試創建 Vermeille Coast 的地圖,以便在兩點之間的路徑不穿過陸地的情況下計算采樣點之間的距離。
1/ 我們將兩個 shapefile 綁定在一起( R cran: sf Sew two MULTILINESTRING/LINESTRING )
2/我們創建了一個盒子來繪制一個多邊形( Sf包:關閉一個復雜形狀的多邊形)
3/ 我們確實柵格化了多邊形( R cran rasterize sfc_polygon )
(此處提供數據: https ://www.dropbox.com/sh/hzsdklnmvjg4hsz/AAATHLV0pkJXDvSqyRIBlVl_a?dl=0)
library(sf)
library(fasterize)
library(raster)
library(dplyr)
library(tidyverse)
frenchCoast_CoteBanyuls <- st_read("coasts_subnational_France/coasts_subnational.shp")
spainCoast_CoteBanyuls <- st_read("coasts_subnational_Spain/coasts_subnational.shp")
spainurl <- "https://geo.vliz.be/geoserver/wfs?request=getfeature&service=wfs&version=1.0.0&typename=MarineRegions:coasts_subnational&outputformat=SHAPE-ZIP&filter=%3CPropertyIsEqualTo%3E%3CPropertyName%3Emrgid_1%3C%2FPropertyName%3E%3CLiteral%3E3417%3C%2FLiteral%3E%3C%2FPropertyIsEqualTo%3E"
download.file(spainurl, "spain.zip", mode = "wb")
unzip("spain.zip", exdir = "spain", junkpaths = TRUE)
franceurl <- "https://geo.vliz.be/geoserver/wfs?request=getfeature&service=wfs&version=1.0.0&typename=MarineRegions:coasts_subnational&outputformat=SHAPE-ZIP&filter=%3CPropertyIsEqualTo%3E%3CPropertyName%3Emrgid_1%3C%2FPropertyName%3E%3CLiteral%3E19888%3C%2FLiteral%3E%3C%2FPropertyIsEqualTo%3E"
download.file(franceurl, "france.zip", mode = "wb")
unzip("france.zip", exdir = "france", junkpaths = TRUE)
spainCoast_CoteBanyuls <- list.files("spain",
pattern = "shp$",
full.names = TRUE) %>% st_read()
frenchCoast_CoteBanyuls <- list.files("france",
pattern = "shp$",
full.names = TRUE) %>% st_read()
lines_spain <- st_geometry(spainCoast_CoteBanyuls) %>% st_cast("LINESTRING")
spainCoast_l <- st_sf(n = as.character(seq_len(length(lines_spain))), lines_spain)
lines_france <- st_geometry(frenchCoast_CoteBanyuls) %>% st_cast("LINESTRING")
franceCoast_l <- st_sf(n = as.character(seq_len(length(lines_france))), lines_france)
spainmax <- spainCoast_l[which.max(st_length(spainCoast_l)), ]
spainrest <- spainCoast_l[-which.max(st_length(spainCoast_l)), ]
joined <- c(st_geometry(spainmax), st_geometry(franceCoast_l)) %>%
st_union()
join_end <- st_union(joined, st_geometry(spainrest))
bbox_all <- st_bbox(joined) %>%
st_as_sfc()
polygon_joined <- bbox_all %>%
lwgeom::st_split(join_end) %>%
st_collection_extract("POLYGON")
#Polygons on position 2 and 3 need to be removed (visual inspection)
polygon_end <- polygon_joined[2] # define land as polygone and not sea
polyCombin_df <- st_sf(var = 1, polygon_end)
class(polyCombin_df)
st_crs(25831)$units
polyCombin_df_t <- polyCombin_df %>% st_transform(25831)
我們得到了:
我們確實柵格化了多邊形:
r <- raster(polyCombin_df_t, res = 100)
r <- fasterize(polyCombin_df_t, r, fun = "max")
par(mar=c(1,1,1,1))
plot(r)
4/ 我們現在要使用功能points
添加沿海岸的3個采樣點坐標,以便應用以下方法計算采樣點之間的距離:( https://www.r-bloggers.com/2020/02 / 計算距離的三種方法 / )
# sites
site_random <- matrix(data = c(3.164887 , 3.123969 , 3.158125 , 3.160378, 42.402158,
42.521957, 42.475956, 42.461188), ncol = 2)
site_random <- data.frame(site_random)
points(site_random$X1, site_random$X2, pch = 19)
但是,這不起作用,並且不顯示示例站點。 這是由於圖表的比例嗎?
預先感謝您的幫助!
查看如何將點的坐標與柵格的 CRS 相匹配:
library(sf)
library(fasterize)
library(raster)
library(dplyr)
library(tidyverse)
spainurl <- "https://geo.vliz.be/geoserver/wfs?request=getfeature&service=wfs&version=1.0.0&typename=MarineRegions:coasts_subnational&outputformat=SHAPE-ZIP&filter=%3CPropertyIsEqualTo%3E%3CPropertyName%3Emrgid_1%3C%2FPropertyName%3E%3CLiteral%3E3417%3C%2FLiteral%3E%3C%2FPropertyIsEqualTo%3E"
download.file(spainurl, "spain.zip", mode = "wb")
unzip("spain.zip", exdir = "spain", junkpaths = TRUE)
franceurl <- "https://geo.vliz.be/geoserver/wfs?request=getfeature&service=wfs&version=1.0.0&typename=MarineRegions:coasts_subnational&outputformat=SHAPE-ZIP&filter=%3CPropertyIsEqualTo%3E%3CPropertyName%3Emrgid_1%3C%2FPropertyName%3E%3CLiteral%3E19888%3C%2FLiteral%3E%3C%2FPropertyIsEqualTo%3E"
download.file(franceurl, "france.zip", mode = "wb")
unzip("france.zip", exdir = "france", junkpaths = TRUE)
spainCoast_CoteBanyuls <- list.files("spain",
pattern = "shp$",
full.names = TRUE
) %>% st_read()
frenchCoast_CoteBanyuls <- list.files("france",
pattern = "shp$",
full.names = TRUE
) %>% st_read()
lines_spain <- st_geometry(spainCoast_CoteBanyuls) %>% st_cast("LINESTRING")
spainCoast_l <- st_sf(n = as.character(seq_len(length(lines_spain))), lines_spain)
lines_france <- st_geometry(frenchCoast_CoteBanyuls) %>% st_cast("LINESTRING")
franceCoast_l <- st_sf(n = as.character(seq_len(length(lines_france))), lines_france)
spainmax <- spainCoast_l[which.max(st_length(spainCoast_l)), ]
spainrest <- spainCoast_l[-which.max(st_length(spainCoast_l)), ]
joined <- c(st_geometry(spainmax), st_geometry(franceCoast_l)) %>%
st_union()
join_end <- st_union(joined, st_geometry(spainrest))
bbox_all <- st_bbox(joined) %>%
st_as_sfc()
polygon_joined <- bbox_all %>%
lwgeom::st_split(join_end) %>%
st_collection_extract("POLYGON")
# Polygons on position 2 and 3 need to be removed (visual inspection)
polygon_end <- polygon_joined[-c(2, 3)] # define land as polygone and not sea
polyCombin_df <- st_sf(var = 1, polygon_end)
class(polyCombin_df)
#> [1] "sf" "data.frame"
st_crs(25831)$units
#> [1] "m"
polyCombin_df_t <- polyCombin_df %>% st_transform(25831)
ggplot(polyCombin_df_t) +
geom_sf()
r <- raster(polyCombin_df_t, res = 100)
r <- fasterize(polyCombin_df_t, r, fun = "max")
# sites
site_random <- matrix(data = c(
3.164887, 3.123969, 3.158125, 3.160378, 42.402158,
42.521957, 42.475956, 42.461188
), ncol = 2)
site_random <- data.frame(site_random)
site_random_sf <- st_as_sf(site_random, coords = c("X1", "X2"), crs = 4326) %>%
st_transform(25831)
plot(r)
plot(st_geometry(site_random_sf), add = TRUE)
# If you need as matrix points
site_random_t <- st_coordinates(site_random_sf)[, 1:2] %>% as.data.frame()
names(site_random_t) <- names(site_random)
site_random_t
#> X1 X2
#> 1 513569.2 4694442
#> 2 510182.5 4707739
#> 3 512997.5 4702635
#> 4 513185.8 4700996
plot(r)
points(site_random_t$X1, site_random_t$X2, pch = 19)
由reprex 包於 2022-06-23 創建 (v2.0.1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.