注意:读取tiff图像的像素值,并非rgb,这是GIS方向的同学应当明晓的事情。
由于本人之前糊里糊涂的将tiff图像的rgb值作为了像素值来读取,白折腾很久很久。希望这篇文章能够为正处于此时期的童鞋做些贡献吧。
正文:
首先,需要在maven中添加上geotools的依赖;明确:geotools是一个开源的 Java GIS 工具包,可利用它来开发符合标准的地理信息系统。这个工具包里面包含了我们需要提取像素值的方法,以及获取图像的经纬度等元数据(这个元数据并非指的是拍摄地点等信息)。文章末会附上下载连接和相关教程以及开发文档。
通过getBounds()方法可以获取图像的经纬度范围:
import java.io.File;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.gce.geotiff.GeoTiffReader;
import org.geotools.geometry.Envelope2D;
public class Localtest {
public static void main(String[] args) throws Exception {
// String path = "C:\\Users\\86156\\Desktop\\imageio-tiff\\src\\main\\resources\\in\\drifted\\imageio\\Show.tif";
String path = "E:/aod.tiff";
GetImageExt(path);
}
public static String GetImageExt(String path) {
String strExtent = "";
double coverageMinX = 0.000;
double coverageMaxX = 0.000;
double coverageMinY = 0.000;
double coverageMaxY = 0.000;
try {
String ImageUrl = path.replace("\\", "\\\\");
File ImageFile = new File(ImageUrl);
GeoTiffReader reader = new GeoTiffReader(ImageFile);
GridCoverage2D coverage = reader.read(null);
Envelope2D coverageEnvelope = coverage.getEnvelope2D();
coverageMinX = coverageEnvelope.getBounds().getMinX();
coverageMaxX = coverageEnvelope.getBounds().getMaxX();
coverageMinY = coverageEnvelope.getBounds().getMinY();
coverageMaxY = coverageEnvelope.getBounds().getMaxY();
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(coverageMinX);
System.out.println(coverageMaxX);
System.out.println(coverageMinY);
System.out.println(coverageMaxY);
return strExtent;
}
}
这里得到的是图像的经纬度范围。
通过getSampleFloat(i, j, 0)方法可以获取具体像素位置的像素值,该像素值于在arcgis等gis软件内显示识别的内容一致。
Raster sourceRaster = sourceImage.getData();
float[] adsaf = {0};
float[] q = sourceRaster.getPixel(229, 237, adsaf);
float ibandvalue = sourceRaster.getSampleFloat(88, 88, 0);
System.out.println(ibandvalue);
for (int i = 0; i < iwidth; i++) {
for (int j = 0; j < iheight; j++) {
if(sourceRaster.getSampleFloat(i, j, 0)!=0)
System.out.print("(i=" + i + ",j=" + j + ")"+sourceRaster.getSampleFloat(i, j, 0));
}
System.out.println();
}
运行结果:
上面代码我只截取了一部分,如果有需要全部可以站内私信发你,输出结果只显示了非0的,但实际应当根据边界判断去遍历图像,下图是在arcgis中识别的结果。
至此可以遍历并保存对比了。
下面是geotools和帮助文档的下载链接和提取码
复制这段内容后打开百度网盘手机App,操作更方便哦
链接:https://pan.baidu.com/s/1wPV9rCyVllUTcBrcUeT1qA
提取码:le88
阿里云盘:https://www.aliyundrive.com/s/ob8TPnTxeGZ
如果觉得本文对您有用请点个赞支持一下。