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_pngRGB三个波段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_compositeRGB三个波段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") }) }