Как извлечь конкретные значения из матрицы высот (цифровая модель рельефа)?
Я пытаюсь рассчитать данные высоты для пешеходных маршрутов, используя открытые данные (избегая лицензионных ограничений, таких как Google).
Я смог прочитать общедоступную ЦМР своей страны (с разрешением 10 метров), используя readGDAL (из пакета RGDAL), а proj4string(mygrid) дает мне:
"+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0"
Начало файла.asc:
ncols 9000
nrows 8884
xllcorner 323256,181155
yllcorner 4879269,74709
cellsize 10
NODATA_value -9999
978 998 1005 1008 1012 1016 1020 1025 .....
.....
..... 400 Megabytes of elevation values ....
.....
Все, что мне нужно, - это выбрать из этой сетки данные высотных отметок для конкретных узлов маршрута, чтобы иметь возможность рассчитать усиление высот, отрицательный уклон, минимальную / максимальную высоту...
Я извлекаю данные маршрутов из OpenStreetMap, используя симпатичный пакет OSMAR, поэтому таблица данных моего маршрута выглядит примерно так:
RouteId NodeId lat lon
1 -13828 -8754 45.36743 7.753664
2 -13828 -8756 45.36762 7.753878
3 -13828 -8758 45.36782 7.754344
4 -13828 -8760 45.36794 7.754541
....
Но я понятия не имею, как преобразовать координаты широты / долготы в системе координат DEM, а затем как вывести соответствующие значения сетки (что-то вроде усреднения ближайших точек?)
Вся документация, которую я нашел, гуглит, что она собирается визуализировать карты сетки, а не извлекать значения из них.
Любая помощь будет оценена!
Ура, мб
PS Второй вопрос должен звучать так: "Имея несколько мозаичных ячеек, что я могу сделать, если маршрут пересекает две или более тайлов? Объединяй их, ссылаясь на оба…"
3 ответа
Не трансформируйте DEM. Преобразуйте свои очки. Ваша ЦМР проецируется на регулярную сетку. Если вы перепроектируете это в другое, это может не быть. Вместо этого сделайте пространственные точки из ваших данных OSM:
require(sp); coordinates(my.OSM.points) <- long + lat
Затем преобразуйте их в систему координат координат матрицы высот (обратите внимание, что вам может понадобиться сначала установить CRS точек. Таким образом, вы можете сделать это:
# Set pojection information for points
proj4string(my.OSM.points) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84")
# Transform them
new.points <- spTransform( my.OSM.points , proj4string( mygrid ) )
Тогда посмотрите на использование sp::over
или же raster::extract
чтобы получить значения матрицы высот в точечных точках.
Как сказал Саймон, если вы находитесь в одной проекции, вы можете использовать:
library(raster)
my.pts.elevation <- extract(my.grid,my.point)
Большое спасибо, Саймон, твой ответчик обратился ко мне, чтобы решить мою проблему!
Просто пунктуация: пытаясь использовать ваш код, я получил:
> coordinates(my.OSM.points) <- routesCoord[,lat,lon]
Error in coordinates(my.OSM.points) <- routesCoord[, lat, lon] :
object 'my.OSM.points' not found
Я думал, что ваше утверждение работает, потому что в справке по "координатам" говорится: "установить пространственные координаты для создания пространственного объекта"
Однако я использовал:
crsString <- "+proj=longlat +datum=WGS84 +ellps=WGS84"
my.OSM.points <- SpatialPoints( routesCoord[,lat,lon],
proj4string=CRS(crsString), bbox = NULL)
new.points <- spTransform( my.OSM.points , CRS(proj4string(mygrid)) )
Для новичков, как я: после этого вы получите хороший фрейм данных с данными высоты для всех точек просто с
my.elev <- over(new.points, mygrid)
PS Извините, Саймон, это мой первый вопрос по stackru, поэтому, когда я попытался проголосовать за ваш ответ, я получил "для голосования требуется 15 репутаций"! Сейчас мне 11, как только я наберу 4 очка, я вернулся:-)
PS2 Я хотел бы знать, принимает ли значение "over" значение ближайшей точки сетки или вычисляет средневзвешенное значение ближайших точек...
PS3 Второй вопрос должен быть: "Имея несколько плиток сетки, что я мог бы сделать, если маршрут пересекает две или более плиток? Объедините их, ссылаясь на обе…"