如何使用GDAL库在java中编写输出文件? 公共课堂学习{ 公共静态字符串getFilename(){ 字符串strFilename=“”; 扫描仪scnr=新扫描仪(System.in); System.out.print(“输入文件路径:”); strFilename=snr.next(); 返回strFilename; } 公共静态void main(字符串[]args){ gdal.AllRegister(); Dataset inputdata=gdal.Open(getFilename(),gdalConstants.GA_只读); 数据集=null; Driver=null; driver=gdal.GetDriverByName(“GTiff”); 驱动程序寄存器(); 波段2=零; 波段poBand=null; int xsize=inputdata.getRasterXSize(); int-ysize=inputdata.getRasterYSize(); int bandCount=inputdata.GetRasterCount(); int像素=xsize*ysize; int buf_Type=0,buf_Size=0,buf_xSize=0,buf_ySize=0; int[]intArray=新的int[像素]; ByteBuffer[]波段=新的ByteBuffer[bandCount]; 字符串filename_out=getFilename(); System.out.println(文件名\u out+“”+xsize+“”+ysize+“”); dataset=driver.Create(文件名为out,xsize,ysize,1,gdalconst.GDT_字节); SetGeoTransform(inputdata.GetGeoTransform()); SetProjection(inputdata.GetProjection()); band2=dataset.GetRasterBand(1);//可写带 用于(int波段=0;波段0.3){ 二进制像素[i]=1; //System.out.println(“二进制=1”); } 否则{ 二进制像素[i]=0; //System.out.println(“二进制=0”); } } //将数据写入band2。 //在这里,我想使用数据二进制_像素[]编写一个光栅文件,作为一个光栅文件,具有与输入文件相同的投影和转换。 //这里我的文件是“.tif”文件,其中有4个带。 } }
在这里,我还不熟悉使用GDAL库进行遥感图像处理的java编码。需要一些帮助来编写与输入图像和投影变换具有相同尺寸的图像。 提前谢谢。看看这个如何使用GDAL库在java中编写输出文件? 公共课堂学习{ 公共静态字符串getFilename(){ 字符串strFilename=“”; 扫描仪scnr=新扫描仪(System.in); System.out.print(“输入文件路径:”); strFilename=snr.next(); 返回strFilename; } 公共静态void main(字符串[]args){ gdal.AllRegister(); Dataset inputdata=gdal.Open(getFilename(),gdalConstants.GA_只读); 数据集=null; Driver=null; driver=gdal.GetDriverByName(“GTiff”); 驱动程序寄存器(); 波段2=零; 波段poBand=null; int xsize=inputdata.getRasterXSize(); int-ysize=inputdata.getRasterYSize(); int bandCount=inputdata.GetRasterCount(); int像素=xsize*ysize; int buf_Type=0,buf_Size=0,buf_xSize=0,buf_ySize=0; int[]intArray=新的int[像素]; ByteBuffer[]波段=新的ByteBuffer[bandCount]; 字符串filename_out=getFilename(); System.out.println(文件名\u out+“”+xsize+“”+ysize+“”); dataset=driver.Create(文件名为out,xsize,ysize,1,gdalconst.GDT_字节); SetGeoTransform(inputdata.GetGeoTransform()); SetProjection(inputdata.GetProjection()); band2=dataset.GetRasterBand(1);//可写带 用于(int波段=0;波段0.3){ 二进制像素[i]=1; //System.out.println(“二进制=1”); } 否则{ 二进制像素[i]=0; //System.out.println(“二进制=0”); } } //将数据写入band2。 //在这里,我想使用数据二进制_像素[]编写一个光栅文件,作为一个光栅文件,具有与输入文件相同的投影和转换。 //这里我的文件是“.tif”文件,其中有4个带。 } },java,gdal,Java,Gdal,在这里,我还不熟悉使用GDAL库进行遥感图像处理的java编码。需要一些帮助来编写与输入图像和投影变换具有相同尺寸的图像。 提前谢谢。看看这个 Dataset=null; Driver=null; 波段=空; int xsize=4000; int-ysize=400; driver=gdal.GetDriverByName(“GTiff”); ByteBuffer ByteBuffer=ByteBuffer.allocateDirect(4*xsize); byteBuffer.order(B
Dataset=null;
Driver=null;
波段=空;
int xsize=4000;
int-ysize=400;
driver=gdal.GetDriverByName(“GTiff”);
ByteBuffer ByteBuffer=ByteBuffer.allocateDirect(4*xsize);
byteBuffer.order(ByteOrder.nativeOrder());
FloatBuffer FloatBuffer=byteBuffer.asFloatBuffer();
int[]intArray=newint[xsize];
float[]floatArray=新的float[xsize];
dataset=driver.Create(文件名,xsize,ysize,1,gdalconst.gdt32);
band=dataset.GetRasterBand(1);
对于(国际热核试验堆=0;国际热核试验堆
为什么这个标签是Python?您是否查看了GDAL的Java投标API?是的,我想在循环中写一个输出文件,因为我将值存储在二进制像素数组中。如果我尝试使用这个band2.writerater_Direct(0,0,xsize,ysize,xsize,ysize,buf_类型,二进制像素);数据类型不匹配。。。。我不知道如何解决它。。。有什么建议吗?把你的问题弄清楚。您是如何尝试写入数据的,错误是什么(如果有)?使用字节[]
类型怎么样?此外,对于布尔光栅,可以使用创建选项NBITS=1
来减小文件大小(如果这是一个问题)。
public class Learn {
public static String getFilename(){
String strFilename = "";
Scanner scnr = new Scanner(System.in);
System.out.print("Enter the file path: ");
strFilename = scnr.next();
return strFilename;
}
public static void main(String[] args) {
gdal.AllRegister();
Dataset inputdata = gdal.Open(getFilename(), gdalconstConstants.GA_ReadOnly);
Dataset dataset = null;
Driver driver = null;
driver = gdal.GetDriverByName("GTiff");
driver.Register();
Band band2=null;
Band poBand = null;
int xsize = inputdata.getRasterXSize();
int ysize = inputdata.getRasterYSize();
int bandCount =inputdata.GetRasterCount();
int pixels = xsize*ysize;
int buf_Type = 0, buf_Size = 0, buf_xSize = 0,buf_ySize = 0;
int[] intArray = new int[pixels];
ByteBuffer[] bands = new ByteBuffer[bandCount];
String filename_out = getFilename();
System.out.println(filename_out+" "+xsize+" "+ysize+" ");
dataset = driver.Create(filename_out, xsize, ysize, 1, gdalconst.GDT_Byte);
dataset.SetGeoTransform(inputdata.GetGeoTransform());
dataset.SetProjection(inputdata.GetProjection());
band2 = dataset.GetRasterBand(1); // writable band
for (int band=0; band<bandCount; band++){
poBand = inputdata.GetRasterBand(band+1);
buf_Type = poBand.getDataType();
buf_Size = pixels * gdal.GetDataTypeSize(buf_Type)/8;
buf_xSize = xsize*gdal.GetDataTypeSize(xsize)/8;
buf_ySize = ysize*gdal.GetDataTypeSize(ysize)/8;
System.out.println(buf_Type+","+gdal.GetDataTypeName(poBand.getDataType()));
ByteBuffer data = ByteBuffer.allocateDirect(buf_Size);
data.order(ByteOrder.nativeOrder());
// reading data into "data" buffer
poBand.ReadRaster_Direct(0, 0, poBand.getXSize(), poBand.getYSize(), xsize, ysize, buf_Type, data);
bands[band] = data;
}
//generating indices;
float[] NDVI= new float[xsize*ysize];
Byte[] Binary_pixels= new Byte[xsize*ysize];
for (int i=0; i< xsize*ysize; i++)
{
int Red = bands[3].get(i) & 0xFF;
int NIR = bands[4].get(i) & 0xFF;
//NDVI
if ((NIR+Red) !=0){
NDVI[i]= (float)(NIR-Red)/(NIR+Red);
// System.out.println("NDVI: " + NDVI[i]);
}
else {
NDVI[i]=0;
// System.out.println("NDVI: " + NDVI[i]);
if (NDVI[i] > 0.3 ){
Binary_pixels[i]= 1;
// System.out.println("Binary=1");
}
else{
Binary_pixels[i]=0;
// System.out.println("Binary = 0");
}
}
// writing data into band2.
// Here I want to write a raster file using the data Binary_pixels[] as a raster file with the same projection and Transformations as the input file.
// here my file is ".tif" file with 4 bands in it.
}
}
Dataset dataset = null;
Driver driver = null;
Band band = null;
int xsize = 4000;
int ysize = 400;
driver = gdal.GetDriverByName("GTiff");
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4 * xsize);
byteBuffer.order(ByteOrder.nativeOrder());
FloatBuffer floatBuffer = byteBuffer.asFloatBuffer();
int[] intArray = new int[xsize];
float[] floatArray = new float[xsize];
dataset = driver.Create(filename, xsize, ysize, 1, gdalconst.GDT_Float32);
band = dataset.GetRasterBand(1);
for (int iter = 0; iter < nbIters; iter++)
{
if (method == METHOD_DBB)
{
for (int i = 0; i < ysize; i++)
{
for (int j = 0; j < xsize; j++)
{
floatBuffer.put(j, (float) (i + j));
}
band.WriteRaster_Direct(0, i, xsize, 1, gdalconst.GDT_Float32, byteBuffer);
}
}
else
{
for (int i = 0; i < ysize; i++)
{
for (int j = 0; j < xsize; j++)
{
floatArray[j] = (float) (i + j);
}
band.WriteRaster(0, i, xsize, 1, floatArray);
}
}
}
dataset.delete();