win10和ubuntu部署安装gdal库(Java版)

win10

1、安装Java环境

2、下载gdal

下载地址:https://www.gisinternals.com/release.php
在这里插入图片描述

3、配置环境变量

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在E:\release-1900-x64-gdal-3-2-0-mapserver-7-6-1\bin\gdal\java找到jar包,放到Java项目里lib文件夹下,dll库文件放到C:\Windows\System32文件夹下,然后就可以开始编码了。
在这里插入图片描述

package sad;
import org.gdal.gdal.*;
import org.gdal.gdalconst.gdalconstConstants;
import org.gdal.ogr.DataSource;
import org.gdal.ogr.ogr;

public class Hello {
    
    
    public static void main(String[] args) {
    
    
        //此处换成自己文件的位置的路径
        //readGDAL("E:\\xxxxxxx.tif");

        getElevationFromTif("C:\\xxxx.tif");
    }
    /**
     * 读取tif文件的相关信息
     * @param fileName
     */
    public static void readGDAL(String fileName) {
    
    
        gdal.AllRegister();
        //读取影像数据
        Dataset dataset = gdal.Open(fileName,gdalconstConstants.GA_ReadOnly);
        if(dataset == null){
    
    
            System.err.println("GDALOpen failed - "+gdal.GetLastErrorNo());
            System.err.println(gdal.GetLastErrorMsg());
            System.exit(1);
        }

        Driver driver = dataset.GetDriver();
        System.out.println("Driver:"+driver.getShortName()+"/"+driver.getLongName());

        //读取影像信息
        int xSize = dataset.getRasterXSize();
        int ySize = dataset.getRasterYSize();
        int bandCount = dataset.GetRasterCount();
        System.out.println("size is "+xSize+","+ySize+",光带数:"+bandCount);

        Band band = dataset.GetRasterBand(1);
        int type = band.GetRasterDataType();
        //type为1,代表的是Eight bit unsigned integer
        System.out.println(type);

        dataset.delete();
        gdal.GDALDestroyDriverManager();
    }

    /**
     * shp转换geojson
     * @param shpFileName
     * @param geojsonFileName
     */
    public static void shpToGeojson(String shpFileName,String geojsonFileName) {
    
    
        // 注册所有的驱动
        ogr.RegisterAll();
        // 为了支持中文路径,请添加下面这句代码  
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
        // 为了使属性表字段支持中文,请添加下面这句  
        gdal.SetConfigOption("SHAPE_ENCODING","");
        //shp文件所在的位置
        //String strVectorFile = "D:\\sichuan\\sichuanPointALL.shp";
        //打开数据
        DataSource ds = ogr.Open(shpFileName,0);
        if (ds == null)
        {
    
    
            System.out.println("打开文件失败!" );
            return;
        }
        System.out.println("打开文件成功!" );
        org.gdal.ogr.Driver dv = ogr.GetDriverByName("GeoJSON");
        if (dv == null)
        {
    
    
            System.out.println("打开驱动失败!" );
            return;
        }
        System.out.println("打开驱动成功!" );
        //输出geojson的位置及文件名
        //String geojsonFileName = "D:\\data\\sichuan.geojson";
        dv.CopyDataSource(ds, geojsonFileName);
        System.out.println("转换成功!");
    }
    /**
     * 获取每个点的高程值
     * @param fileName_tif
     */
    public static void getElevationFromTif(String fileName_tif) {
    
    
        gdal.AllRegister();
        Dataset hDataset = gdal.Open(fileName_tif, gdalconstConstants.GA_ReadOnly);
        if (hDataset == null)
        {
    
    
            System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo());
            System.err.println(gdal.GetLastErrorMsg());

            System.exit(1);
        }

        Driver hDriver = hDataset.GetDriver();
        System.out.println("Driver: " + hDriver.getShortName() + "/" + hDriver.getLongName());
        int iXSize = hDataset.getRasterXSize();
        int iYSize = hDataset.getRasterYSize();
        System.out.println("Size is " + iXSize + ", " + iYSize);

        Band band = hDataset.GetRasterBand(1);
        //这里是DEM数据,所以声明一个int数组来存储,如果是其他数据类型,声明相应的类型即可
        int buf[] = new int[iXSize];    

        for(int i=0; i<50/*iYSize*/; i++)
        {
    
    
            band.ReadRaster(0, i, iXSize, 1, buf);    //读取一行数据

            // 下面是输出像元值,为了方便,我只输出了左上角 10×10的范围内的数据
            for(int j=0; j<50/*iXSize*/; j++){
    
    
                System.out.print(buf[j] + ", ");
            }

            System.out.println("\n");
        }
        hDataset.delete();
        // 可选
        gdal.GDALDestroyDriverManager();

    }


}

ubuntu

1、部署要求

java,ant,pcre和swig:其中pcre是swig所需的依赖项,因此必须先于swig安装。java、ant和swig都可以通过 -version查看。ava和ant的安装比较类似,将下载下来的压缩包解压好后,在/etc/profile文件中配置好JAVA_HOME、ANT_HOME以及CLASSPATH后即可记得对这三个变量进行export,并把前两个加入到PATH中。
gcc和g++ :这个如果没有去装一个就好了,可以通过命令gcc -v 和 g++ -v 来查看
SQLite3:PROJ需要的环境 下载地址: https://www.sqlite.org/download.html
PROJ:gdal需要的环境 下载地址:https://proj.org/download.html
GEOS:gdal需要的环境 下载地址:http://download.osgeo.org/geos/
注:gadl3.0以上需要proj6以上

