如何从DEM(数字高程模型)中提取特定值?

时间:2014-11-19 10:11:36

标签: r openstreetmap rgdal osmar

我尝试使用开放数据计算远足路线的高程数据(避免像Google这样的许可限制)。

我能够阅读我国的公共DEM(分辨率为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 .... 
..... 

我需要的只是从这个网格中获取路线特定节点的高程数据,以便能够 计算高程增益,负斜率,最小/最大高度...

我使用漂亮的软件包OSMAR从OpenStreetMap中提取路由数据,因此我的路由的数据表是这样的:

    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坐标参考系中转换纬度/经度坐标,然后如何获得相应的网格值(做最近点的平均值?)

我发现谷歌搜索的所有文档都是为了渲染网格地图,而不是从中提取值。

任何帮助将不胜感激!

干杯,MB

P.S。第二个问题应该是: "有几个网格图块,如果路径跨越两个或多个图块,我该怎么办?合并它们,参考两者......"

3 个答案:

答案 0 :(得分:3)

不要改造DEM。改变你的观点。您的DEM将投射到常规网格上。如果你把它重新投射到另一个它可能不是。而是从您的OSM数据中创建空间点:

require(sp); coordinates(my.OSM.points) <- long + lat

然后将它们转换为DEM的坐标参照系(注意,您可能需要先设置点的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::overraster::extract获取点位置的DEM值。

答案 1 :(得分:1)

非常感谢西蒙,你的回答是我解决了我的问题!

只是一个标点符号:尝试使用你的代码,我得到了:

> coordinates(my.OSM.points) <- routesCoord[,lat,lon]
Error in coordinates(my.OSM.points) <- routesCoord[, lat, lon] : 
object 'my.OSM.points' not found

我认为你的陈述有效,因为对#34;坐标&#34;的帮助说:  &#34; 将空间坐标设置为创建空间对象&#34;

但我用过:

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)

P.S。对不起Simon,这是我关于stackoverflow的第一个问题,所以当我试着投票给你答案的时候, 我得到了#34;投票需要15个声望&#34; !现在我11岁,一获得其他4分,我就回来了: - )

P.S.2我想知道&#34; over&#34;取最近点网格的值,或计算加权平均值 最近的点......

P.S.3第二个问题应该是:&#34;有几个网格, 如果路线跨越两个或更多个瓷砖,我该怎么办?合并它们,参考两者......&#34;

答案 2 :(得分:1)

正如西蒙所说,如果你在同一个投影中,你可以使用:

 library(raster)
 my.pts.elevation <- extract(my.grid,my.point)