查看原文
其他

rgee矢量提取栅格像元值——全球水库数据高程值是如何提取的

走天涯徐小洋 走天涯徐小洋地理数据科学 2022-07-17

rgee矢量提取像元值——全球水库数据高程值是如何提取的

前面给大家分享了一个全球水库分布数据,原始数据是没有水库所在地高程信息的,我补充了高程信息,下面讲讲具体做法。

【数据共享】全球大坝和水库分布数据(2019年)

全球水库高程值提取思路

提取水库点要素所在地高程值很简单,在ArcGIS中使用Extract value from points工具即可实现从DEM(栅格数据)到水库点(矢量数据)的信息提取,关键是如何获取全球范围的呢?如果想获取比较高精度的高程,肯定是DEM分辨率高一些比较好,一般常用的是30m分辨率DEM,但是全球数据量很大,在本地处理很困难,Google Earth Engine给我们提供了新的全球海量数据处理手段。

要想获取全球水库高程值,最方便就是使用Google Earth Engine来提取高程信息了,具体怎么做呢?

rgee矢量提取栅格信息

rgee中有ee_extract函数来提取信息,可以实现类似ArcGIS Extract value from points的功能。

  • read_sf读取SHP矢量
  • sf_as_ee将SF对象转化为谷歌矢量对象
  • ee_extract使用矢量提取栅格值
    • x:ee$Image 栅格
    • y: ee$Geometry 矢量
    • scale:尺度,确定使用多大分辨率数据来进行提取
    • fun:需要使用Reducer函数,确定提取方法,参考:rgee学习笔记之rgee get started
    • sf = T,输出sf对象,即R语言中的矢量
library(rgee)
library(sf)

ee_Initialize()
#获取水坝数据
Gdam = read_sf("./Gdam/dam5k.shp")%>%
  sf_as_ee()

NASADEM = ee$Image("NASA/NASADEM_HGT/001")
#提取高程值
dam1 = ee_extract(NASADEM, Gdam, scale = 30, fun = ee$Reducer$first(), sf=T)

st_write(dam1, "dam2.shp")

需要注意的是,受GEE限制,矢量一次只能处理5000个,而全球大坝数据总共超7K个,怎么办呢?需要先在QGIS里把数据分成小份,然后再使用rgee进行计算。

QGIS中的处理

为了满足rgee矢量数据限制,需要进行以下处理:

  • 把全球大坝数据属性表先删除,只保留ID用于挂接
    • 大坝数据属性表内容很多,数据量很大,直接在rgee中调用会报错
Drop Field(s)删除字段
除了大坝ID,其他全部删掉
  • 打开属性表,Select by Expression,把ID<5000的选中
Select by Expression,把ID<5000的选中
  • 另存这4999个点,然后属性表中反选,另存剩下的点
  • 使用rgee对这些点提取高程值
  • 给原始的大坝SHP数据挂接提取后的高程SHP
挂接获取高程值字段
  • 字段计算,即可得到带有高程的大坝点数据

参考文献

  1. rgee学习笔记之rgee get started
  2. 【更新】rgee: An R package for interacting with Google Earth Engine
  3. GIS数据读取与转换
  4. GIS基础之GIS属性表操作
  5. https://r-spatial.github.io/rgee//reference/ee_extract.html

点击阅读原文参加视频课程学习

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存