Geotrellis发布不同坐标系的栅格数据为TMS,并用cesium加载显示

数据坐标系为地理坐标:

读取栅格数据范围时,需将其投影为WebMercator

.reproject(LatLng,WebMercator)

LatLng为经纬度具体查看

数据坐标系为投影坐标:

// .reproject(CRS.fromEpsgCode(4549),WebMercator)
// 4549为坐标编号,可以参照https://epsg.io/地址查询。

完整读取栅格数据的边界范围代码(依赖库自行下载)

package tutorial

import geotrellis.proj4.{CRS, WebMercator}
import geotrellis.raster._
import geotrellis.spark.io.hadoop.HadoopGeoTiffRDD
import geotrellis.spark.tiling.ZoomedLayoutScheme
import geotrellis.spark.util.SparkUtils
import geotrellis.vector.{Extent, ProjectedExtent}
import org.apache.spark._
import geotrellis.spark._
import geotrellis.util._

import scala.collection.immutable.HashMap

object ReadTif{

  def main(args: Array[String]): Unit = {

    /* Some location on your computer */
    implicit val sc = SparkUtils.createSparkContext("GeoTrellis ETL SinglebandIngest", new SparkConf(true).set("spark.testing.memory", "536870912").setMaster("local"))

        //你的栅格数据路径,数据空间参考为 EPSG:4549
        val filepath: String = "D:\\LENOVO\\Geotrellis\\geotrellis-landsat-tutorial-master\\data\\yz84-2000.tif"

        val path = new org.apache.hadoop.fs.Path(filepath)

        val rdd = HadoopGeoTiffRDD.spatialMultiband(path)

    val sm = rdd
      .map { case (key, grid) =>
        val ProjectedExtent(extent, crs) = key.getComponent[ProjectedExtent]
        // Bounds are return to set the non-spatial dimensions of the KeyBounds;
        // the spatial KeyBounds are set outside this call.
        val boundsKey = key.translate(SpatialKey(0,0))
        val cellSize = CellSize(extent, grid.cols, grid.rows)
        HashMap(crs -> RasterCollection(crs, grid.cellType, cellSize, extent, KeyBounds(boundsKey, boundsKey), 1))
      }
      .reduce { (m1, m2) => m1.merged(m2){ case ((k,v1), (_,v2)) => (k,v1 combine v2) } }
      .values.toSeq.head

    val layoutScheme = ZoomedLayoutScheme(WebMercator, tileSize = 256)
    val layoutDefinition = layoutScheme.levelForZoom(16).layout
    val tiffExtent = TileLayerMetadata[SpatialKey](
      sm.cellType,
      layoutDefinition,
      sm.extent,
      sm.crs,
      sm.bounds.setSpatialBounds(layoutDefinition.mapTransform(sm.extent))
    ).extent.reproject(CRS.fromEpsgCode(4549),WebMercator)
    
    println("Tiff Extent:"+tiffExtent)
  }
}

数据切片和渲染均需投影为WebMercator,在Cesium上加载报跨域需添加CorsSupport。

效果图:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值