【问题标题】:RasterFrames extracting location information problemRasterFrames 提取位置信息问题
【发布时间】:2019-11-16 17:06:37
【问题描述】:

有没有办法使用 RasterFrames (http://rasterframes.io/) 从 tif 文件中提取/查询纬度、经度和海拔数据?

按照文档,我从以下站点加载了一个 tif 文件:https://visibleearth.nasa.gov/view.php?id=73934,但是我只能看到一般信息,不知道要使用哪个 RasterFunction 来提取位置和高度或任何其他相关信息信息。我确实尝试了我在 API 中可以找到的所有内容。

我也尝试使用以下来源提取温度信息:http://worldclim.org/version2

我得到的只是带有 DoubleUserDefinedNoDataArrayTile 和边界(扩展或 crs)的平铺列。

R中的RasterStack可以根据这个博客提取这些信息:https://www.benjaminbell.co.uk/2018/01/extracting-data-and-making-climate-maps.html

我需要更精细的 DataFrame,例如 lat、lon、temperature(或嵌入到 tif 文件中的任何数据)。

RasterFrames 或 GeoTrellis 是否可以做到这一点?

【问题讨论】:

    标签: scala apache-spark tiff geotrellis rasterframes


    【解决方案1】:

    长话短说 - 是的,这是可能的(至少使用 GeoTrellis)。我想,RasterFrames 也是可能的,但需要一些时间来弄清楚如何提取这些数据。我无法更详细地回答,因为我需要了解有关数据集以及您要执行和应用的管道的更多信息。

    【讨论】:

      【解决方案2】:

      目前您必须使用 UDF 和相关的 GeoTrellis 方法来完成。

      我们有一张票可以作为一等函数实现,但与此同时,这是长形式:

      import org.apache.spark.sql._
      import org.apache.spark.sql.functions._
      import org.locationtech.rasterframes._
      import org.locationtech.rasterframes.datasource.raster._
      import org.locationtech.rasterframes.encoders.CatalystSerializer._
      import geotrellis.raster._
      import geotrellis.vector.Extent
      import org.locationtech.jts.geom.Point
      
      object ValueAtPoint extends App {
      
        implicit val spark = SparkSession.builder()
          .master("local[*]").appName("RasterFrames")
          .withKryoSerialization.getOrCreate().withRasterFrames
        spark.sparkContext.setLogLevel("ERROR")
      
        import spark.implicits._
      
        val example = "https://raw.githubusercontent.com/locationtech/rasterframes/develop/core/src/test/resources/LC08_B7_Memphis_COG.tiff"
        val rf = spark.read.raster.from(example).load()
        val point = st_makePoint(766770.000, 3883995.000)
      
        val rf_value_at_point = udf((extentEnc: Row, tile: Tile, point: Point) => {
          val extent = extentEnc.to[Extent]
          Raster(tile, extent).getDoubleValueAtPoint(point)
        })
      
        rf.where(st_intersects(rf_geometry($"proj_raster"), point))
          .select(rf_value_at_point(rf_extent($"proj_raster"), rf_tile($"proj_raster"), point) as "value")
          .show(false)
      
        spark.stop()
      }
      

      【讨论】:

      • 如果我们想提取多个点的信息,我们该怎么做呢?
      • 您将在单独的 DataFrame 中获得位置列表,并在 st_intersects 上进行连接。
      • 你能提供示例代码吗,关于多个点的join和udf rf_value_at_point不是很清楚
      • 对上述评论的任何想法
      猜你喜欢
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 2023-03-27
      • 2016-07-01
      相关资源
      最近更新 更多