mapbox加载tif(利用geotiff.js)

贴个群号

WebGIS学习交流群461555818,欢迎大家

源码

代码我也是从网上抄的,所以此处不做介绍了,自己记录一下我遇到的问题。

记得要注意coordinates中的bbox的取值顺序,顺序会导致其旋转或者镜像的展示,文中顺序为正常顺序。
还有颜色的区分要根据灰度值那里自己选择范围取色,文中颜色的取值为全白。

      let url = './static/测试.tif'
      console.log(GeoTIFF)
      // async function getData() {
      GeoTIFF.fromUrl(url).then(tiff => {
        console.log(tiff)
        this.getImage(tiff)
      });
    async  getImage(tiff) {
      const image = await tiff.getImage();
      let bbox = await image.getBoundingBox();
      console.log(bbox)
      let data = await image.readRasters({
        // samples: rgbBands // 波段数量,一个波段:[0],三个波段:[2,1,0]
        
        samples: [0] // 波段数量,一个波段:[0],三个波段:[2,1,0]
      });
      let base64Image = this.getBase64Image(data)
      this.addToMapboxgl(base64Image,bbox)
    },
    getBase64Image(data) {
      console.log('tiff',data)
      let thumbnailPixelHeight = data.height
      let thumbnailPixelWidth = data.width
      let canvas = document.createElement('canvas')
      canvas.width = thumbnailPixelWidth
      canvas.height = thumbnailPixelHeight
      let ctx = canvas.getContext("2d")
      let totalPixelCount = 0
      for (let y = 0; y < thumbnailPixelHeight; y++) {
        for (let x = 0; x < thumbnailPixelWidth; x++) {
          let colour = 'rgb(0, 0, 0, 0)' // let the default be no data (transparent)
          // 根据灰度值所在范围渲染颜色
          if (data[0][totalPixelCount] > 0) {
            colour = 'rgb(255, 255, 255, 1)'
            // if (data[0][totalPixelCount] > 0 && data[0][totalPixelCount] <= 1) {
            //   colour = `rgb(0, 0, 0, 1)`
            // } else if (data[0][totalPixelCount] > 2 && data[0][totalPixelCount] <= 3) {
            //   colour = `rgb(64, 64, 64, 1)`
            // } else if (data[0][totalPixelCount] > 3 && data[0][totalPixelCount] <= 4) {
            //   colour = `rgb(128, 128, 128, 1)`
            // } else {
            //   colour = `rgb(191, 191, 191, 1)`
            // }
          }
          ctx.fillStyle = colour
          ctx.fillRect(x, y, 1, 1)
          totalPixelCount++
        }
      }
      let canvasImage = canvas.toDataURL("image/png")
      return canvasImage
    },
    // 将图片添加到地图
    addToMapboxgl(image,bbox) {
      // bbox = [120,20,140,40]
      if(!this.map.getSource('tiff-test')){
        this.map.addSource('tiff-test', {
          "type": "image",
          "url": image,
          "coordinates": [
            [bbox[0],bbox[3]],
            [bbox[2],bbox[3]],
            [bbox[2],bbox[1]],
            [bbox[0],bbox[1]],
          ]
        });
        this.map.addLayer({
          id: 'tiff-test',
          'type': 'raster',
          'source': 'tiff-test',
          'paint': {
            'raster-fade-duration': 0
          }
        });
      }else{
        this.map.getSource('tiff-test').updateImage({
          url:image,
          coordinates: [
            [bbox[0],bbox[3]],
            [bbox[2],bbox[3]],
            [bbox[2],bbox[1]],
            [bbox[0],bbox[1]],
          ]
        })
      }
      mapFunction.controlLayerLocation({
        type:'image',
        id:'tiff-test'
      },this.map)

    },
