Java环境下GDAL / OGR环境配置与入门

  • 0.概述
  • 1.环境配置
    • 1.1 开发环境下载
    • 1.2 环境变量配置
    • 1.3java工程配置
      • 1.3.1新建Java工程
      • 1.3.2添加GDAL的jar文件并构建
      • 1.3.3 添加一个dll文件到工程
  • 2.程序开发
    • 2.1 界面搭建
    • 2.2功能实现

0.概述

先放一个图标:

在尝试在C#环境下使用OGR之后,由于可参考的代码太少,并且C#环境下没办法构建可视化界面,并且C#会乱码。所以转向Java平台了,用Java开打GDAL和OGR的人比较多,网上代码也多,相对来说效率就更高一些了。
刚接触的时候用的还是Eclipse,还没用过IDEA,所以这篇文章也是基于Eclipse的,但是实际上两者差不多。下面是程序运行的情况,本示例仅打开Shapefile文件,关于界面显示,用到了GeoTools,后面学了之后介绍。

1.环境配置

关于环境配置网上的教程太多了,但是他们有一个共同的特点,就是过于条理性不足,并且对每一步的解释不够清晰,这篇文章我把步骤分为以下三个部分,希望能更容易被理解。
在进行下面的步骤之前,请确定自己已经配置了Java环境,并且Java的环境变量已经配置完毕。

1.1 开发环境下载

所需要下载的文件就只有一个,打开这个网站,找一个合适的版本下载即可 GDAL下载地址 ,我下载的是下图的版本,也可以选择其他版本,大差不差。

打开下载的压缩包,可以看到下面的文件

打开bin目录,众所周知,bin下面就是关键的文件了,一会这个目录要加到环境变量里面

打开gdal目录,这个时候就可以看到Java目录了,里面有两个文件,是用来配置Java工程的,1.3里面会用到


把这些文件解压到任意一个目录下面,之后就可以开始环境变量的配置了。

1.2 环境变量配置

网上关于环境配置的方法,大都是把刚下载文件里面的dll文件一股脑的放到Java目录下面,这样有个好处,就是十分方便,但是我感觉这样会一定程度的污染到Java环境,并且当自己不像再用GDAL的时候,想要把他的组件删掉,是一件很麻烦的事情。
从原理上面来说,直接把dll文件所在目录放到环境变量里面也是可以的,并且这个方法看起来更加符合逻辑。
因此具体做法是这样的
①右键桌面计算机,点击属性

②点击打开界面中右侧的高级系统设计

③点击环境变量按钮

④找到path,点击编辑

⑤点击新建按钮,把刚才下载文件解压目录的对文件夹加载进去,实际上不需要把这五个都加进去,但是为了避免以后再加,这次就索性全部添加进去。

⑥之后一路点确定,就完成环境变量配置了,下面创建一个Java工程,在Java里面进行一些配置。

1.3java工程配置

1.3.1新建Java工程

新建工程不多说了,直接New一个空的项目就行

1.3.2添加GDAL的jar文件并构建

新建一个lib文件夹,然后把1.1里面最后一张图片的后缀为jar的文件放进去
=>
之后右键这个gdal.jar,点击Build Path,把它添加到没模型构建起里面。

1.3.3 添加一个dll文件到工程

环境配置的最后一步,就是把gdalalljni.dll文件放到java的根目录下面,具体原理我也不知道,总之放就行了
=>
到这里环境变量配置工作就完成了,要使用GDAL,需要把组件在java文件开头引用一下

import org.gdal.ogr.*;
import org.gdal.gdal.*;

然后使用前把这两个东西注册一下

import org.gdal.ogr.*;
import org.gdal.gdal.*;

下面就可以开始使用了。

2.程序开发

2.1 界面搭建

java的swing界面虽然看起来美观度有些欠缺,但是用起来还是没什么问题的,下面搭建一个简单的界面,详细说明放在代码注释里面,界面上面的功能并没有全部实现,只需要关注打开Shapefile这一个功能即可:

