Tile属性操作

  • st_dimensions
    获取Tile的长宽像素值。
    Struct[Int, Int] st_dimensions(Tile tile)
  • st_cell_type
    回去Tile单元格数据类型。单元格数据类型可以通过st_convert_cell_type来改变。
    Struct[String] st_cell_type(Tile tile)
  • st_tile
    从ProjectedRasterTile中获取完全加载的Tile。
    Tile st_tile(ProjectedRasterTile proj_raster)
    注意 ProjectedRasterTile为Tile的子类,是内置了空间范围与空间参考的Tile。
  • st_extent
    获取Tile的空间范围。
    Struct[Double xmin, Double xmax, Double ymin, Double ymax] st_extent(ProjectedRasterTile proj_raster)
    Struct[Double xmin, Double xmax, Double ymin, Double ymax] st_extent(RasterSource proj_raster)
  • st_crs
    获取空间参考CRS。从st_mk_crs支持的形式的字符串列中获取表示ProjectedRasterTile或RasterSource类型瓦片列的坐标参考系统的CRS结构。
    Struct st_crs(ProjectedRasterTile proj_raster)
    Struct st_crs(RasterSource proj_raster)
    Struct st_crs(String crs_spec)
  • st_proj_raster
    通过指定的Tile,Extent和CRS列构造ProjectedRasterTile对象。
    ProjectedRasterTile st_proj_raster(Tile tile, Extent extent, CRS crs)
  • st_mk_crs
    根据指定CRS表述生成CRS对象。
    Struct st_mk_crs(String crsText)   
    这里crsText可以是如下类型:
    • EPSG code: 格式为EPSG:Int
    • Proj4 字符串: +proj <proj参数>
    • WKT 字符串,嵌入 EPSG 代码: GEOGCS["<name>", <datum>, <prime meridian>, <angular unit> {,<twin axes>} {,<authority>}]

    示例为:SELECT rf_mk_crs('EPSG:4326')

  • st_convert_cell_type
    对Tile单元格类型进行类型转换
    Tile st_convert_cell_type(Tile tile_col, CellType cell_type)
    Tile st_convert_cell_type(Tile tile_col, String cell_type)
  • st_interpret_cell_type_as
    根据指定的cell_type更改tile_col的单元格值的解释方式。在Python中,您可以将CellType对象传递给cell_type。
    Tile st_interpret_cell_type_as(Tile tile_col, CellType cell_type)
    Tile st_interpret_cell_type_as(Tile tile_col, String cell_type)
  • st_resample
    更改Tile尺寸,参数factor为缩放比例,1.0等于原始Tile的列和行数;少于1对Tile进行向降采样;大于1对Tile进行升采样。传递shape_tile作为第二个参数将输出与shape_tile相同的行列号的tile。所有重采样都是通过最邻近方法进行。
    Tile st_resample(Tile tile, Double factor)
    Tile st_resample(Tile tile, Int factor)
    Tile st_resample(Tile tile, Tile shape_tile)

