日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java gdal_2、JAVA集成GDAL-JAVA开发环境整合GDAL

發(fā)布時間:2024/3/26 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java gdal_2、JAVA集成GDAL-JAVA开发环境整合GDAL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

二、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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本少妇性生活 | 日本免费一区二区视频 | 亚洲伦理天堂 | 亚洲国产精品99久久久久久久久 | 天天噜日日噜 | h视频免费在线观看 | 欧美三级日本三级 | 久久精品福利 | 精品国产一区二区三区久久狼黑人 | 黄色在线观看网址 | 亚洲黄色在线视频 | 婷婷丁香视频 | 蜜臀aⅴ免费一区二区 | 99精品人妻国产毛片 | 性激情视频 | 深夜福利麻豆 | 国产成人三级在线 | www.激情.com| 91成人在线播放 | 欧美9999| 久久视频在线 | 岛国免费视频 | 亚洲性综合网 | 日本啪啪啪一区二区 | 日韩一区二区不卡视频 | 日韩成人自拍 | 日韩视频福利 | 奇米二区 | 久久久久玖玖 | 久久久一二三四 | 久久黄色精品视频 | 波多野结衣网站 | 国产chinesehd精品 | 色呦呦麻豆 | 亚洲欧美视频一区二区 | 欧美日韩综合在线 | 国内精品久久久久久久 | 国产学生美女无遮拦高潮视频 | 婷婷激情六月 | 超碰在线观看91 | 在线不卡一区 | 免费看大片a | 六月色丁香 | 欧美一区二区福利视频 | 亚洲欧美一区二区三区四区五区 | 天天澡天天狠天天天做 | 欧美黄色一区二区三区 | 欧美日韩一区二区三 | 狠狠人妻久久久久久 | 亚洲国产日韩在线一区 | 99视频在线精品免费观看2 | 亚洲女优在线 | 狠狠涩| 美女网站免费视频 | 欧美视频第一页 | sese综合| 亚洲色图日韩精品 | 夜夜嗨aⅴ一区二区三区 | 狠狠操伊人 | 日韩不卡视频在线 | 亚洲综合色一区 | 天天干天天添 | 91免费精品视频 | 天堂va欧美va亚洲va老司机 | 手机在线免费视频 | 男女涩涩 | 伊人日本 | 夜夜嗨av一区二区三区四区 | 色97 | 成人免费看类便视频 | 日韩一二三区在线观看 | 五月天堂婷婷 | 日韩一级片网站 | 国产又粗又猛又爽又黄又 | 在线免费观看黄色网址 | 国产成人免费 | 国产福利不卡视频 | 国产成人精品免费 | 欧美自拍亚洲 | 日韩欧美一级视频 | 国产视频一二区 | 欧av在线 | 亚洲aⅴ乱码精品成人区 | 69午夜 | 黄色一级在线视频 | av在线播放免费 | 国产午夜激情 | 欧美三级午夜理伦三级老人 | 久久综合五月 | 欧美一级片在线免费观看 | 国产成人精品一二三区 | 麻豆免费视频 | 色偷偷久久 | 国产精品爱啪在线线免费观看 | 8x国产一区二区三区精品推荐 | 精品视频一二三 | 嫩草一二三 | 久久蜜桃av一区二区天堂 | 国产碰碰 |