//创建一个类,继承JFrame,实现ActionListener接口
public class Plugin_PostGIS extends JFrame implements ActionListener{//注册一些公共组件,这其中包括了菜单栏按钮,表格,地图等等JMenuItem openshapefile;JMenuItem gdb;JMenuItem mdb;JMenuItem ConnectPostgres;JMenuItem discardPostgres;JMenuItem New;JMenuItem Delet;JMenuItem Import;JMenuItem Select;JMapPane mapPane;JTable table;MapLayerTable maptable;ArcDataToPostgre myArcDataToPostgre;Quickstart a;Postgis_OGR pPostgis_OGR;JComboBox filecombox = new JComboBox();JComboBox datacombox = new JComboBox();JButton jb2;JButton jb1;//注册GDALpublic Plugin_PostGIS() {org.gdal.gdal.gdal.AllRegister();org.gdal.ogr.ogr.RegisterAll();// TODO Auto-generated method stubInit();}private static Map DBMAP = new HashMap<String, Object>() {{put("dbtype", "postgis");put("host", "localhost");put("port", 5432);put("schema", "public");put("database", "little_c_sharp");put("user", "postgres");put("passwd", "107530");}};public void Init() {this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);Dimension dm = Toolkit.getDefaultToolkit().getScreenSize();this.setBounds(dm.width/2-300, dm.height/2-300, 700, 700);this.setLayout(new BorderLayout());//菜单栏目JMenuBar menuBar = new JMenuBar();JMenu menufile = new JMenu("File");JMenu menudatabase = new JMenu("Database");openshapefile = new JMenuItem("打开OpenShapefile文件");gdb = new JMenuItem("打开gdb数据库");mdb = new JMenuItem("打开mdb数据库");ConnectPostgres = new JMenuItem("连接Postgres");discardPostgres = new JMenuItem("断开Postgres");New = new JMenuItem("新建数据表");Delet = new JMenuItem("删除数据表");Import = new JMenuItem("导入当前数据");Select = new JMenuItem("查询数据");openshapefile.addActionListener(this);Import.addActionListener(this);ConnectPostgres.addActionListener(this);discardPostgres.addActionListener(this);menuBar.add(menufile);menuBar.add(menudatabase);menufile.add(openshapefile);menufile.add(gdb);menufile.add(mdb);menudatabase.add(ConnectPostgres);menudatabase.add(discardPostgres);menudatabase.add(New);menudatabase.add(Delet);menudatabase.add(Import);menudatabase.add(Select);//地图容器mapPane = new JMapPane();mapPane.setBackground(Color.WHITE);mapPane.setBorder(BorderFactory.createLineBorder(Color.BLACK));//属性表table=new JTable();JScrollPane tablepanel=new JScrollPane(table);//maptable=new MapLayerTable(mapPane);//左侧容器JPanel leftJPanel=new JPanel();leftJPanel.setLayout(new BorderLayout());JPanel lefttopJPanel=new JPanel();JPanel leftbuttonJPanel=new JPanel();jb1=new JButton("显示");jb2=new JButton("读取");jb2.addActionListener(this);leftJPanel.add(lefttopJPanel,BorderLayout.NORTH);leftJPanel.add(leftbuttonJPanel,BorderLayout.SOUTH);lefttopJPanel.setLayout(new BorderLayout());leftbuttonJPanel.setLayout(new BorderLayout());lefttopJPanel.add(jb1,BorderLayout.CENTER);lefttopJPanel.add(filecombox,BorderLayout.NORTH);leftbuttonJPanel.add(jb2,BorderLayout.CENTER);leftbuttonJPanel.add(datacombox,BorderLayout.NORTH);JPanel top = new JPanel();top.setLayout(new BorderLayout());top.add(mapPane,BorderLayout.CENTER);top.add(leftJPanel,BorderLayout.WEST);SetComposeSize(dm,tablepanel,top,mapPane,leftJPanel,lefttopJPanel,leftbuttonJPanel);//添加控件到主界面this.setJMenuBar(menuBar);this.add(top,BorderLayout.CENTER);this.add(tablepanel,BorderLayout.SOUTH);}public void SetComposeSize(Dimension dm,JScrollPane jp,JPanel t,JMapPane jm,JPanel l,JPanel lt,JPanel jb) {jp.setSize(dm.width,(int)(dm.height*0.3));t.setSize(dm.width,(int)(dm.height*0.7));Dimension dtd=l.getSize();jm.setSize((int)(dtd.width*0.8),(int)(dtd.height));l.setSize((int)(dtd.width*0.2),(int)(dtd.height));Dimension ld=l.getSize();lt.setSize(ld.width,(int)(ld.height*0.5));jb.setSize(ld.width,(int)(ld.height*0.5));}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(e.getSource()==openshapefile) {JFileChooser chooser=new JFileChooser();int returnvalue =chooser.showOpenDialog(this);if(returnvalue==JFileChooser.APPROVE_OPTION) {//File f = chooser.getSelectedFile();File f = new File("E:/CodeStudy/CsharpConPG/SHp/四省.shp");if(a==null) {a = new Quickstart();}String[] columnameStrings = a.openfileCol(f.getAbsolutePath());String[][] data = a.openfile(f.getAbsolutePath());DefaultTableModel model;model = new DefaultTableModel(data, columnameStrings);table.setModel(model);this.mapPane.setMapContent(a.getMapContent(f));}}else if(e.getSource()==ConnectPostgres) {if(a==null) {a = new Quickstart();}pPostgis_OGR=new Postgis_OGR("PG:dbname=little_c_sharp host=localhost port=5432 user=postgres password=107530");myArcDataToPostgre = new ArcDataToPostgre(this.DBMAP);List<String> names = pPostgis_OGR.getLayerNames();for (int i = 0; i < names.size(); i++) {this.datacombox.addItem(names.get(i));}}else if(e.getSource()==Import) {myArcDataToPostgre.importGdbToDatabaseSingal(a.currentDataSource.GetLayer(0), null);}else if(e.getSource()==discardPostgres) {myArcDataToPostgre.disconnectdatabase();}else if(e.getSource()==jb2) {Layer nowLayer = pPostgis_OGR.getLayerByname(datacombox.getSelectedItem().toString());String filepathString = pPostgis_OGR.LayerToGeoJson(nowLayer);File geojsonFile = new File(filepathString);try {Thread.sleep(2000);} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}String[] columnameStrings = a.openfileCol(nowLayer);String[][] data = a.openfile(nowLayer);DefaultTableModel model;model = new DefaultTableModel(data, columnameStrings);table.setModel(model);this.mapPane.setMapContent(a.getMapContent(geojsonFile));//this.mapPane.setMapContent(a.getMapContent(f));}}}

2.2功能实现

下面是两个方法,主要是获取属性表的表头和数据,表头用一个数组表示,数据用一个二维数组表示,代码解释放在注释里面,这些数据主要用来创建DefaultTableModel用来作为JTable的数据源。

//这个函数用来获取表头public static String[] openfileCol(String filename) {//打开shapefileDataSource ds = ogr.Open(filename,1);currentDataSource=ds;for (int i=0;i< ds.GetLayerCount(); i++){org.gdal.ogr.Layer layer = ds.GetLayerByIndex(i);//获取表头信息FeatureDefn pFeatureDefn = layer.GetLayerDefn();String[] outst = new String[pFeatureDefn.GetFieldCount()];//遍历表头,存储到outst里面用于返回for (int j = 0; j < pFeatureDefn.GetFieldCount(); j++){FieldDefn fie = pFeatureDefn.GetFieldDefn(j);outst[j]=fie.GetName();//MessageBox.Show(pFeatureDefn.GetFieldDefn(j).GetNameRef().ToString());//MessageBox.Show(pFeatureDefn.GetFieldDefn(j).GetTypeName().ToString());}return outst;}return null;}
//这个函数用来获取属性表里面的数据,输入shapefile文件名,返回存储了数据的二维数组public static String[][] openfile(String filename) {DataSource ds = ogr.Open(filename,1);currentDataSource=ds;String outst = "";for (int i=0;i< ds.GetLayerCount(); i++){org.gdal.ogr.Layer layer = ds.GetLayerByIndex(i);FeatureDefn pFeatureDefn = layer.GetLayerDefn();String[][] dataut =new String[(int)layer.GetFeatureCount()][pFeatureDefn.GetFieldCount()];for (int j = 0; j < layer.GetFeatureCount(1); j++){//获取一个要素Feature feature = layer.GetFeature(j);//遍历各个要素的属性,存储到数组里面for(int k=0;k< pFeatureDefn.GetFieldCount(); k++){dataut[j][k] = feature.GetFieldAsString(k);}outst+="\n";}return dataut;}return null;}

Java环境下GDAL / OGR环境配置与入门相关推荐

