Win および Linux 環境での JAVA+GDAL のデプロイ、jar パッケージの起動、関連説明、問題解決

記事ディレクトリ

Windows環境でのJAVA+GDAL

1.GDALのダウンロード

GDAL の概要:

GDAL (Geospatial Data Abstraction Library) は、オープンソースのラスター空間データ変換ライブラリです。抽象データ モデルを利用して、サポートされているさまざまなファイル形式を表現します。データの変換と操作のためのコマンドライン ツールのコレクションも備えています。

GDAL は C++ を使用して開発されるため、Java 環境で GDAL ライブラリを使用するには、JNI (Java クロスプラットフォーム呼び出しの方法) メソッドを使用して DLL ライブラリを呼び出す必要があります。したがって、公式 Web サイトのチュートリアルに従って、GDAL のソース コードをダウンロードし、Visual Studio を通じて利用可能な DLL をコンパイルできます。ただし、最も簡単な方法は、JNI 標準を満たす、コンパイルおよび生成された動的 DLL ライブラリと jar パッケージを使用することです。この Web サイト http://www.gisinternals.com/archive.php を使用して、適切なファイルをダウンロードすることをお勧めします。

Java GDALのダウンロード: http://download.gisinternals.com/sdk.php

画像-20220507105437998

画像-20220507105841707

2. GDALのインストール(解凍後コピー)

画像-20220507111815126

画像-20220507112249301

ダウンロードした圧縮パッケージ内の **gdal-release-1928-x64/bin/** ディレクトリの内容を jdk/bin ディレクトリに解凍します (プログラムを jdk/bin に配置してもエラーが報告される場合は、プログラムを配置してみてください)Native library load failed.ディレクトリjre/binまたはjava工程根目录下)

release -1928-x64/bin/gdal/java/の下にあるgdalalljni.dllと、このディレクトリ内の他の dll をJava プロジェクトのルート ディレクトリにコピーします (これを jdk/bin に置いてプログラムを実行しても、エラーが発生しました。ディレクトリにNative library load failed.入れてみるかgdal.jar を Java プロジェクトにコピーし、Maven を使用して参照してください。これで、Java 用の gdal が Maven ライブラリに配置され、直接インポートできるようになりました。jre/binjava工程根目录下

ローカル インポート、非推奨。Maven ライブラリを使用して直接インポートすることをお勧めします。

<dependency>
    <groupId>org.gdal</groupId>
    <artifactId>gdal</artifactId>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/gdal.jar</systemPath>
</dependency>

Maven ライブラリのインポート

<dependency>
  <groupId>org.gdal</groupId>
  <artifactId>gdal</artifactId>
  <version>3.2.0</version>
</dependency>

3.GDALテスト

import org.gdal.gdal.Band;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import org.gdal.gdal.Dataset;
import org.gdal.gdalconst.gdalconstConstants;


/**
 * @author xming
 * @createTime 2022/5/7 16:37
 * @description
 */
public class RasterGdalTest {
    
    
  private static final String FILE_PATH = "D:\\WeChat Files\\aion_my_god\\FileStorage\\File\\2022-05\\L18.tif";
  static {
    
    
    // 注册所有的驱动
    gdal.AllRegister();
    // 为了支持中文路径,请添加下面这句代码
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
    // 为了使属性表字段支持中文,请添加下面这句
    gdal.SetConfigOption("SHAPE_ENCODING","");
  }

  public static void main(String[] args) {
    
    
    // 读取影像数据
    Dataset dataset = gdal.Open(FILE_PATH, gdalconstConstants.GA_ReadOnly);
    if (dataset == null) {
    
    
      System.out.println("read fail!");
      return;
    }

    //  providing various methods for a format specific driver.
    Driver driver = dataset.GetDriver();
    System.out.println("driver name : " + driver.getLongName());

    // 读取影像信息
    int xSize = dataset.getRasterXSize();
    int ySzie = dataset.getRasterYSize();
    int rasterCount = dataset.getRasterCount();
    System.out.println("dataset xSize:" + xSize + ", ySzie = " + ySzie + ", rasterCount = " + rasterCount);

    Band band = dataset.GetRasterBand(1);
    //the data type of the band.
    int type = band.GetRasterDataType();
    System.out.println("data type = " + type + ", " + (type == gdalconstConstants.GDT_Byte));

    //Frees the native resource associated to a Dataset object and close the file.
    dataset.delete();

    gdal.GDALDestroyDriverManager();
  }
}

4. Jar パッケージを実行するモード https://www.jianshu.com/p/6bce533f6595