矢量计算

  • st_extent

    获取指定空间要素的外包框范围。

    • 函数定义:
      Struct[Double xmin, Double xmax, Double ymin, Double ymax] st_extent(Geometry geom)
    • 示例:
      val boxed = df.select(GEOMETRY_COLUMN, st_extent(GEOMETRY_COLUMN) as "extent")
  • st_reproject
    将矢量geometry类型从origin_crs转化为destination_crs,所有crs必须以坐标系统国际标准格式表示,如Pro4j、EPSG或WKT等。
    • 函数定义:
      Geometry st_reproject(Geometry geom, String origin_crs, String destination_crs)
    • 示例:
      SELECT st_reproject(ll, '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', 'EPSG:3857') 
      AS wm4 from geom
  • st_geometry
    将extent对象转换为Geometry对象
    • 函数定义:
      Geometry st_geometry(Struct[Double xmin, Double xmax, Double ymin, Double ymax] extent)
    • 示例:
      val geom = df.select(st_geometry(st_extent(GEOMETRY_COLUMN)))
  • st_xz2_index
    计算空间参考为WGS84/EPSG:4326的Geometry、Extent或ProjectedRasterTile对象的XZ2索引值。该函数可以用于数据计算的区间分块。
    • 函数定义:
      Long st_xz2_index(Geometry geom, CRS crs)
      Long st_xz2_index(Extent extent, CRS crs)
      Long st_xz2_index(ProjectedRasterTile proj_raster)
    • 示例:
      val indexes = df.select(st_xz2_index($"extent", serialized_literal(crs))).collect()
  • st_z2_index
    计算空间参考为WGS84/EPSG:4326的Geometry、Extent或ProjectedRasterTile对象的Z2索引值。计算过程中,空间的对象的空间范围extent会被首先提取出来,然后就算extent中心点的Z2索引值。该函数可以用于数据计算的区间分块。在读取raster数据过程中会自动调用该函数进行计算。
    • 函数定义:
      Long st_z2_index(Geometry geom, CRS crs)
      Long st_z2_index(Extent extent, CRS crs)
      Long st_z2_index(ProjectedRasterTile proj_raster)
    • 示例:
      val crs: CRS = CRS.fromName("EPSG:4326")
      val indexes = df.withColumn("xz2",st_z2_index($"extent", serialized_literal(crs)))
                                       .withColumn("z2",st_z2_index($"extent", serialized_literal(crs)))
      indexes.show
    • 输出结果:
      +-----------+--------------------+-----------+-------------------+
      |spatial_key|              extent|        xz2|                 z2|
      +-----------+--------------------+-----------+-------------------+
      |     [0, 0]|[118.336550697428...|77880735068|3919866226478294259|
      |     [1, 0]|[118.356350742817...|77880736433|3919866232129151218|
      |     [0, 1]|[118.336550697428...|77880732338|3919865820477424883|
      |     [1, 1]|[118.356350742817...|77880733703|3919865826128281842|
      |     [2, 0]|[118.376150788207...|77880736433|3919866249224287474|
      |     [3, 0]|[118.395950833596...|77880740529|3919866437950910706|
      |     [2, 1]|[118.376150788207...|77880733703|3919865843223418098|
      |     [3, 1]|[118.395950833596...|77880737799|3919866031950041330|
      |     [0, 2]|[118.336550697428...|77880614918|3919865683711796473|
      |     [1, 2]|[118.356350742817...|77880616283|3919865689362653432|
      |     [0, 3]|[118.336550697428...|77880615260|3919859775873615097|
      |     [1, 3]|[118.356350742817...|77880616284|3919859781524472056|
      |     [2, 2]|[118.376150788207...|77880616283|3919865706457789688|
      |     [3, 2]|[118.395950833596...|77880620379|3919865895184412920|
      |     [2, 3]|[118.376150788207...|77880616625|3919859798619608312|
      |     [3, 3]|[118.395950833596...|77880620380|3919859987346231544|
      |     [4, 0]|[118.415750878986...|77880740529|3919866454330795250|
      |     [5, 0]|[118.435550924375...|77880741894|3919866505651495154|
      |     [4, 1]|[118.415750878986...|77880737799|3919866048329925874|
      |     [5, 1]|[118.435550924375...|77880739164|3919866099650625778|
      +-----------+--------------------+-----------+-------------------+

Mask操作

  • st_mask
    对tile做Mask操作,参数mask里面含有NoData信息。
    Tile st_mask(Tile tile, Tile mask, bool inverse)
  • st_mask_by_value
    对tile做Mask操作,当参数mask_tile中的值等于mask_value时,则值设定为NoData
    Tile st_mask_by_value(Tile data_tile, Tile mask_tile, Int mask_value, bool inverse)
  • st_mask_by_values
    返回一个Tile,其中数值来自data_tile,且mask_tile中等于mask_values中值的像素位置设为NoData
    Tile st_mask_by_values(Tile data_tile, Tile mask_tile, Array mask_values)
    Tile st_mask_by_values(Tile data_tile, Tile mask_tile, list mask_values)

Tile构造函数

  • st_make_zeros_tile
    创建一个行列数分别为tile_rows和tile_columns的tile,填充值为0,数据类型为可选,默认单元格类型为float64。有关cell_type参数的信息,请参见有关单元格类型的讨论。所有参数都是文字表达式形式,而非列表达式。
    Tile rf_make_zeros_tile(Int tile_columns, Int tile_rows, [CellType cell_type])
    Tile rf_make_zeros_tile(Int tile_columns, Int tile_rows, [String cell_type_name])
  • st_make_ones_tile
    创建一个行列数分别为tile_rows和tile_columns的tile,填充值为1,数据类型为可选,默认单元格类型为float64。有关cell_type参数的信息,请参见有关单元格类型的讨论。所有参数都是文字表达式形式,而非列表达式。
    Tile st_make_ones_tile(Int tile_columns, Int tile_rows, [CellType cell_type])
    Tile st_make_ones_tile(Int tile_columns, Int tile_rows, [String cell_type_name])
  • st_make_constant_tile
    创建一个行列数分别为tile_rows和tile_columns的tile,填充值通过参数constant指定,数据类型为可选,默认单元格类型为float64。有关cell_type参数的信息,请参见有关单元格类型的讨论。所有参数都是文字表达式形式,而非列表达式。Tile st_make_constant_tile(Numeric constant, Int tile_columns, Int tile_rows, [CellType cell_type])Tile st_make_constant_tile(Numeric constant, Int tile_columns, Int tile_rows, [String cell_type_name])
    Tile st_make_constant_tile(Numeric constant, Int tile_columns, Int tile_rows,  [CellType cell_type])
    Tile st_make_constant_tile(Numeric constant, Int tile_columns, Int tile_rows,  [String cell_type_name])
  • st_rasterize
    将Geometry类型的对象geom转换为Tile对象。在该Tile中,geom与tile_bounds相交部分将被赋予参数value定义的值。返回的图块的形状尺寸为tile_columns乘tile_rows。在geom之外的值将被分配一个NoData值。返回的图块的单元格类型为int32。请注意,输出Tile单元格的类型为Int。
    Tile st_rasterize(Geometry geom, Geometry tile_bounds, Int value, Int tile_columns, Int tile_rows)
    说明 参数tile_columns和tile_rows是文字表达式,而不是列表达式。其他是列表达式。
  • st_assemble_tile
    从给定的位置索引的单元格数据列中,创建大小为numRows和numCols的Tile图块。此函数与st_explode_tiles相反。预定用途是与groupby一起使用,每组产生一行带有新的Tile。有关可选cell_type参数的信息,请参见有关单元格类型的讨论。默认值为float64。
    Tile st_assemble_tile(Int colIndex, Int rowIndex, Numeric cellData, Int numCols, Int numRows, [CellType cell_type])
    Tile st_assemble_tile(Int colIndex, Int rowIndex, Numeric cellData, Int numCols, Int numRows, [String cell_type_name])

代数运算

  • st_add
    波段加法运算
    st_add(Tile tile1, Tile rhs)
    st_add(Tile tile1, Int rhs)
    st_add(Tile tile1, Double rhs)
  • st_substract
    波段减法运算
    st_substract(Tile tile1, Tile rhs)
    st_substract(Tile tile1, Int rhs)
    st_substract(Tile tile1, Double rhs)
  • st_multiply
    st_multiply(Tile tile1, Tile rhs)
    st_multiply(Tile tile1, Int rhs)
    st_multiply(Tile tile1, Double rhs)
  • st_divide
    st_divide(Tile tile1, Tile rhs)
    st_divide(Tile tile1, Int rhs)
    st_divide(Tile tile1, Double rhs)
  • st_round
    Tile st_round(Tile tile)
  • st_exp
    Tile st_exp(Tile tile)
  • st_exp2
    Tile st_exp2(Tile tile)
  • st_exp10
    Tile st_exp10(Tile tile)
  • st_abs
    Tile st_abs(Tile tile)
  • st_log
    Tile st_log(Tile tile)
  • st_log10
    Tile st_log10(Tile tile)
  • st_sqrt
    Tile st_sqrt(Tile tile)
  • st_normalized_difference
    计算两个波段的归一化指数:(tile1-tile2)/(tile1+tile2)
    Tile st_normalized_difference(Tile tile1,Tile tile2)
  • st_rescale
    重新缩放单元格的值,使最小值为零,最大值为1,其他值将线性插值到该范围内。如果指定min与max,则min参数将变为0,max将变为1,超出范围的值将设置为0或1。如果未指定min和max,则使用Tile最小值和最大值。
    Tile st_rescale(Tile tile)
    Tile st_rescale(Tile tile, Double min, Double max)
  • st_standardize
    使用mean和stddev标准化Tile,如果mean和stddev没有指定,则分别为0和1
    st_standardize(Tile tile)
    st_standardize(Tile tile, Double mean, Double stddev)

Tile聚合统计函数

  • st_tile_mean
    计算Tile的平均值
    Double st_tile_mean(Tile tile)
  • st_tile_max
    计算Tile中最大值
    Double st_tile_max(Tile tile)
  • st_tile_min
    计算Tile中做小值
    Double st_tile_min(Tile tile)
  • st_tile_sum
    计算Tile中像素值之和
    Double st_tile_sum(Tile tile)
  • st_tile_stats
    在Tile上聚合并返回单元格值的统计信息,包括:Cell数量,NoData数量,最小值,最大值,均值和方差。最小值,最大值,均值和方差计算过程中忽略NoData。
    Struct[Long, Long, Double, Double, Double, Double] st_tile_stats(Tile tile)
    示例为:
    spark.sql("SELECT rf_tile_stats(rf_make_ones_tile(5, 5, 'float32')) as tile_stats").printSchema()
  • st_tile_approx_histogram
    统计Tile的直方图信息
    Struct[Array[Struct[Double, Long]]] st_tile_approx_histogram(Tile tile)
  • st_agg_extent
    根据各Tile的Extent聚合成整体的Extent
    Extent st_agg_extent(Extent extent)
  • st_agg_reprojected_extent
    根据各Tile的Extent聚合成整体的Extent,并进行重投影
    Extent st_agg_reprojected_extent(Extent extent, CRS source_crs, String dest_crs)

Tile转换

  • st_explode_tiles
    在Tile列中为每个单元格创建一行。可以传入多个Tile列,并且返回的DataFrame对象中每个输入将具有一个数字列。也将有column_index和row_index的列。与rf_assemble_tile功能相反。使用此功能时,请确保对行具有唯一的标识符,以便成功反转操作。
    Int, Int, Numeric* st_explode_tiles(Tile* tile)
  • st_tile_to_array_int
    按行优先(row-major )顺序将Tile列转换为Spark SQL Array类型。Double类型单元格将强制为Int类型。
    Array st_tile_to_array_int(Tile tile)
  • st_tile_to_array_double
    按行优先(row-major )顺序将tile列转换为Spark SQL Array。Int类型单元格将强制转换为浮点型。
    Array st_tile_to_arry_double(Tile tile)
  • st_render_ascii
    将Tile打印为ASCII纯文本。
    String rf_render_ascii(Tile tile)
  • rf_render_matrix
    将Tile单元格值输出为一串数字值。
    String st_render_matrix(Tile tile)
  • st_render_png
    RGB三个波段Tile渲染为PNG bytearray
    Array st_render_png(Tile red, Tile green, Tile blue)
  • st_render_color_ramp_png
    指定Tile和配色方案,输出PNG bytearray
    Array st_render_color_ramp_png(Tile tile, String color_ramp_name)
    color_ramp_name可包括:
    • “BlueToOrange”
    • “LightYellowToOrange”
    • “BlueToRed”
    • “GreenToRedOrange”
    • “LightToDarkSunset”
    • “LightToDarkGreen”
    • “HeatmapYellowToRed”
    • “HeatmapBlueToYellowToRedSpectrum”
    • “HeatmapDarkRedToYellowWhite”
    • “HeatmapLightPurpleToDarkPurpleToWhite”
    • “ClassificationBoldLandUse”
    • “ClassificationMutedTerrain”
    • “Magma”
    • “Inferno”
    • “Plasma”
    • “Viridis”
    • “Greyscale2”
    • “Greyscale8”
    • “Greyscale32”
    • “Greyscale64”
    • “Greyscale128”
    • “Greyscale256”
    • RT_OverviewRaster
    根据用户指定的AOI,采用双线性差值方法,按照cols和rows定义尺寸生成overview。如果Tile中包含了Extent和CRS,则tile_extent_col和tile_crs_col参数可选
    Tile ST_OverviewRaster(Tile proj_raster_col, int cols, int rows, Extent aoi)
    Tile ST_OverviewRaster(Tile tile_col, int cols, int rows, Extent aoi, Extent tile_extent_col, CRS tile_crs_col)
  • st_rgb_composite
    RGB三个波段Tile渲染为一个RGB Tile。处理过程为先将每个单元转换为0-255范围的无符号byte类型,然后合并所有三个通道输出32-bit无符号整数。
    Tile st_rgb_composite(Tile red, Tile green, Tile blue)

DataFrame API接口

部分功能不支持SQL函数方式,采用DataFrame API方式直接调用。

  • stitch
    进行拼图操作,将多个Tile合并为一个Tile
    def stitch(extentCol: Column, tileCol: Column): Tile
    使用案例:
    val result = spark.sql("SELECT rows,cols,envelope,st_ndvi(red,nir) as ndvi FROM gf2")
    result.stitch($"envelope", $"ndvi").renderPng(ndviColorMap).write("polardb_ndvi.png")
  • transformToZoomLayer
    单波段时空拼图,并转换为zoom方式输出为rdd模型。
    def transformToZoomLayer(rowCol: Column, 
                          colCol: Column, 
                          extentCol: Column, 
                          tileCol: Column)
    :(Int, RDD[(SpatialKey, Tile)] with Metadata[TileLayerMetadata[SpatialKey]])
  • transformToMultibandZoomLayer
    多波段时空拼图,并转换为zoom方式输出为rdd模型。
    def transformToMultibandZoomLayer(rowCol: Column, 
                                   colCol: Column, 
                                   extentCol: Column, 
                                   tileCol: Column)
    :(Int, RDD[(SpatialKey, MultibandTile)] with Metadata[TileLayerMetadata[SpatialKey]])
    使用案例:
    val result = spark.sql("SELECT rows,cols,envelope,st_ndvi(red,nir) as ndvi FROM gf2")
    
    val (zoom, rdd1): (Int, RDD[(SpatialKey, Tile)] with Metadata[TileLayerMetadata[SpatialKey]]) = result.stitchToZoomLayer($"rows",$"cols",$"envelope", $"ndvi")
    val path = "result" //按图层输出到指定文件夹
      val layoutScheme = ZoomedLayoutScheme(WebMercator, tileSize = 256)
      Pyramid.upLevels(rdd1.asInstanceOf[RDD[(SpatialKey, Tile)] with Metadata[TileLayerMetadata[SpatialKey]]], layoutScheme, zoom, NearestNeighbor) { (rdd, z) =>
        val layerId = LayerId("", z)
        println(layerId)
        new File("result/" + z).mkdir()
        rdd.collect().foreach(elem => {
          elem._2.renderPng(ndviColorMap).write(path + "/" + z + "/" + elem._1.col + "_" + elem._1.row + ".png")
        })
      }