2、安装

SQLite3:解压,配置 并编译安装 SQLite3

powershell
tar -zxvf sqlite-autoconf-3330000.tar.gz
cd sqlite-autoconf-3330000/
./configure
make
make install

PROJ:解压、配置 并编译 PROJ

tar -zxvf proj-6.3.0.tar.gz
cd proj-6.3.0/
./configure
make
make install

GEOS:解压、配置并编译安装GEOS

提示:其中/opt/geosXXX为定义的安装位置

tar -xvf geosXXX.tar.gz
cd ./geosXXX
./configure --prefix=/opt/geosXXX
make 
make install

配置动态链接库

让gdal能够找到proj及geos的所在位置。共享文件默认安装在/usr/local/lib位置下:

cd /etc/ld.so.conf.d/

touch local.conf

echo "/usr/local/lib" > local.conf

最后可使用ldconfig -v来查看详细信息。

GDAL 解压、配置 并编译安装 GDAL

wget -c -P /storage/software/gdal http://download.osgeo.org/gdal/3.3.2/gdal-3.3.2.tar.gz
tar -zxvf gdal-3.2.0.tar.gz
cd gdal-3.2.0/
./configure
make
make install
不配置./configure编译路径 默认在/usr/local/lib下
修改配置文件
vi /etc/profile
新增:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
刷新:
source /etc/profile
检测gdal是否编译成功
gdalinfo -version

GDAL编译java

编辑 vi gdal-3.2.0/swig/java/java.opt 配置 JAVA_HOME 路径:

#
# Java Stuff
#JAVA_HOME = "C:\Program Files\Java\jdk1.6.0_16"
#JAVA_HOME = /usr/lib/jvm/java-6-openjdk/
#JAVA_HOME = /usr/lib/jvm/java-7-openjdk-amd64/
JAVADOC=$(JAVA_HOME)/bin/javadoc
JAVAC=$(JAVA_HOME)/bin/javac
JAVA=$(JAVA_HOME)/bin/java
JAR=$(JAVA_HOME)/bin/jar
JAVA_INCLUDE=-I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
JAVA_HOME = /usr/local/jdk1.8.0_261/

编译

cd gdal-3.2.0/swig/java/
make
make install

make成功,在当前文件夹下生成了 gdal.jar 和 一堆 *.so 文件。

添加动态链接库

把/gdal/gdal-3.3.2/swig/java/下的.so文件拷贝到/usr/local/lib/下去:
执行:# cp /gdal/gdal-3.3.2/swig/java/*.so /usr/local/lib/
因为之前安装gdal的时候,配置的 /etc/profile中库指向的是/usr/local/lib

gdal.jar打包到maven

gdal.jar拷贝到本地项目根目录下
然后在项目pom文件中引用:

      <dependency>
            <groupId>org.gdal</groupId>
            <artifactId>gdal</artifactId>
            <version>3.0.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/.idea/libraries/gdal.jar</systemPath>
        </dependency>

问题

问题
1、编译gdal时,出现:

/gdal-3.1.1/.libs/libgdal.so: undefined reference to `sqlite3_column_origin_name'
/gdal-3.1.1/.libs/libgdal.so: undefined reference to `sqlite3_column_table_name'

解决办法:sqlite3需要配置一个宏:

cd ./sqlite-autoconf-3320300

找到./sqlite3.c文件,添加

#define SQLITE_ENABLE_COLUMN_METADATA 1

如下:

#define SQLITE_CORE 1
#define SQLITE_AMALGAMATION 1
#ifndef SQLITE_PRIVATE

# define SQLITE_PRIVATE static
#endif
#define SQLITE_ENABLE_COLUMN_METADATA 1

/************** Begin file ctime.c *******************************************/
/*

然后再:

./configure
make
sudo make install 

2、编辑proj从报错
configure: error: Package requirements (sqlite3 >= 3.11) were not met:
是因为缺少sqlite3相关库,解决办法:

yum -y install sqlite-devel

3、make 编译gdal报错jpeg2000dataset.cpp:35:10: fatal error: jasper/jasper.h: No such file or directory
解决办法:
下载jasper:http://download.osgeo.org/gdal/jasper-1.900.1.uuid.tar.gz
安装:参考官网

安装:

 wget http://download.osgeo.org/gdal/jasper-1.900.1.uuid.tar.gz
 tar xvf jasper-1.900.1.uuid.tar.gz
 cd jasper-1.900.1.uuid
 ./configure
 make
 make install

等待编译完成,在bashrc文件中添加库链接:

vi ~/.bashrc

在最后添加如下:

export PATH=$PATH:/usr/local/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

保存应用:

 :wq
 source ~/.bashrc

再去重新make GDAL

猜你喜欢

转载自blog.csdn.net/qq_36580022/article/details/128451554