プロジェクトのリソース構造

リソース管理 gdal ファイルを使用し、Maven を通じて gdal.jar をロードし、Web アプリケーションのリソース ディレクトリに gdal ファイルを追加して、linux と win32 の 2 つのサブフォルダーを作成します。構造は次のとおりです。

画像

リソース構成 gdal.jar、ダイナミック ライブラリ ファイル

gdal.jar、lgdalalljni.dll をgdal\bin\gdal\javaからプロジェクトresource/gdal/win32にコピーします。

画像

IDE で起動し、通常どおり実行します。jar パッケージにパッケージ化された後は、直接起動できず、起動エラーがno gdaljni in java.library.pathと報告されます。その理由は、ローカル ダイナミック ライブラリgdalalljniが正しくロードされていないためです。 gdalalljni 動的ライブラリをロードする必要があります

LibraryUtil.java 動的ライブラリ読み込みクラスを作成する

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;
/*
 * 动态库加载类:从资源加载动态库
 **/
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 {
    
    
            //获取系统路径
            String[] libraryPaths=initializePath("java.library.path");
            log.info("---LibraryUtil-----java.library.path={}",StringUtil.join(";", libraryPaths));
            if(libraryPaths==null||libraryPaths.length==0) {
    
    
                log.info("---LibraryUtil--请设置环境变量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--从环境变量{}加载{}",nativeTempDir,fileName);
            //系统库不存在,就从资源文件复制
            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);
                //保存文件到java.library.path
                log.info("---LibraryUtil--成功保存文件{}到{}",fileName,extractedLibFile.getPath());
            }
            //注意采用loadLibrary加载时mapLibraryName方法会根据系统补全名称
            int startIndex=fileName.startsWith("lib")?3:0;
            String libName=fileName.substring(startIndex,fileName.indexOf("."));
            String mapLibraryName=System.mapLibraryName(libName);
            log.info("---LibraryUtil--mapLibraryName={}",mapLibraryName);
            //输出调试信息
            log.info("---LibraryUtil--系统加载动态库{}开始",libName);
            System.loadLibrary(libName);
            log.info("---LibraryUtil--系统加载动态库{}完成",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 {
    
    
            //文件不存在创建文件,否则获取流报异常
            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();   
        }
    }
    /**
     * 文件不存在创建文件,包括上级目录
     */
    public static void createFile(File destFile) throws IOException{
    
    
        File pfile = destFile.getParentFile();
        if (!pfile.exists()) {
    
    
            pfile.mkdirs();
        }
        if(!destFile.exists()){
    
    
            destFile.createNewFile();
        }
    }
}

