有没有办法用javascript从tiff图像中提取地理标签?

gab6jxml  于 2023-03-06  发布在  Java
关注(0)|答案(3)|浏览(244)

我正在做一个需要我使用正射镶嵌Map的项目。这个Map是. tiff格式的。我想从这个Map中提取地理信息,这样我就可以正确地将它覆盖在谷歌Map上。我在这个项目中使用的是mean stack。
所以我最后的问题是:有没有办法用javascript从tiff图像中提取地理标签?
编辑:当我使用Maptiler(https://www.maptiler.com/)时,它会自动将. tif文件正确地放置在谷歌Map上。我想知道它是如何提取信息并放置在Map上的,以便我自己动手。

ubof19bj

ubof19bj1#

有一个开源库叫做open layers https://openlayers.org/,这是覆盖你的tiff图像的最好方法,一旦把tiff图像包含在这个层上,你就可以提取任何你需要的信息。
你可以使用Angular与typescript或java脚本,这是更好的。基本上你可以得到每一个细节的方式坐标从您的tiff图像使用这个库。
建立这个库是一个复杂的项目,我只是给你一个想法,你可以accopmlish。我想帮助你在这件事上。我知道这是不多,我解释,我不能给予你太多的细节,因为我不知道这个问题的细节。如果你需要任何帮助联系我。

prdp8dxp

prdp8dxp2#

为了读取TIFF标签,您需要一个合适的TIFF解析器,比如tiff包,这样您就可以运行IFD块的非位图部分:

import tiff from "tiff";

// Load a GeoTIFF file
const file = fs.readFileSync(`ALPSMLC30_N048W124_DSM.tif`);
// We can do this in the browser, too, the `decode` function takes an ArrayBuffer
const image = tiff.decode(file.buffer);
// get the first IFD
const data = image[0];
// let's see what tags apply
console.log(data.fields);

产量(对于此特定GeoTIFF):

Map(19) {
  254 => 0,
  256 => 3600,
  257 => 3600,
  258 => 16,
  259 => 1,
  262 => 1,
  273 => Uint32Array(3600) [
    ... 3600 more items
  ],
  274 => 1,
  277 => 1,
  278 => 1,
  279 => Uint32Array(3600) [
    ... 3600 more items
  ],
  282 => 1,
  283 => 1,
  284 => 1,
  339 => 2,
  33550 => Float64Array(3) [ 0.0002777777777777778, 0.0002777777777777778, 0 ],
  33922 => Float64Array(6) [ 0, 0, 0, -124, 49, 0 ],
  34735 => Uint16Array(24) [
       1,       1,    0,    5,
       1024,    0,    1,    2,
       1025,    0,    1,    1,
       2048,    0,    1, 4326,
       2052,    0,    1, 9001,
       2054,    0,    1, 9102
  ],
  34737 => 'WGS-84'
}

标签号与https://www.awaresystems.be/imaging/tiff/tifftags.html上列出的标签号匹配,因此33550model pixel scale标签,34737GeoASCII params标签,依此类推。
其中,34735可以说是最重要的标签,因为它包含GeoKey dictionary
第一行读作“Tiff version 1”,“keys revision 1. 0“(编码为两个值),然后告诉我们有5 keys

  • 1024(型号类型)具有值2:地理经纬度系统。
  • 1025(栅格类型)的值为1:每个像素代表一个区域。
  • 2048(地理类型)具有值4326:这是WGS84数据。
  • 2052(线性单位)的值为9001:数据使用EPSG线性单位(即“十进制度”)。
  • 2054(Angular 单位)的值为9102:数据的Angular 方面是弧度。

做Map相关的事情(在没有为您放置tiff的工具的情况下),我们可以从标签33922看到,值为0的像素索引[0][0]Map到海拔0m处的真实的世界坐标N48W124,并且我们可以从标签33550看到,每个像素在x和y方向上都表示1弧度 * 0.00027[...] = 30米,这允许我们以适当的平移和比例将数据覆盖在Map上。

5vf7fwbs

5vf7fwbs3#

tiff -是一种光栅图像格式。所以要从它获取信息(除了纯图形),如果它是例如谷歌Map的截图是不可能的,也许通过使用一些复杂的库,如OpenCV
但我想你是想得到EXIF的信息,这可以在照片中出现。要做到这一点,你可以使用exif npm library

var ExifImage = require('exif').ExifImage;

try {
    new ExifImage({ image : 'your.tiff' }, function (error, exifData) {
        if (error)
            console.log('Error: '+error.message);
        else {
            let location = exifData.gps || 'who knows, maybe somwhere else :(';
            console.log(location); // pass location to google maps after some transforming 
        } 
    });
} catch (error) {
    console.log('Error: ' + error.message);
}

相关问题