`
H4X0R
  • 浏览: 12435 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java调用GDAL 写入矢量文件编译环境搭建

    博客分类:
  • GIS
阅读更多

JDK环境变量配置

右键计算机——》属性——》高级系统设置——》环境变量——》新建系统变量:
新建两个系统变量JAVA_HOME、CLASSPATH
变量名:JAVA_HOME
变量值:C:\Program Files (x86)\Java\jdk1.5.0_22
变量名:CLASSPATH
变量值(注意前面的点分号不能少):.;%JAVA_HOME%/lib
变量名:JAVA_HOME
 
在Path前面增加(如果没有Path系统变量,则新建)"%JAVA_HOME%/bin;"
%JAVA_HOME%/bin;%SystemRoot%\system32;。。。。。。
 

获取GDAL Java版编译文件

获取GDAL Java编译文件主要有两种方法
第一种:下载GDAL源码,用Visual Studio 编译得到。
第二种:下载别人已经编译好的GDAL java库。
 
这里采用第二种方法,去下载32位GDAl得到release-1600-dev.zip,解压,到目录release-1600\bin\gdal\java下提取其中的5个文件,即:
gdal.jar
gdalconstjni.dll
gdaljni.dll
ogrjni.dll
osrjni.dll
1个jar包,4个dll。
新建一个java工程,把jar包放在工程的lib库下面,4个dll放在工程根目录下面。
 
运行demo,当执行到ogr.RegisterAll()注册所有的驱动时,会报如下两种可能的错误
 
Nativelibraryloadfailed.
java.lang.UnsatisfiedLinkError:noogrjniinjava.library.path
Exceptioninthread"main"java.lang.UnsatisfiedLinkError:RegisterAll
atorg.gdal.ogr.ogrJNI.RegisterAll(NativeMethod)
atorg.gdal.ogr.ogr.RegisterAll(ogr.java:115)
atcom.gdal.vector.ShapeFileWrite.main(ShapeFileWrite.java:20)
原因:没有将4个dll放在工程根目录下面。
 
或者:
Nativelibraryloadfailed.
java.lang.UnsatisfiedLinkError:D:\InspurWorkspace\GDALTest01\ogrjni.dll:Can'tfinddependentlibraries
Exceptioninthread"main"java.lang.UnsatisfiedLinkError:RegisterAll
atorg.gdal.ogr.ogrJNI.RegisterAll(NativeMethod)
atorg.gdal.ogr.ogr.RegisterAll(ogr.java:115)
atcom.gdal.vector.ShapeFileWrite.main(ShapeFileWrite.java:20)
 
原因,ogrjni.dll缺少依赖的其它dll,用一个dll依赖工具查看下,ogrjni.dll还依赖于一个叫做gdal111.dll。
 

 
问题到这一步,如果你想直接把这个gdal111.dll拷贝到工程跟目录下面去的话,会发现这个gdal111.dll又依赖于其它dll,所以自然而然,你想到了把这个目录下面的所有dll全部拷贝到工程根目录下面去,这样程序能够执行了,但是你会发现,你每建一个工程都需要这样做。
 
 

配置GDAL Dll调用路径

上述问题转换为java如何调用c++编译后的dll库。目前自己找到3种方法
方法1、直接将dll文件放在java工程根目录下面。
GDAL Java demo编译成功。优点:思路简单、32为、64位dll可以很方便的切换。缺点:每次新建工程都需要拷贝这些dll,增加工程文件大小,操作繁琐。
方法2、在Eclipse里面编译java的时候设定其Java Build Path-》Source 选择工程名下面的 Native library location选择dll所在路径。
GDALJava demo编译失败,
方法3、设置系统环境变量指定dll路径,将其加入Path中
 
前两种方法是从别人那里看到的,第3种方法是自己想出来的,想法也很简单,在操作系统中运行一个程序(命令)时,如果没有指定绝对路径,它会先去程序本身所在的路径下面去寻找可执行文件,当找不到这些文件的时候,会去环境变量Path下面去寻找需要的东西。所以我们只需要将这个GDAL dll的路径加入到Path里面就行了,
 
右键计算机——》属性——》高级系统设置——》环境变量——》新建系统变量:
新建两个系统变量GDAL32_DLL
变量名:GDAL32_DLL
变量值:C:\GDAL\release-1600-win32-dev\release-1600\bin;C:\GDAL\release-1600-win32-dev\release-1600\bin\gdal\java
名字可以自己定义,指定GDAL DLL路径位置,和GDAL java版编译出路径。
在Path前面增加(如果没有Path系统变量,则新建)"%GDAL32_DLL%;",即path变为
%GDAL32_DLL%;%JAVA_HOME%/。。。。。。
 
注意:将dll加入Path后,需要重启电脑,或者先注销后在进入windows系统,才会生效。

 

Java调用GDAL写入矢量文件 Demo

package com.gdal.vector;

import org.gdal.gdal.gdal;
import org.gdal.ogr.DataSource;
import org.gdal.ogr.Feature;
import org.gdal.ogr.FeatureDefn;
import org.gdal.ogr.FieldDefn;
import org.gdal.ogr.Geometry;
import org.gdal.ogr.Layer;
import org.gdal.ogr.ogr;

public class ShapeFileWrite {
	
	public static void main(String[] args) {
	
	
	         String strVectorFile ="D:\\test\\gdal\\testShap05.shp";  
	   
	         // 注册所有的驱动
	         ogr.RegisterAll();
	        
	         // 为了支持中文路径,请添加下面这句代码
	         gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
	         // 为了使属性表字段支持中文,请添加下面这句
	         gdal.SetConfigOption("SHAPE_ENCODING","");
	 
	         //创建数据,这里以创建ESRI的shp文件为例
	         String strDriverName = "ESRI Shapefile";
	         org.gdal.ogr.Driver oDriver =ogr.GetDriverByName(strDriverName);
	         if (oDriver == null)
	         {
	                   System.out.println(strVectorFile+ " 驱动不可用!\n");
	                   return;
	         }
	 
	         // 创建数据源
	         DataSource oDS = oDriver.CreateDataSource(strVectorFile,null);
	         if (oDS == null)
	         {
	                   System.out.println("创建矢量文件【"+ strVectorFile +"】失败!\n" );
	                   return;
	         }
	 
	         // 创建图层,创建一个多边形图层,这里没有指定空间参考,如果需要的话,需要在这里进行指定
	         Layer oLayer =oDS.CreateLayer("TestPolygon", null, ogr.wkbPolygon, null);
	         if (oLayer == null)
	         {
	                   System.out.println("图层创建失败!\n");
	                   return;
	         }
	 
	         // 下面创建属性表
	         // 先创建一个叫FieldID的整型属性
	         FieldDefn oFieldID = new FieldDefn("FieldID", ogr.OFTInteger);
	         oLayer.CreateField(oFieldID, 1);
	 
	         // 再创建一个叫FeatureName的字符型属性,字符长度为50
	         FieldDefn oFieldName = new FieldDefn("FieldName", ogr.OFTString);
	         oFieldName.SetWidth(100);
	         oLayer.CreateField(oFieldName, 1);
	 
	         FeatureDefn oDefn =oLayer.GetLayerDefn();
	 
	         // 创建三角形要素
	         Feature oFeatureTriangle = new Feature(oDefn);
	         oFeatureTriangle.SetField(0, 0);
	         oFeatureTriangle.SetField(1, "三角形");
	         Geometry geomTriangle =Geometry.CreateFromWkt("POLYGON ((0 0,20 0,10 15,0 0))");
	         oFeatureTriangle.SetGeometry(geomTriangle);
	 
	         oLayer.CreateFeature(oFeatureTriangle);
	 
	         // 创建矩形要素
	         Feature oFeatureRectangle = new Feature(oDefn);
	         oFeatureRectangle.SetField(0, 1);
	         oFeatureRectangle.SetField(1, "矩形");
	         Geometry geomRectangle =Geometry.CreateFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))");
	         oFeatureRectangle.SetGeometry(geomRectangle);
	 
	         oLayer.CreateFeature(oFeatureRectangle);
	 
	         // 创建五角形要素
	         Feature oFeaturePentagon = new Feature(oDefn);
	         oFeaturePentagon.SetField(0, 2);
	         oFeaturePentagon.SetField(1, "五角形");
	         Geometry geomPentagon =Geometry.CreateFromWkt("POLYGON ((70 0,85 0,90 15,80 30,65 15,70 0))");
	         oFeaturePentagon.SetGeometry(geomPentagon);
	 
	         oLayer.CreateFeature(oFeaturePentagon);
	         
	         //写入文件
	         oLayer.SyncToDisk();
	         oDS.SyncToDisk();
	 
	         System.out.println("\n数据集创建完成!\n");
	}  
}
 

执行结果

 
还有一点小问题,中文乱码,上述代码是按照这篇博文说的写的,修复了下绘制五边形问题和将数据写入磁盘。
 


 

总结:

 
如果是64位java 调用GDAL环境,需要保证3者一致,即64位JDK+64位Eclipse+64位GDAL。64位GDAL需要去下载release-1600-x64-dev.zip把64为的GDAL dll文件加入Path中。
写这篇博客是为了方便新人快速搭建java调用GDAL库,自己就在这个过程中遇到了很多问题,花了很多时间,上述仅仅是个人的一些理解,有不对的地方请指正。

 

附件:

编译后的GDAL下载url:http://download.gisinternals.com/sdk.php
ShapeExplore(查看生成的shp文件)下载url:http://www.sz1001.net/soft/41323.htm
 

参考文献

 
分享到:
评论

相关推荐

    体育课评分系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip

    体育课评分系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS

    【东证期货-2024研报】短期关注天气能否触发惜售.pdf

    研究报告

    客运自助售票小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip

    客运自助售票小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS

    一个完整yolov8整合包.zip

    一个完整yolov8整合包yolov8-一体机一个完整yolov8整合包参考仓库https://github.com/z1069614715/objectdetection_scriptB站教学视频https://www.bilibili.com/video/BV15g4y157MF/

    解决CAM350导入提示“找不到首标题%,载入停止”

    解决CAM350导入gerber提示“找不到首标题%,载入停止” 把文件放到gerber上一层或gerber层,运行此bat命令即可

    【浙江大学-2024研报】2024大学生生成式人工智能应用现状与思考.pdf

    行业研究报告、行业调查报告、研报

    使用yolov7训练自己的数据集.zip

    使用yolov7训练自己的数据集pytorch-yolov7使用yolov7训练自己的数据集参考https://github.com/WongKinYiu/yolov7

    毕业设计&课设_宠物寄养管理系统:计算机毕设项目.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    毕业设计&课设_房产中介信息管理系统.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    机电一体化系统中机器学习应用的最终项目.zip

    机电一体化系统中机器学习应用的最终项目交通标志检测-Tensorflow-YOLOv3-YOLOv4与 Syed Imad 合作完成的机电一体化系统中机器学习应用的最终项目 ( https://github.com/syed019 )关于任何识别系统都有两个主要任务检测(在输入图像上找到物体的位置和大小)和分类(将检测到的物体分类为子类)。这两项任务通常都使用单个检测/分类模型(如 YOLO 或 SSD)完成,其中输入图像用边界框和相应的类别标记。但是,标记和训练此类数据集需要大量时间和精力。因此,该项目的主要目标是仅检测一个主要类别(标志),并集成定制的卷积神经网络来对检测到的物体进行分类(子类,如限速、停车标志等)。这样,我们只需要训练一次检测模型来检测一个主要类别,而可以根据任务要求训练多个分类模型来对检测到的物体进行分类。输出实时检测对已保存图像进行检测 设置和要求OpenCV(版本 4)PythonNumpyTensorFlow喀拉拉YOLO 实现对于这个项目,由于时间限制,我们决定使用公开可用的数据集(德国交通标

    Yolov3的Pytorch版本实现模板检测.zip

    Yolov3的Pytorch版本实现模板检测YOLOV3-火​​灾探测csdn githubYolov3的Pytorch版本实现模板检测,其具体效果如下要求环境windows10编程语言python编程工具pycharm所需的包requirements.txt火车1.安装包本次需要的包在requirements.txt中,通过 pip install -r requirements.txt即可。2.所需体重文件$ cd weights/$ bash download_weights.sh进入weights目录下,运行sh文件,即可下载本次所需权重,即darknet53.conv.74,yolov3.weights,yolov3-tiny.weights3.修改配置文件信息$ cd config/$ bash create_custom_model.sh <num_classes>进入config目录。执行bash create_custom_model.sh <num_classes>,其中num_classes为类别参数,根据

    毕业设计&课设_女装商店管理系统:Java 毕设项目.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    使用 yolov4 进行头盔(安全帽)检测.zip

    Yolov4-deepsort-头盔检测使用darknet 框架YOLOv4 模型训练的头盔(安全帽)检测器。测试环境Windows 10 x64 2020 (build 19041.388)NVIDIA RTX 2070 SuperCUDA 10.1 / CuDNN 7.6.5Python 3.7.7 x64tensorflow 2.2.0 GPU受训重量Google 云端硬盘放入体重文件./configs要使用自己的数据集进行训练,你应该自己使用darknet。并且需要更改一些参数使用数据集roboflow.ai 公共数据集+ 约 100 张图片依赖项Pythonopencv-python、numpy、scikit-image在图像上绘制框和文本TensorFlow 2.2.0使用DeepSORT模型来跟踪对象matplotlib创建颜色图CUDA 10.1 / CuDNN 7.6.5暗网用于 yolov4 物体检测dark.dll, pthreadVC2.dll (windows)预编译(我不确定它是否可以在不同的机器上运行

    【五矿期货-2024研报】油脂周报:需求受抑制,阶段调整.pdf

    研究报告

    运算放大器和比较器基础知识及电气特性详解

    内容概要:本文详细介绍了运算放大器和比较器的基本原理及其内部电路结构。内容涵盖了运算放大器和比较器的定义、内部电路、绝对最大额定值、电气特性、相位延迟、振荡、可靠性和响应时间等方面。通过具体的公式和实例,阐述了它们的工作机制和技术细节。 适合人群:具有电子工程背景的专业人士,尤其是从事模拟电路设计的技术人员。 使用场景及目标:适用于理解和设计运算放大器和比较器的应用电路,帮助读者掌握其关键技术和参数,优化电路性能。 其他说明:文中提供了大量图表和实例,以便读者更好地理解和应用相关理论。同时,还详细介绍了如何解决一些常见问题,如振荡、失真和噪声等问题。

    基于uniapp的奶茶店点餐微信小程序+基于SpringBoot和Vue的管理后台

    基于uniapp的奶茶店点餐微信小程序+基于SpringBoot和Vue的管理后台,含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行! 基于uniapp的奶茶店点餐微信小程序+基于SpringBoot和Vue的管理后台基于uniapp的奶茶店点餐微信小程序+基于SpringBoot和Vue的管理后台基于uniapp的奶茶店点餐微信小程序+基于SpringBoot和Vue的管理后台基于uniapp的奶茶店点餐微信小程序+基于SpringBoot和Vue的管理后台基于uniapp的奶茶店点餐微信小程序+基于SpringBoot和Vue的管理后台基于uniapp的奶茶店点餐微信小程序+基于SpringBoot和Vue的管理后台基于uniapp的奶茶店点餐微信小程序+基于SpringBoot和Vue的管理后台基于uniapp的奶茶店点餐

    YOLOC 是将不同的模块组合起来构建不同的物体检测模型,包括 YOLOv3、YOLOv4、Scaled-YOLOv4、YOLOv5、YOLOv6、YOLOv7、YOLOX、YOLOR、PPY.zip

    YOLOC 是将不同的模块组合起来构建不同的物体检测模型,包括 YOLOv3、YOLOv4、Scaled_YOLOv4、YOLOv5、YOLOv6、YOLOv7、YOLOX、YOLOR、PPYOLO、PPYOLOEYOLOC介绍 YOLOC正在组合不同的模块来构建不同的对象检测模型。结合一些模块和技巧来改进YOLO检测模型,使用不同数据集的效果不一致。需要通过具体的实验进行尝试和验证YOLOC中的支持的模块有主流 YOLOv3 模型网络结构主流YOLOv4模型网络结构主流 Scaled_YOLOv4 模型网络结构主流YOLOv5模型网络结构主流 YOLOv6 模型网络结构主流 YOLOv7 模型网络结构主流 YOLOX 模型网络结构主流 YOLOR 模型网络结构 PicoDet模型网络结构变压器架构的主干、颈部、头部改进了变压器系列的骨干、颈部、头部注意系列的脊椎、颈部、头部基于anchor-free和anchor-based的检测器FPN、PANet、BiFPN等结构CIoU、DIoU、GIoU、EIoU、S

    (完整数据)县域农产品产量面板数据2000-2021年

    ## 数据指标说明 资源名称:2000-2021年县域农产品产量面板数据 区域范围:全国各县区 时间范围:2000-2021年 格式:Excel 数据量:近30w 指标:县域代码、县域名称、所属地级市、所属省份、产品种类或名称、单位、产量

    【五矿期货-2024研报】锰硅周报:宏观情绪仍为主要矛盾,价格跟随做宽幅震荡,继续关注12月份会议.pdf

    研究报告

    基于 NCNN 的 YOLOv5,YOLOv7,YOLOv8 检测和姿势推理的 Android 库.zip

    基于 NCNN 的 YOLOv5/YOLOv7/YOLOv8 检测和姿势推理的 Android 库基于NCNN的 YOLOv5/YOLOv7/YOLOv8 检测/姿势推理的 Android 库支持yolov5、 edgeai-yolov5、 yolov7、 yolov8系统Android 5.0+(21)English 中文如何1 下载.aar文件2 将.aar 文件放入 app/libs 目录中3 编辑 app/build.gradleimplementation files('libs/yolo_mobile_release_xxxxyyzz_v.*.aar')4 将ncnn.bin和.param放入assets目录5 创建名为'yolo_cfg.json'的新文件{ "name": "yolov8n", "input_size": 384, "param": "yolov.param", "bin": "yolo.bin", "box_thr": 0.5, "iou_thr": 0.5, "nkpt":

Global site tag (gtag.js) - Google Analytics