動的ライブラリをロードする

  static {
    
    
        log.info("---LibraryUtil--gdal载入动态库");
        try {
    
    
            //根据系统环境加载资源
            String systemType = System.getProperty("os.name");   
            String file="";  
            boolean isWin=systemType.toLowerCase().indexOf("win")!=-1;
            if(isWin) {
    
    
                file="/gdal/win32/gdalalljni.dll"; //win下jni路径
            }
            else {
    
    
                file="/gdal/linux/libgdalalljni.so";//linux下jni路径
            }
            //从资源文件加载动态库
            LibraryUtil.loadFromResource(file);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

依存ライブラリが見つからず、 gdalalljniライブラリのロード中にエラーが発生しました。実行プロセスを整理します。

- 检查java.library.path环境变量值
- 从java.library.path环境变量取第一个路径为目标路径D:\Program Files\Java\jdk1.8.0_231\bin
- 从目标路径判断是否存在gdalalljni.dll
- gdalalljni.dll不存在时从资源文件复制到目标路径
- System.loadLibrary载入gdalalljni.dll

gdalalljni.dll 依存関係ライブラリをターゲット パスにコピーします。

gdal\binの下にあるすべての DLL をターゲット パスD:\Program Files\Java\jdk1.8.0_231\bin (つまり、jdk が配置されているディレクトリ) にコピーします。

画像

jar パッケージを再度起動して正常に実行します

例外の問題:

参照ライブラリ エラーjava.lang.UnsatisfiedLinkError: java.library.path に gdaljni がありません

プロジェクトは、gdal_java dll を含まずに gdal.jar パッケージのみを参照しますが、gdal dll ファイルが正しく構成されていません。つまり、gdal dll ファイルのコピー場所が間違っているため、Java プログラムは対応するパッケージを見つけることができません。 dllのリファレンス。DLL を **%JAVA_HOME%/jdk/binまたは%JAVA_HOME%/jre/bin** ディレクトリにコピーします。

ネイティブ ライブラリのロードに失敗しました。
java.lang.UnsatisfiedLinkError: java.library.path に gdaljni がありません
スレッド「main」の例外 java.lang.UnsatisfiedLinkError: org.gdal.gdal.gdalJNI.AllRegister()V
の org.gdal.gdal.gdalJNI.AllRegister(Nativeメソッド)
org.gdal.gdal.gdal.AllRegister(gdal.java:499)
、cn.edu.pku.extremetool.Main.main(Main.java:21)

java.lang.UnsatisfiedLinkError: D:WorkSpaceeclipseWPMJunoExtremeToolgdaljni.dll:依存ライブラリが見つかりません

gdal.jar パッケージへの参照があり、release/gdal/java の gdaljni.dll ファイルも正しい場所にコピーされますが、GDAL 自体の dll がありません (つまり、release-1600 の下の多くの dll ファイル) -gdal/bin)

ネイティブ ライブラリのロードに失敗しました。
java.lang.UnsatisfiedLinkError: D:WorkSpaceeclipseWPMJunoExtremeToolgdaljni.dll:依存ライブラリが見つかりません
スレッド「メイン」で例外が発生しました java.lang.UnsatisfiedLinkError: org.gdal.gdal.gdalJNI.AllRegister()V
at org.gdal.gdal.gdalJNI
org.gdal.gdal.gdal.AllRegister(gdal.java:499) の.AllRegister(ネイティブ メソッド)

cn.edu.pku.extremetool.Main.main(Main.java:21) で

proj.db が見つかりません

システム環境変数で構成します。PROJ_LIB:C:Program FilesGDALprojlibproj.db構成を有効にするために、構成後に必ずコンピュータを再起動するかログオフしてください。

画像

变量名:PROJ_LIB
变量值:C:\Program Files\GDAL\projlibproj.db #修改为自己存储的projlibproj.db文件路径

そのようなファイルがない場合は、gdal coreをダウンロードしてインストールします。

DLL ファイル (gdal304.dll など) が見つからないというメッセージが表示された場合は、環境変数を構成する必要があります。

dll を含むフォルダー パス (C:\gdal\bin など) をパス変数に追加するか、gdal-data フォルダー (C:\gdal\bin\gdal-data など) をパスに追加するか、新しい GDAL_DATA 変数を作成します。

Java と GDAL は両方とも X86 (Win32) または X64 (Win64) のいずれかであることに注意してください。そうでない場合は、互換性の問題が発生する可能性があります。

Maven 中央ウェアハウスの gdal を使用してエラーを報告する

java.lang.UnsatisfiedLinkError: org.gdal.gdal.gdalJNI.Dataset_SWIGUpcast(J)J
at org.gdal.gdal.gdalJNI.Dataset_SWIGUpcast(Native Method)

Native library load failed.DLL が正しく構成されたことが示されない場合
、上記のエラーの理由は何ですか?

—— SWIG のバージョンに一貫性がありません。Maven
中央倉庫にある gdal dll ファイルgdal.jarと、ダウンロードして使用した gdal dll ファイルは、同じ人/チームによってコンパイルされていません。gisinternals は SWIG 1.3.4 バージョンを使用する可能性がありますが、Maven リポジトリの gdal によって使用される SWIG バージョンは一時的に不明ですが、SWIG 2.x バージョンである可能性があります。
解決策
- Maven ウェアハウスで gdal.jar と一致する DLL ファイルを見つけます - まだ見つかりません
- Maven 中央ウェアハウスの jar を使用せず、gisinternals によって提供される jar ファイルを使用してください

関連書類

GDALプロジェクト公式サイト:http://www.gdal.org

Java での GDAL の使用: http://trac.osgeo.org/gdal/wiki/GdalOgrInJava

GDAL for Java API ドキュメント: https://gdal.org/java/org/gdal/gdal/gdal.html

GDAL関連の利用:https://www.jianshu.com/p/ecf1b369f195

gdal for java のインストールからデモ実装までのさまざまなケース: https://blog.csdn.net/qq_42522024/article/details/123838982?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2% 7Edefault%7ECTRLIST%7Edefault-1-123838982-blog-114399800.pc_relevant_default& Depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-123838982-b log-114399800.pc _relevant_default&utm_relevant_index=2

Linux システムが gdal プロジェクトをコンパイルして公開 https://www.jianshu.com/p/ff4cf2b59613

GDAL 依存関係をコンパイルする

1.sqlite3をインストールする

wget https://www.sqlite.org/2020/sqlite-src-3310100.zip
unzip sqlite-src-3310100.zip
cd sqlite-src-3310100
bash ./configure --prefix=/usr/local/pgsql/plugin/sqlite3
make && make install
echo "/usr/local/pgsql/plugin/sqlite3/lib" > /etc/ld.so.conf.d/sqlite3.conf
ldconfig

2. json-c-0.13.1をインストールする

wget https://github.com/json-c/json-c/archive/json-c-0.13.1-20180305.tar.gz
tar -xzvf  json-c-0.13.1-20180305.tar.gz
cd json-c-json-c-0.13.1-20180305
bash ./configure --prefix=/usr/local/pgsql/plugin/json-c
make && make install
echo "/usr/local/pgsql/plugin/json-c/lib" > /etc/ld.so.conf.d/json-c-0.13.1.conf
ldconfig

3. protobuf-3.11.4、protobuf-c 1.3.3をコンパイルします。

  • protobuf-3.11.4 をコンパイルする
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.4/protobuf-cpp-3.11.4.tar.gz
tar -xzvf  protobuf-cpp-3.11.4.tar.gz
cd protobuf-3.11.4
bash ./configure
make && make install
  • protobuf-c 1.3.3 をコンパイルします
wget https://github.com/protobuf-c/protobuf-c/releases/download/v1.3.3/protobuf-c-1.3.3.tar.gz
tar -xzvf  protobuf-c-1.3.3.tar.gz
cd protobuf-c-1.3.3
./autogen.sh
bash ./configure
make && make install

見つからない場合libprotobuf.so.22vi /etc/profile#以下の設定を追加

PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH

source /etc/profile# 設定が有効になります

4. Proj 6.3.1 をインストールする

wget https://download.osgeo.org/proj/proj-6.3.1.tar.gz
tar -xf proj-6.3.1.tar.gz
cd proj-6.3.1
./configure --prefix=/usr/local/pgsql/plugin/proj
make && make install
echo "/usr/local/pgsql/plugin/proj/lib" > /etc/ld.so.conf.d/proj-6.3.1.conf
ldconfig

5. GEOS 3.8.0をインストールする

wget http://download.osgeo.org/geos/geos-3.8.0.tar.bz2
tar -jxf geos-3.8.0.tar.bz2
cd geos-3.8.0
./configure --prefix=/usr/local/pgsql/plugin/geos
make && make install
echo "/usr/local/pgsql/plugin/geos/lib" > /etc/ld.so.conf.d/geos-3.8.0.conf
ldconfig

6.SFCGAL 1.3.7をインストールする

SFCGAL は Boost、CGAL、GMP、MPFR に依存する必要があるため、合計で次の 4 つのソフトウェアをインストールする必要があります:
boost-devel.x86_64
gmp-devel.x86_64
mpfr-devel.x86_64
CGAL-4.14

6.1 ブースト-1.5.3

yum install boost boost-devel

6.2 GMP-6.1.2

wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.bz2
tar -jxvf gmp-6.1.2.tar.bz2
cd gmp-6.1.2
bash ./configure --enable-cxx
make && make install

6.3 MPFR-4.0.2

wget https://www.mpfr.org/mpfr-current/mpfr-4.0.2.tar.gz
tar -xzvf  mpfr-4.0.2.tar.gz
cd mpfr-4.0.2
./configure
make && make install

6.4cgal-4.14

wget http://distfiles.macports.org/cgal/cgal-4.14.tar.xz
xz -d cgal-4.14.tar.xz 
tar xvf cgal-4.14.tar 
cd CGAL-4.14
mkdir build && cd build
cmake ..
make && make install

インストール中に以下のエラーが発生する

画像

解決策: /usr/include/boost/cstdint.hpp の 44 行のコードを次のように変更します。

画像

#if defined(BOOST_HAS_STDINT_H) \
&& (!defined(__GLIBC__) \
|| defined(__GLIBC_HAVE_LONG_LONG) \
|| (defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 17)))))