  1. C#环境下GDAL / OGR环境配置与入门

    C#环境下GDAL.OGR环境配置与入门 0.概述 1.环境配置 2.类库介绍 3.代码实践 4. 总结 0.概述 由于需要进行一些Shapefile文件的读取和管理,但是ArcGIS的二次开发工具又 ...

  2. java aarch64_aarch64环境下,搭建并配置服务器tomcat:

    aarch64环境下,搭建并配置服务器tomcat: 环境说明及下载相关文件: 1. ARM环境:aarch64开发板 2.JDK安装包: jdk-8u231-linux-arm64-vfp-hflt ...

  3. windows ce 安装java,Windows环境下JDK安装和配置

    相信所有学习Java的朋友应该都在Windows操作系统中安装和配置过JDK,这里我们将详细介绍安装和配置过程! 在Linux环境下安装JDK可参考:Linux环境下JDK安装和配置 下面我们开始讲解 ...

  4. ubuntu环境下redis的安装配置

    ubuntu环境下redis的安装配置 1. 简要介绍 dis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...

  5. 每天一个脱发小技巧 | Eclipse环境下spotbugs的安装配置和详细使用方法

    每天一个脱发小技巧 | Eclipse环境下spotbugs的安装配置和详细使用方法 SpotBugs介绍 Eclipse环境下SpotBugs安装 SpotBugs的使用 其他 SpotBugs介绍 ...

