如何获取GPS轨迹的高程剖面图?


15

我想获得一个用GPS记录的轨迹的合理准确的高度剖面(该轨迹通常具有非常不可靠的高度数据,有时根本没有,取决于型号)。

有没有人暗示最简单的方法。到目前为止,我正在考虑的两种技术是:

  • 使用Google Elevation API

    该API相对易于使用,但由于其使用限制,仍然需要一些简单的步骤:每个请求最多返回512个样本,并且沿路径的点数也受到限制(受URL长度限制)。

    我希望可以配置一个gpsbabel简化过滤器以将轨道缩小到合适的点数(由于海拔数据的分辨率,它们中的任何点都不能小于100m左右),但是接下来的问题仍然是如何映射由于长度会有所不同,因此此简化的轨迹可以追溯到原始路径。

    或者,如果这不适合自动化,最好的方法可能是让用户手动选择地图上的横断点。

  • 下载航天飞机雷达地形任务(SRTM)数据并在本地进行查询。

    我没有这方面的经验,因此欢迎提出任何可行的建议。数据集有多大?需要什么GIS软件,可以用合适的方式编写脚本吗?我不想不必编写一个采样和插值算法,这听起来很痛苦。这种方法的可能表现是什么?(我需要它非常快并且可以在内存受限的VPS Web服务器上运行...)


http://srtm.csi.cgiar.org/SELECTION/inputCoord.asp重新下载数据,以充实@MerseyViking的答案的一些详细信息:

共有72 x 24个图块,每个图块约20mb的zip文件,可解压缩为72.1mb 16bit TIF文件(6001x6001像素)。

大约120 GB,比我能存储的还要多。将其压缩并忽略海洋会将其减小到10gb,这仍然有点太大。按需加载数据将大大减少所需的存储空间,但是源站点速度很慢(我的速度仅为10kb / s),这非常不切实际。


因此,您实际上需要覆盖全球吗?
昏暗

不,我不需要海洋,并且很乐意排除SRTM(或类似)数据集以外的区域。非洲,中国和南美将有很多大片不需要覆盖,但我不知道它们事先准备了什么,因此除非按需获得足够快的数据,否则最好将其全部保存在本地或将所有查询外包给第三方(例如Google)。
汤姆(Tom)”,

这些曲目多长时间?航迹点和高程需要哪种分辨率?
Simbamangu

赛道主要来自跑步和骑自行车,所以说介于5公里到100公里之间。典型的坡度小于5-10%,所以我认为分辨率比SRTM数据集低得多的任何事物都将变得太无趣了...除了显示海拔剖面外,我还想计算获得/损失的海拔,最大/最低海拔高度等
汤姆(Tom)

Answers:


9

对于本地解决方案,可以编写GRASS脚本来执行此操作:

# extract raster values at our points
# use cubic convolution for interpolation between DEM locations
v.drape in=my_pts out=pts_srtm_elev type=point rast=srtm_dem method=cubic

为我的一个用例运行了它的扩展版本,而v.drape的性能完全没有问题。



5

听起来好像您需要此作为通用解决方案,即为您要处理的任何轨道提供世界上所有的高程数据,因此不想在本地存储所有CGIAR数据。上面提到的gpsvisualizer.com(@Llaves)可能是最好的选择。

如果您不需要高分辨率,则整个星球的GTOPO数据集(1公里网格)仅约300MB;否则,可以使用ASTER GDEM(30m)和原始SRTM(90m)数据集,但是,正如您所指出的,有很多数据。(下载后,可以通过删除通常大于实际高程数据的捆绑PDF来减小ASTER数据的大小-当我这样做时,非洲数据集减少了40%!)。

在R中,您可以相当快地从任何这些数据集中提取高程剖面-尽管加载栅格可能花费大部分时间。这使用一个小的自定义readGPX函数和gpsbabel来处理GPX数据:

#Load elevation model and process track:
dem <- raster("E020N40.DEM")
track <- readGPXt("trackfile.gpx")
coordinates(track) <- ~Longitude+Latitude
proj4string(track) <- "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs"
#Overlay (extract) the elevation data for the track points:
track$profile <- extract(dem, track)
track <- as.data.frame(track)

现在,“轨迹”是一张包含经纬度的GPS点表,其他标准GPX数据(速度,gps高程等),以及一个“配置文件”列,用于指示该点的高程。


4

SRTM数据易于在给定区域下载,我过去曾使用过此站点。这些文件不是很大,您可以将它们作为地理参考TIFF获得。下载整个世界可能要花一些时间,但是有几个磁贴覆盖了很大的区域。您可能会遇到的问题是水平分辨率,在世界大多数地方,水平分辨率约为90米,而垂直误差可能会非常大,存在峰值和丢失数据的区域。

ASTER GDEM数据集是一种更新的,高分辨率的测量,水平分辨率约为30m,但质量通常低于相应的SRTM数据。

我不知道Google海拔高度数据的分辨率是多少,但是如果它基于SRTM,也不会感到惊讶,因此使用Google API可能会给您与使用本地过程相似的结果。

如果要成为一个简单的基于Web的系统,请遵循@underdark的回答,GRASS GIS可能是可行的方法。我已经使用r.profile进行了简单的可互见性绘图,但取得了一些成功,但是我不确定它使用哪种插值方法。它可能只是最近的邻居。编辑:查看源代码r.profile确实使用了最近的邻居,因此您可能会得到一些阶梯式的假象。

另一个选择可能是使用GDALNumPy编写Python脚本,这可能需要更多的工作,但是会提供一个不错的自定义解决方案。


3

首先,您应该指定要满足的水平/垂直精度。

但是,让我们从实际的角度来看一下:

  • 每个SRTM3磁贴具有1200x1200单元,每个单元是一个两字节的整数值,表示以米为单位的高程。大约有2.75 MB的原始未压缩数据。
  • 有14042 SRTM3磁贴。那是cca。38 GB的原始数据。
  • 您真的需要覆盖整个世界吗?我认为在撒哈拉沙漠,戈壁沙漠或西伯利亚中部显示GPS轨迹的高程轮廓并没有太大的兴趣,因此如果您现金拮据,则覆盖它在经济上是不可行的(BTW:SRTM3无法覆盖整个世界,因此您无需担心格陵兰岛和南极洲等地;))。
  • 通过一些巧妙的压缩和数据编码,您可以大大减少数据集的大小。高程值为0到8848,因此不使用其余两个位。您还可以通过增量压缩对高程进行编码,以进一步减小高度。您还可以放弃一些垂直精度(例如2m),这样每个单元格可以节省一额外的位。
  • 根据将用于(步行,骑自行车,驾驶...)的GPS轨迹的类型,您应该将数据存储为较小的图块(例如0.25x0.25度)作为磁盘上的文件或数据库表中的行。
  • 对磁贴使用一些聪明的内存高速缓存,这样就不必重新加载常用的磁贴。
  • 从单元格计算高程是整个业务的简单部分。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.