6.5 SFCGAL 1.3.7

wget  https://github.com/Oslandia/SFCGAL/archive/v1.3.7.tar.gz
tar -zxvf SFCGAL-1.3.7.tar.gz
cd SFCGAL-1.3.7  
mkdir build && cd build 
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/sfcgal ..
make  && make install
echo "/usr/local/sfcgal/lib64" > /etc/ld.so.conf.d/sfcgal-1.3.7.conf
ldconfig

7. pcre-8.44のインストール

wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
tar -xzvf  pcre-8.44.tar.gz
cd pcre-8.44
./configure --enable-utf8 --prefix=/usr/local/pcre
make && make intall
echo "/usr/local/pcre/lib" > /etc/ld.so.conf.d/pcre-8.44.conf
ldconfig

8. libxml2-2.9.10のインストール

wget http://xmlsoft.org/sources/libxml2-2.9.10.tar.gz
tar -xzvf  libxml2-2.9.10.tar.gz
cd libxml2-2.9.10
./configure --prefix=/usr/local/libxml2
make && make intall
echo "/usr/local/libxml2/lib" > /etc/ld.so.conf.d/libxml2-2.9.10.conf
ldconfig

9. Java 開発用に gdal.jar をコンパイルします。開発は必要ありません。スキップできます。

