以下代码来源于10.3.3. 将栅格查询输出为图像文件的 Java 控制台应用程序,可实现将st_asTiff
/st_asRaster
等postgis函数的查询结果(blob
/bytea
)存储为tif
文件。
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.io.*;
import java.sql.DriverManager;
public class Utils {
/**
* 将st_astiff等查询结果保存为tif文件
*
* @param query 查询语句,例如:WITH point as (select 'SRID=4326;Point(118.74
* 31.94)'::geometry geom) SELECT st_astiff(rast) FROM dem,point
* WHERE st_intersects(rast, point.geom);
* @param filePath 文件保存路径,例如:C:\\Users\\Dust\\a.tif
*/
public void SaveQueryImage(String query, String filePath) {
System.out.println("Checking if Driver is registered with DriverManager.");
try {
// java.sql.DriverManager.registerDriver (new org.postgresql.Driver());
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException cnfe) {
System.out.println("Couldn't find the driver!");
cnfe.printStackTrace();
}
Connection conn = null;
try {
conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/test", "postgres", "postgres");
conn.setAutoCommit(false);
PreparedStatement sGetImg = conn.prepareStatement(query);
ResultSet rs = sGetImg.executeQuery();
FileOutputStream fout;
try {
rs.next();
/** Output to file name requested by user **/
fout = new FileOutputStream(new File(filePath));
fout.write(rs.getBytes(1));
fout.close();
} catch (Exception e) {
System.out.println("Can't create file");
e.printStackTrace();
}
rs.close();
sGetImg.close();
conn.close();
} catch (SQLException se) {
System.out.println("Couldn't connect: print out a stack trace and exit.");
se.printStackTrace();
}
}
}
当结合mybatis或mybatisPlus持久化框架使用时,常会遇到“org.postgresql.util.PSQLException: 不良的类型值 long ”问题。解决方法见Mybatis/MybatisPlus 处理postgres中的blob数据类型(解决“不良的类型值: long”)
最终效果如下图: