前言
Gdal功能非常强大,不仅可以访问shp、tif等保存在本地的空间数据,还支持访问保存在空间数据库中的空间数据。通过Gdal访问保存在Postgresql中的矢量数据和栅格数据略有差别,前面已经介绍过如何访问矢量数据,具体情况请看这里。OK,下面我们来具体看下如何用Gdal访问保存在Postgresql中的栅格数据。
1、编译Gdal支持Postgresql驱动
默认编译的Gdal是不支持Postgresql驱动的,要通过Gdal访问保存在Postgresql中的栅格数据,必须重新编译Gdal使其支持Postgresql驱动,如果不知道该如何做,可查看这里。
2、访问Postgresql中的栅格数据
本文先将一个名为test的tif影像数据导入(未进行切片)到postgresql中,然后利用Gdal访问Postgresql,读取了该数据的转换系数、长宽、波段数、一栅格上的值,并进行了输出,具体代码如下:
import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;
public class HelloGDAL {
public static void readRasterSpacial(){
String path = "PG:dbname=Test schema=public table=test host=localhost port=5432"
+ " user=postgres password=postgres";
Dataset dataset = null;
try{
gdal.AllRegister();
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
gdal.SetConfigOption("SHAPE_ENCODING","CP936");
dataset = gdal.Open(path, gdalconstConstants.GA_ReadOnly);
double[] trans = dataset.GetGeoTransform();
for(int i = 0; i < trans.length; i++){
System.out.println(trans[i]);
}
Band band=dataset.GetRasterBand(1);
double[] data = new double[1];
band.ReadRaster(1000, 1000, 1, 1, data);
for(int i = 0; i < data.length; i++){
System.out.println(data[i]);
}
int xSize = dataset.getRasterXSize();
int ySzie = dataset.getRasterYSize();
int nBandCount = dataset.getRasterCount();
System.out.println("Size is " + xSize + ", " + ySzie + ", " + nBandCount);
}catch(Exception e){
System.out.println(e.toString());
}finally{
if(dataset != null){
dataset.delete();
}
gdal.GDALDestroyDriverManager();
}
}
public static void main(String[] args) {
readRasterSpacial();
}
}
3、输出结果
参考文献
https://www.gdal.org/frmt_postgisraster.html