wget https://mirrors.tuna.tsinghua.edu.cn/apache//ant/binaries/apache-ant-1.10.7-bin.tar.gz
tar -zxvf apache-ant-1.10.7-bin.tar.gz
mv apache-ant-1.10.7-bin /usr/local/ant

9.2、スイグ4.0.1

wget http://prdownloads.sourceforge.net/swig/swig-4.0.1.tar.gz
tar -zxvf  swig-4.0.1.tar.gz
cd swig-4.0.1
bash ./configure --prefix=/usr/local/swig
make && make install

9.3、構成プロファイル

vim /etc/profile

ANT_HOME=/usr/local/ant
SWIG_HOME=/usr/local/swig

PATH=$ANT_HOME/bin:$SWIG_HOME/bin:$PATH

export ANT_HOME SWIG_HOME

source /etc/profile

バージョンを見る

ant -バージョン
swig -バージョン

GDAL 3.0.4をインストールする

1.コンパイル

wget http://download.osgeo.org/gdal/3.0.4/gdal-3.0.4.tar.gz
tar -xf gdal-3.0.4.tar.gz
cd gdal-3.0.4
bash ./configure --prefix=/usr/local/pgsql/plugin/gdal --with-proj=/usr/local/pgsql/plugin/proj --with-geos=/usr/local/pgsql/plugin/geos/bin/geos-config --with-sqlite3=/usr/local/pgsql/plugin/sqlite3 --with-libjson-c=/usr/local/pgsql/plugin/json-c
make && make install
echo "/usr/local/pgsql/plugin/gdal/lib" > /etc/ld.so.conf.d/gdal-3.0.4.conf
ldconfig

2. エラー

間違い 1: /usr/local/src/gdal-3.0.4/gcore/gdal_version.h.in を gdal_version.h に変更します。

画像

エラー 2: このエラーが発生すると、sqlite3 で生成されたファイルは通常、/usr/local/lib にあります。削除する必要がある場合は、sqlite3 で生成されたファイルを再コンパイルして、別個に配置します。たとえば、usr/local/sqlite3 の下に、次のように指定します。 gdal 構成中に -sqlite3 を使用

明確な声明: rm は慎重に使用する必要があり、明確に確認する必要があります。ライブラリを削除する理由は、このためです rm -rf /usr/local/lib/libsqlite3* /usr/local/bin/sqlite3 /usr/ローカル/lib/pkgconfig/sqlite3.pc

画像

エラー 3: json-c 静的ライブラリ ファイルがありません。静的ライブラリのパスを指定することで解決できますが、これは一時的な解決策です。json-c を usr/local/json-c に再コンパイルし、gdal を構成するときに --with-libjson-c を指定するのが最善です。

cd /usr/local/src/gdal-3.0.4/apps
/bin/sh /usr/local/src/gdal-3.0.4/libtool --mode=link --silent g++ -std=c++11  gdalserver.lo  /usr/local/src/gdal-3.0.4/libgdal.la /usr/local/lib/libjson-c.a -o gdalserver

画像

エラー 4: make: execvp: /usr/local/gdal-3.0.4/install-sh: アクセス許可が拒否されました

看到这个问题,是不是很高兴,表明已经编译完成了,执行安装脚本,没权限
执行  chmod 777  install-sh,赋予最高权限

3 GDAL 環境変数を構成する

vi /etc/profile を介して gdal/lib、gdal/bin、gdal/data を構成するか、プロファイルをローカルにダウンロードし、変更後にアップロードすることもできます

GDAL_HOME=/usr/local/pgsql/plugin/gdal
GDAL_DATA=$GDAL_HOME/share/gdal

LD_LIBRARY_PATH=$GDAL_HOME/lib:/usr/local/lib64:$JRE_HOME/lib:$LD_LIBRARY_PATH

