我尝试使用开放数据计算远足路线的高程数据(避免像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。第二个问题应该是: "有几个网格图块,如果路径跨越两个或多个图块,我该怎么办?合并它们,参考两者......"
答案 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::over
或raster::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)