  6. 0557-6.1.0-Kerberos环境下SQL客户端DBeaver配置异常分析

    1 文档编写目的 参考Fayson前面的文章<0469-如何使用DBeaver访问Kerberos环境下的Impala>,环境变量也配置了,krb5.conf文件也准备好了,但在使用SQL ...

  7. 帧中继环境下NBMA模式的配置

    帧中继环境下NBMA模式的配置 1.  实验目的: 通过本次的实验,我们可以掌握如下技能 1)        帧中继静态映射及其broadcast参数的含义. 2)        NBMA模式下的DR ...

  8. 实验七:Xen环境下cirrOS的安装配置

    实验名称: Xen环境下cirrOS的安装配置 实验环境: 这里的cirrOS和实验六中的busybox的启动方式相同,唯一的区别就是我们使用的cirrOS镜像中,已经包含了根文件系统.内核文件以及r ...

  9. Linux 环境下安装 GitLab 与配置

    什么是 GitLab? GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务. GitLab的功能特点 提供了管理,计划,创建,验证,打 ...

最新文章

  1. Glide @GlideModule 注解使用
  2. java 模式匹配算法_用Java匹配模式
  3. Android开发究竟该如何学习,含泪整理面经
  4. python使用open打开文件时显示文件不存在-Python打开文件open()的注意事项
  5. 【错误记录】Flutter 构建报错 ( Because xxx requires SDK version >=2.12.0-0 <3.0.0, versio | Dart SDK 版本低 )
  6. iofd:文件描述符_文字很重要:谈论设计时18个有意义的描述符
  7. codeforces 798D
  8. 在Silverlight中使用ESFramework-- ESFramework 4.0 快速上手(05)
  9. Maven3路程(六)用Maven创建Spring3 MVC项目
  10. Icode编程>>>Python编程>>>1级训练场>>>基础训练【1】
  11. springboot房屋租赁管理系统
  12. 【每天学点心理学第七期】人性定理:人都是以服务于他自己为目的的!
  13. linux if 括号用法总结
  14. html中将正方形动画变成圆形,css中把正方形变成圆形的方法
  15. 2cm有多长实物图_2cm 2cm有多长实物图
  16. 主题和母版页(母版页)
  17. 华为鸿蒙文案,机智的华为广告文案,各种“吊 打”三星小朋友!
  18. 微信小程序提取汉字字母大写
  19. IP协议及MAC帧格式
  20. Uniapp苹果登录

热门文章

  1. win10安装linux子系统详细教程(非虚拟机方式)
  2. linux环境下tomcat扩大内存
  3. Kaprekar constant(卡普雷卡尔黑洞)
  4. revit建模批量标高操作,简单的一匹。
  5. stm32f103开发板入门到手进行开发
  6. 浅谈provide与inject
  7. CentOS7系统安装
  8. python第十四课 面向对象(三)
  9. 动漫里的op、ed、OVA、ost、bl、gl代表什么意思
  10. EOS 安装本地环境,发币教程,本地节点