java gdal_2、JAVA集成GDAL-JAVA开发环境整合GDAL
二、JAVA開發(fā)環(huán)境整合GDAL
1、新建一個SpringMvc或者SpringBoot項目
跳過這個過程,大家根據(jù)IDE自行完成
2、項目資源結(jié)構(gòu)
采用資源管理gdal文件,通過Maven加載gdal.jar,在web應(yīng)用resources目錄下新增gdal文件件,再新建linux,win32兩個子文件夾,結(jié)構(gòu)如下
image.png
3、資源配置gdal.jar,動態(tài)庫文件
從Program Files\gdal\bin\gdal\java 復(fù)制 gdal.jar、lgdalalljni.dll 到項目 resources/gdal/win32
image.png
4、Hello GDAL
(1) POM配置gdal路徑
……
src/main/resources/gdal/win32
(2) POM配置gdal依賴
org.gdal
gdal
3.7.4
system
${project.basedir}/${gdal.bindir}/gdal.jar
(3)Hello GDAL
public static void main(String[] args) {
String shpFileName="\\usr\\test\\zzt_headCells.shp";
String geojsonFileName="\\usr\\test\\zzt_headCells.geojson";
shpToGeojson(shpFileName,geojsonFileName);
}
/**
* shp轉(zhuǎn)換geojson
* @param shpFileName
* @param geojsonFileName
*/
public static void shpToGeojson(String shpFileName,String geojsonFileName) {
log.info("---gdal注冊所有的驅(qū)動開始");
// 注冊所有的驅(qū)動
ogr.RegisterAll();
log.info("---gdal注冊所有的驅(qū)動結(jié)束");
// 為了支持中文路徑,請?zhí)砑酉旅孢@句代碼
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
// 為了使屬性表字段支持中文,請?zhí)砑酉旅孢@句
gdal.SetConfigOption("SHAPE_ENCODING","");
//打開數(shù)據(jù)
DataSource ds = ogr.Open(shpFileName,0);
if (ds == null){
System.out.println("打開文件"+shpFileName+"失敗!" );
return;
}
System.out.println("打開文件成功!" );
org.gdal.ogr.Driver dv = ogr.GetDriverByName("GeoJSON");
if (dv == null){
System.out.println("打開驅(qū)動失敗!" );
return;
}
System.out.println("打開驅(qū)動成功!" );
//輸出geojson的位置及文件名
dv.CopyDataSource(ds, geojsonFileName);
System.out.println("轉(zhuǎn)換成功!");
}
Run As->Java Appliction
image.png
報錯是本地動態(tài)庫gdalalljni載入錯誤,需要加載gdalalljni動態(tài)庫
(4)編寫LibraryUtil.java動態(tài)庫加載類
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/*
* 動態(tài)庫加載類:從資源加載動態(tài)庫
* @date: 20200401
* @author: yuzh
**/
public class LibraryUtil {
private static final Logger log = LoggerFactory.getLogger(LibraryUtil.class);
/**
* 從資源文件加載類
* * @param clazz jar中類
* @param file resources目錄下文件全路徑:/gdal/win32/gdalalljni.dll
*/
public static void loadFromResource(String file) throws IOException{
try {
//獲取系統(tǒng)路徑
String[] libraryPaths=initializePath("java.library.path");
log.info("---LibraryUtil-----java.library.path={}",StringUtil.join(";", libraryPaths));
if(libraryPaths==null||libraryPaths.length==0) {
log.info("---LibraryUtil--請設(shè)置環(huán)境變量java.library.path");
return;
}
String nativeTempDir=libraryPaths[0];
int sepIndex=file.lastIndexOf(File.separator);
if(sepIndex==-1) {
sepIndex=file.lastIndexOf("/");
}
String fileName=file.substring(sepIndex+1);
log.info("---LibraryUtil--從環(huán)境變量{}加載{}",nativeTempDir,fileName);
//系統(tǒng)庫不存在,就從資源文件復(fù)制
File extractedLibFile = new File(nativeTempDir+File.separator +fileName);
if(!extractedLibFile.exists()){
//file resources目錄下文件全路徑:/gdal/windows/gdalalljni.dll
InputStream in = LibraryUtil.class.getResourceAsStream(file);
if(in==null) {
log.info("---LibraryUtil--資源文件不存在{}",file);
throw new FileNotFoundException(file);
}
saveFile(in,extractedLibFile);
//保存文件到j(luò)ava.library.path
log.info("---LibraryUtil--成功保存文件{}到{}",fileName,extractedLibFile.getPath());
}
//注意采用loadLibrary加載時mapLibraryName方法會根據(jù)系統(tǒng)補全名稱
int startIndex=fileName.startsWith("lib")?3:0;
String libName=fileName.substring(startIndex,fileName.indexOf("."));
String mapLibraryName=System.mapLibraryName(libName);
log.info("---LibraryUtil--mapLibraryName={}",mapLibraryName);
//輸出調(diào)試信息
log.info("---LibraryUtil--系統(tǒng)加載動態(tài)庫{}開始",libName);
System.loadLibrary(libName);
log.info("---LibraryUtil--系統(tǒng)加載動態(tài)庫{}完成",libName);
}
catch(Exception ex) {
log.error(ex.getMessage());
}
}
private static String[] initializePath(String propname) {
String ldpath = System.getProperty(propname, "");
String ps = File.pathSeparator;
int ldlen = ldpath.length();
int i, j, n;
// Count the separators in the path
i = ldpath.indexOf(ps);
n = 0;
while (i >= 0) {
n++;
i = ldpath.indexOf(ps, i + 1);
}
// allocate the array of paths - n :'s = n + 1 path elements
String[] paths = new String[n + 1];
// Fill the array with paths from the ldpath
n = i = 0;
j = ldpath.indexOf(ps);
while (j >= 0) {
if (j - i > 0) {
paths[n++] = ldpath.substring(i, j);
} else if (j - i == 0) {
paths[n++] = ".";
}
i = j + 1;
j = ldpath.indexOf(ps, i);
}
paths[n] = ldpath.substring(i, ldlen);
return paths;
}
public static void saveFile(InputStream in, File extractedLibFile) throws IOException{
BufferedInputStream reader = null;
FileOutputStream writer = null;
try {
//文件不存在創(chuàng)建文件,否則獲取流報異常
createFile(extractedLibFile);
reader = new BufferedInputStream(in);
writer = new FileOutputStream(extractedLibFile);
byte[] buffer = new byte[1024];
while (reader.read(buffer) > 0){
writer.write(buffer);
buffer = new byte[1024];
}
} catch (IOException e){
throw e;
} finally {
if(in!=null)
in.close();
if(writer!=null)
writer.close();
}
}
/**
* 文件不存在創(chuàng)建文件,包括上級目錄
*/
public static void createFile(File destFile) throws IOException{
File pfile = destFile.getParentFile();
if (!pfile.exists()) {
pfile.mkdirs();
}
if(!destFile.exists()){
destFile.createNewFile();
}
}
}
(5) Hello GDAL 調(diào)用
static {
log.info("---LibraryUtil--gdal載入動態(tài)庫");
try {
//根據(jù)系統(tǒng)環(huán)境加載資源
String systemType = System.getProperty("os.name");
String file="";
boolean isWin=systemType.toLowerCase().indexOf("win")!=-1;
if(isWin) {
file="/gdal/win32/gdalalljni.dll";
}
else {
file="/gdal/linux/libgdalalljni.so";
}
//從資源文件加載動態(tài)庫
LibraryUtil.loadFromResource(file);
} catch (Exception e) {
e.printStackTrace();
}
}
繼續(xù) Run As->Java Appliction
image.png
缺少依賴庫,載入gdalalljni庫時出錯,梳理執(zhí)行過程:
- 檢查java.library.path環(huán)境變量值
- 從java.library.path環(huán)境變量取第一個路徑為目標(biāo)路徑D:\Program Files\Java\jdk1.8.0_231\bin
- 從目標(biāo)路徑判斷是否存在gdalalljni.dll
- gdalalljni.dll不存在時從資源文件復(fù)制到目標(biāo)路徑
- System.loadLibrary載入gdalalljni.dll
(5)復(fù)制gdalalljni.dll依賴庫到目標(biāo)路徑
把 gdal\bin 下所有的dll復(fù)制到目標(biāo)路徑 D:\Program Files\Java\jdk1.8.0_231\bin
image.png
繼續(xù)Run As->Java Appliction
image.png
到這里,恭喜恭喜,環(huán)境已經(jīng)完全配置好了
ERROR 1: PROJ: proj_identify: Cannot find proj.db如果出現(xiàn)找不到proj.db文件, 配置環(huán)境變量 PROJ_LIB=D:\Program Files\gdal\bin\proj6\share
總結(jié)
以上是生活随笔為你收集整理的java gdal_2、JAVA集成GDAL-JAVA开发环境整合GDAL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mondrian vs Elastics
- 下一篇: 三星手机语音测试软件,三星语音助手隐藏功