PATH=$GDAL_HOME/bin:$PATH

export ... PATH LD_LIBRARY_PATH GDAL_DATA

4 GDAL のインストールが完了しました。バージョン番号とサポートされているデータ形式を確認してください。

gdalinfo --version
ogr2ogr --formats

画像

gdal.jar をコンパイルして生成する

java.optを設定する

修改文件:/usr/local/src/gdal-3.0.4/swig/java/java.opt,修改JAVA_HOME的值为java的根目录
JAVA_HOME = /usr/java/jdk1.8.0_221

コンパイル

cd /usr/local/src/gdal-3.0.4/swig/java
make && make install

JavaWeb アプリケーションの gdal 環境構成

1. ファイルを整理し、生成されたファイルを gdal/java ディレクトリに配置します。

mkdir -p /usr/local/pgsql/plugin/gdal/java
cp /usr/local/src/gdal-3.0.4/swig/java/gdal.jar  /usr/local/pgsql/plugin/gdal/java
cp /usr/local/src/gdal-3.0.4/swig/java/.libs/*.so /usr/local/pgsql/plugin/gdal/java

2. centos の java.library.path=/usr/java/packages/lib/amd64 で、libgdalalljni.so をこのディレクトリに配置します。javaWeb プロジェクトは、ここから libgdalalljni.so 動的ライブラリをロードします。

cp /usr/local/src/gdal-3.0.4/swig/java/.libs/*.so /usr/java/packages/lib/amd64

3. /swig/java で生成された gdal.jar ファイルを jre/lib/ext にコピーすると、jvm のロードが開始されます。

cp /usr/local/src/gdal-3.0.4/swig/java/gdal.jar  /usr/java/jdk1.8.0_221/jre/lib/ext

vi /etc/profile
CLASS_PATH=$JAVA_HOME/jre/lib/ext/gdal.jar:$CLASS_PATH
source /etc/profile

4. gdal.jar および libgdalalljni.so ファイルを /usr/local/gdal-3.0.4/swig/java/ ディレクトリのプロジェクト resource/gdal/linux にコピーします。

画像

5. JavaWeb を起動して見てみましょう

発生する可能性のある問題

注1: java.lang.UnsatisfiedLinkError: ネイティブ ライブラリ /usr/java/packages/lib/amd64/libgdalalljni.so はすでに別のクラスローダーにロードされています

jvm启动时已经加载过libgdalalljni.so,不能能再次加载了,在linux系统上无需代码加载libgdalalljni.so

エラー 2: libpq.so.5: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません。理由は、pg ライブラリがシステムの動的ライブラリ構成に設定されていないためです。ld.so.conf を設定してください。

echo '/usr/local/pgsql/lib' >> /etc/ld.so.conf
ldconfig

注 3: ネストされた例外は java.lang.UnsatisfiedLinkError: org.gdal.ogr.ogrJNI.RegisterAll()V です

gdal.jar未放置到/usr/java/jdk1.8.0_221/jre/lib/ext

vi /etc/profile
CLASS_PATH=$JAVA_HOME/jre/lib/ext/gdal.jar:$CLASS_PATH
source /etc/profile

関連情報

https://blog.csdn.net/qq_42522024/article/details/123838982

1. データソースに接続する

1.1.接続する前に

/*
准备工作
*/
gdal.AllRegister();
//注册所有驱动
ogr.RegisterAll();
//支持中文路径
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
//属性表支持中文
gdal.SetConfigOption("SHAPE_ENCODING", "CP936");

1.2. データソースドライバー

/*
5种主要驱动程序的名称
 */
public class DriverName {
    
    
    
    //String connShp = "D:\\DIST\\Code\\Project\\zhenjiang\\镇江shp\\五角星.shp";
    public static final String shp = "ESRI Shapefile";
    
    //String connGdb = "D:\\DIST\\geoData\\shpFile\\unionResult.gdb";
    public static final String gdb = "FileGDB";//或者OpenFileGDB
    
    //String connPg = "PG:dbname=dggis host=192.168.200.34 port=30013 user=sde password=sde";
    public static final String postgreSQL = "PostgreSQL";
    
    //String connStr = "OCI:sde/sde:SYS.Yjjbnt";//连接本地库可以忽略数据库实例
    //String connSde = "OCI:gis_qf/[email protected]/orcl:CHDYZT.JSFAFW";
    //String connStr = "OCI:rcgtkjgh/[email protected]:1521/orcl:RCGTKJGH.DELSH_STBHHX";
    public static final String sde = "OCI";
    
    //String connMdb = "D:\\DIST\\geoData\\shpFile\\test.mdb";
    public static final String mdb = "PGeo";
}

1.3、データソースを接続する基本プロセス

/*
连接数据源的基本过程
*/
1、根据驱动名称获取驱动
    Driver driver = ogr.GetDriverByName(driverName);
2、通过驱动打开数据源
    DataSource dataSource = driver.Open(FilePath, 0);//文件路径或者连接字符串,0表示不更新数据集,为只读
3、获取数据源里的图层
    dataSource.GetLayer(index:)//根据id获取
    dataSource.GetLayer(layerName:"")//根据名称获取
4、获取图层里的要素
    //读取GDB里面的图层时,获取Feature得用GetNextFeature()方法,不能根据GetFeature(long fid)	
    layer.GetFeature(int:);//根据id

	layer.ResetReading();//把要素读取顺序重置为从第一个开始
	layer.GetNextFeature();

1.4. データの基本情報を読む

读取图层数量:
        int layerCount = dataSource.GetLayerCount();
图层名称
        String layerName = layer.GetName();
图层要素数量
        long featureCount = layer.GetFeatureCount();
图层空间参考信息
        SpatialReference s = layer.GetSpatialRef();
图层的属性表结构
        FeatureDefn featureDefn = layer.GetLayerDefn();
属性表字段数量
        int fieldCount = featureDefn.GetFieldCount();
属性表的属性字段
        FieldDefn fieldDefn = featureDefn.GetFieldDefn(i1);//根据索引获取
属性字段类型
        int fieldType = fieldDefn.GetFieldType();
        String fieldTypeName = fieldDefn.GetFieldTypeName(fieldType);
属性字段名称
        String fieldName = fieldDefn.GetName();
获取FID
        long fid = feature.GetFID();//这个是通过Feature来获取的
获取Geometry
    	Geometry geometry = feature.GetGeometryRef();
    	String geoJson = geometry.ExportToJson();
{
    
     "type": "Polygon", "coordinates": [ [ [ 119.456586303, 32.063698523000028, 0.0 ], [ 119.468721554000012, 32.045852565000018, 0.0 ], [ 119.490850540999986, 32.040141859000016, 0.0 ], [ 119.472290745, 32.028006608, 0.0 ], [ 119.478001451999944, 32.003736104999973, 0.0 ], [ 119.457300141000019, 32.023723577999988, 0.0 ], [ 119.43659882999998, 32.002308428999982, 0.0 ], [ 119.443023375000053, 32.025865093, 0.0 ], [ 119.422322064000014, 32.034431152000025, 0.0 ], [ 119.445878728000025, 32.043711050000013, 0.0 ], [ 119.456586303, 32.063698523000028, 0.0 ] ] ] }
获取图层范围
		double[] extent = layer.GetExtent();//返回4个坐标点

2.投影について

SpatialReference spatialReference = layer.GetSpatialRef();//获取图层的空间信息
//设定空间信息
//通过EPSG
SpatialReference spatialReference = new SpatialReference();
spatialReference.ImportFromEPSG(4490);
//通过WKT字符串
String strwkt = "GEOGCS[\"GCS_North_American_1927\"," +
                "DATUM[\"North_American_Datum_1927\"," +
                "SPHEROID[\"Clarke_1866\",6378206.4,294.9786982]]," +
                "PRIMEM[\"Greenwich\",0]," +
                "UNIT[\"Degree\",0.0174532925199433]]";
SpatialReference spatialReference = new SpatialReference(strwkt);

投影情報は次のとおりです (WKT 文字列)。

PROJCS[“CGCS2000 / 3-degree Gauss-Kruger CM 117E”, //投影名称
GEOGCS[“China Geodetic Coordinate System 2000”, //地理坐标系名称
DATUM[“China_2000”, //水平基准面
SPHEROID[“CGCS2000”,6378137,298.257222101,//椭球体、长半轴,反偏率
AUTHORITY[“EPSG”,“1024”]],
AUTHORITY[“EPSG”,“1043”]],
PRIMEM[“Greenwich”,0, //中央经线Greenwich,0度标准子午线
AUTHORITY[“EPSG”,“8901”]],
UNIT[“degree”,0.0174532925199433, //指定测量使用的单位。在地理坐标系下使用角度。
AUTHORITY[“EPSG”,“9122”]],
AUTHORITY[“EPSG”,“4490”]],
PROJECTION[“Transverse_Mercator”], //投影方式
PARAMETER[“latitude_of_origin”,0], //PARAMETER表示投影参数,0表示纬度起点为0度
PARAMETER[“central_meridian”,117], //投影带的中央经线是东经117度
PARAMETER[“scale_factor”,1], //中央经线的长度比是1
PARAMETER[“false_easting”,500000], //坐标纵轴向西移动500km
PARAMETER[“false_northing”,0], //横轴没有平移
UNIT[“metre”,1, //指定测量使用的单位,指定米为测量单位
AUTHORITY[“EPSG”,“9001”]],
AXIS[“Northing”,NORTH],
AXIS[“Easting”,EAST],
AUTHORITY[“EPSG”,“4548”]]

