Замена многоугольника во фрейме данных пространственного многоугольника - PullRequest
0 голосов
/ 07 октября 2019

У меня есть пространственный полигон данных с несколькими шейп-файлами. Я хотел бы обрезать эти шейп-файлы по высоте и заменить исходный шейп-файл в кадре данных. Тем не менее, появляется ошибка при попытке заменить многоугольник после обрезки. В настоящее время мой план выполняется через следующий цикл для каждого шейп-файла в наборе данных. Однако, когда я пытаюсь dist[i,] <- temp3, я получаю следующую ошибку:

Ошибка в совпадении (значение, lx): для «совпадения» требуются аргументы вектора. Дополнительно: Предупреждение: В checkNames (значение): попыткаустановить недопустимые имена: это может привести к проблемам позже. Смотрите? Make.names

Есть предложения?

# Load spdf
dist <- rgdal::readOGR('critterDistributions.shp');

# Load elevational ranges
rangeElevation <- read.csv(file = 'elevationRanges.csv');

# Load altitude data
elevation <- raster('ETOPO1_Bed_g_geotiff.tif');

# Tidy up CRSes
crs(elevation) <- crs(dist);

# Run loop
for (i in 1:length(dist)){
  subjName <- as.character(dist@data$Species[i]);
  if (!(subjName %in% rangeElevation$?..Species_name)){
    paste0(subjName, 'does not exist in the elevational range database.');
  }
  else{
    erNameMatch <- match(subjName, rangeElevation$?..Species_name);
    temp <- raster::reclassify(elevation, rcl = c(-Inf,rangeElevation[erNameMatch,2],NA, 
                                                  rangeElevation[erNameMatch,2],rangeElevation[erNameMatch,3],1, 
                                                  rangeElevation[erNameMatch,3],Inf,NA));
    temp2 <- dist[i,];
    temp <- mask(temp, temp2);
    temp <- crop(temp, temp2);
    temp3 <- rasterToPolygons(temp, na.rm = T, dissolve = T);
    names(temp3) <- make.names(names(temp2), unique = T);
    temp3@data <- temp2@data;
    dist[i,] <- temp3; # <<<< This is the line of code that doesn't work.
  }
}

1 Ответ

0 голосов
/ 08 октября 2019

После дальнейших размышлений я нашел обходной путь: инициировал список, затем использовал rbind после цикла, чтобы объединить все обратно в один объект. Мне все еще интересно узнать, почему dist[i,] <- temp3 не работает, но, по крайней мере, я смог выполнить эту работу.

oneSPDFtoRuleThemAll <- vector(mode = "list", length = length(dist));
for (i in 1:length(dist)){
  subjName <- as.character(dist@data$Species[i]);
  if (!(subjName %in% rangeElevation$?..Species_name)){
    paste0(subjName, 'does not exist in the elevational range database.');
  }
  else{
    erNameMatch <- match(subjName, rangeElevation$?..Species_name);
    temp <- raster::reclassify(elevation, rcl = c(-Inf,rangeElevation[erNameMatch,2],NA, 
                                                  rangeElevation[erNameMatch,2],rangeElevation[erNameMatch,3],1, 
                                                  rangeElevation[erNameMatch,3],Inf,NA));
    temp2 <- dist[i,];
    temp <- mask(temp, temp2);
    temp <- crop(temp, temp2);
    temp3 <- rasterToPolygons(temp, na.rm = T, dissolve = T);
    names(temp3) <- make.names(names(temp2), unique = T);
    temp3@data <- temp2@data;
    oneSPDFtoRuleThemAll[[i]] <- temp3; # <<<< This is the line of code that doesn't work.
  }
}

finalSPDF <- rbind(unlist(oneSPDFtoRuleThemAll));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...