<think>好的,用户想要了解如何开发DEM(数字高程模型)的编辑功能。首先,我需要明确DEM编辑功能通常包括哪些方面。根据之前的知识,DEM编辑可能涉及高程数据修改、地形特征编辑、数据插值、精度校验等。用户提到的GIS开发,可能需要结合具体的开发平台或工具,比如使用ArcGIS Engine、QGIS的插件开发,或者基于Web的GIS框架如Cesium、Mapbox等。 接下来,我需要参考用户提供的引用内容。引用[1]详细介绍了DEM的应用场景,比如选线设计、体积计算、通视分析等,这可能意味着编辑功能需要支持这些应用。例如,编辑后的DEM需要能够重新计算坡度、体积,或者进行通视判断。因此,在开发时,可能需要集成这些分析功能,确保编辑后的数据能正确应用于后续分析。 引用[2]提到在Google Earth Engine中下载DEM数据的方法,虽然用户的问题是关于编辑功能的开发,但数据获取也是开发的一部分。可能需要在编辑工具中加入数据导入导出功能,支持不同格式的DEM数据,如GeoTIFF、TIN等,并考虑与现有数据源(如SRTM、Copernicus DEM)的兼容性。 然后,考虑技术实现。开发DEM编辑器通常需要以下几个步骤: 1. **数据解析与可视化**:能够读取DEM数据(如栅格或TIN),并在界面中渲染,可能使用OpenGL或WebGL进行三维展示。需要处理大数据量的性能问题,比如LOD(层次细节)技术。 2. **交互式编辑工具**:比如高程点的拖拽、区域填充、地形平滑、特征线编辑。这里需要处理用户输入事件,并将修改后的数据实时反馈到视图上。可能需要算法支持,如插值算法(IDW、Kriging)来平滑编辑区域。 3. **数据存储与版本控制**:编辑后的数据需要保存,可能涉及版本管理,允许撤销和重做操作。数据格式的转换和压缩也是考虑点。 4. **集成分析功能**:编辑后的DEM需要能够进行地形分析,如计算坡度、坡向、剖面等,确保编辑操作不影响数据的准确性。 还需要考虑用户的使用场景。如果用户是开发桌面应用,可能会选择Qt框架结合GDAL库来处理地理数据;如果是Web应用,可能使用CesiumJSMapbox GL JS,并利用Turf.js进行前端分析。 同时,要注意数据精度和性能的平衡,特别是在处理高分辨率DEM时,实时编辑可能导致性能瓶颈。可能需要优化数据结构和算法,比如使用四叉树或网格分块加载。 另外,测试阶段需要验证编辑后的DEM是否符合地理空间数据标准,是否与其他GIS工具兼容,比如能否在ArcGIS或QGIS中正确打开并分析。 最后,根据用户可能的后续问题,提前准备相关问题,比如如何优化编辑性能,如何处理大数据量,或如何集成到现有GIS系统中。</think>### DEM编辑功能开发方法 开发数字高程模型(DEM)编辑功能需要结合GIS基础理论与软件开发技术,主要包括以下几个核心模块: #### 一、数据解析与可视化 1. **数据格式支持** - 支持主流DEM格式:GeoTIFF、ASCII Grid、TIN等,需集成GDAL/OGR库实现格式解析[^2] - 示例代码(Python GDAL读取DEM): ```python from osgeo import gdal dataset = gdal.Open("dem.tif") band = dataset.GetRasterBand(1) elevation_data = band.ReadAsArray() ``` 2. **三维可视化引擎** - 桌面端:采用OpenGL/DirectX渲染地形曲面 - Web端:使用CesiumJS/Mapbox GL实现浏览器端三维展示 - 关键技术:LOD(多细节层次)算法优化大规模地形渲染性能 #### 二、交互编辑功能开发 1. **基础编辑工具** | 工具类型 | 功能描述 | 实现方法 | |----------------|------------------------------|---------------------------| | 点编辑 | 高程值直接修改 | 栅格坐标定位+数值重写 | | 区域高程刷 | 多边形范围内批量调整高程 | 栅格掩膜+插值算法 | | 地形平滑 | 消除数据噪点 | 卷积滤波(高斯/中值滤波) | | 特征线编辑 | 山脊线/山谷线精确调整 | 矢量线栅格化+缓冲区影响域 | 2. **高级地形建模** - 基于物理的侵蚀模拟:通过水力侵蚀算法自动生成自然地形 - 实时地形变形:使用位移贴图技术实现动态地形调整 #### 三、数据处理核心算法 1. **插值算法集成** $$ z = \frac{\sum_{i=1}^n \frac{z_i}{d_i^p}}{\sum_{i=1}^n \frac{1}{d_i^p}} $$ 其中$d_i$为距离权重,$p$为幂参数,用于反距离权重(IDW)插值 2. **拓扑关系维护** - 编辑操作后自动校验等高线拓扑一致性 - 使用Delaunay三角网重构保证地形连续性 #### 四、质量控制系统 1. **精度验证模块** - 残差分析:$$ \epsilon = \sqrt{\frac{1}{n}\sum_{i=1}^n(z_{obs}^i - z_{model}^i)^2} $$ - 坡度突变检测:通过二阶导数识别不合理地形突变 2. **版本管理** - 实现操作堆栈(Undo/Redo)功能 - 差异备份机制:仅存储修改区域的delta数据 #### 五、典型开发框架 ```mermaid graph TD A[DEM编辑器] --> B[数据接入层] A --> C[核心算法层] A --> D[用户界面层] B --> E[GDAL数据解析] B --> F[空间数据库] C --> G[插值算法库] C --> H[地形分析模块] D --> I[二维视图] D --> J[三维视图] ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值