3. 属性クエリ

3.1 レイヤー別のクエリ

//查询没有发生错误则返回0,注意此时的layer只包含 满足条件的要素
int result = layer.SetAttributeFilter("YSDM='3002020100'");//属性查询时注意不能用字段别名
//参数设为null表示清空查询
layer.SetAttributeFilter(null);

3.2 データソース datasource を介したクエリ

Layer queryLayer = dataSource.ExecuteSQL("select * from union5 where YSDM='3002020100'");

4. ジオプロセシング

/**
 * 两个图层之间的地理处理操作
 * @param inputLayer:输入图层
 * @param queryLayer:求交图层
 * @param resultLayer:返回结果图层
 * @param spatialFilter:地理处理操作
 */
public static void spatialQuery(Layer inputLayer,Layer queryLayer,Layer resultLayer,int spatialFilter){
    
    

    Vector v = new Vector(4);
    v.add("SKIP_FAILURES=YES");//跳过处理过程中出现的错误
    v.add("PROMOTE_TO_MULTI=NO");//Polygon不转为MultiPolygon,如果设为YES则会
    v.add("INPUT_PREFIX=1_");//输入图层在属性表中的字段前缀
    v.add("METHOD_PREFIX=2_");//求交图层的字段前缀
    switch (spatialFilter){
    
    
        //相交
        case 0:
            inputLayer.Intersection(queryLayer,resultLayer,v,null);
            break;
        //合并
        case 1:
            inputLayer.Union(queryLayer,resultLayer,v,null);
    }

}

5. レイヤーを作成する

/**
 * 创建矢量图层
 * @param driverName:驱动名称
 * @param path:图层保存路径,要和驱动匹配
 * @param layerName:图层名称
 * @param spatialReference:图层空间参考
 * @return 返回创建好的图层
 */
public static Layer createLayer(String driverName, String path, String layerName, SpatialReference spatialReference) {
    
    
    Layer result = null;

    Driver driver = ogr.GetDriverByName(driverName);
    if (driver == null) {
    
    
        log.info(driverName + "不可用");
        System.out.println(driverName + "不可用");
        return null;
    }
    DataSource dataSource = null;
    //这里需要判断一下path是否已经存在,存在的话先删除再创建(如果是已存在的gdb,则直接打开)
    File file = new File(path);
    if (file.exists()) {
    
    
        if (file.isFile()) {
    
    
            file.delete();
            dataSource = driver.CreateDataSource(path, null);
        } else if (file.isDirectory()) {
    
    
            dataSource = driver.Open(path, 1);
            //GDB中存在同名图层则删除
            for (int i = 0; i < dataSource.GetLayerCount(); i++) {
    
    
                Layer layer = dataSource.GetLayer(i);
                if (layerName.equals(layer.GetName())) {
    
    
                    dataSource.DeleteLayer(i);
                    dataSource.FlushCache();
                }
            }
        }
    } else {
    
    
        dataSource = driver.CreateDataSource(path, null);
    }
    if (dataSource == null) {
    
    
        log.info("数据源创建/打开失败");
        System.out.println("数据源创建/打开失败");
        return null;
    }
    result = dataSource.CreateLayer(layerName, spatialReference, ogr.wkbPolygon, null);
    if (result == null) {
    
    
        log.info(layerName + "创建失败");
        System.out.println(layerName + "创建失败");
        return null;
    }
    log.info("【"+layerName+"】" + "创建成功");
    return result;
}

6. 要素の作成

/**
 * 传入Geometry创建Feature,这里不定义属性字段
 * @param layer
 * @param geometry
 */
public static void createFeatureByGeometry(Layer layer, Geometry geometry) {
    
    
    FeatureDefn featureDefn = layer.GetLayerDefn();
    Feature feature = new Feature(featureDefn);
    feature.SetGeometry(geometry);
    layer.CreateFeature(feature);
}

おすすめ

転載: blog.csdn.net/qq_43961619/article/details/124627871