Редактировать 1: Забыл упомянуть, что я использую Python - это встроенный Python.
Я скачал двоичные файлы Windows GDAL из Внутренние компоненты ГИС .
Предпосылка
Структура каталогов :
Parent
|gnuplot
|mysoft.exe
|gdal
|python-embedded
|jvm
|gsl2
|mybinaries
|mysoftlaunch.bat
Файл bat предоставляется двоичными файлами GDAL, и я внес соответствующие изменения в файл и каталог, в который я его поместил.
@echo off
set SDK_ROOT=%~dp0gdal\
set SDK_ROOT=%SDK_ROOT:\\=\%
set GNUPLOT_ROOT=%~dp0gnuplot\
set PYTHON_ROOT=%~dp0python-3.7.3-embed-amd64\
@echo %SDK_ROOT%
@echo %GNUPLOT_ROOT%
goto setenv
if "%1" == "setenv" goto setenv
%comspec% /k "%SDK_ROOT%SDKShell.bat" setenv %1
goto exit
:setenv
@echo Setting environment for using the GDAL and MapServer tools.
if "%2"=="hideoci" goto hideoci
set ocipath=0
set _path="%PATH:;=" "%"
for %%p in (%_path%) do if not "%%~p"=="" if exist %%~p\oci.dll set ocipath=1
if "%ocipath%"=="0" goto hideoci
@echo WARNING: If you encounter problems with missing oci libraries then type:
@echo SDKShell hideoci
goto setenv2
...
...
:setenv2
@echo at set env 2
SET "PATH=%SDK_ROOT%bin;%SDK_ROOT%bin\gdal\python\osgeo;%SDK_ROOT%bin\proj6\apps;%SDK_ROOT%bin\gdal\apps;%SDK_ROOT%bin\ms\apps;%SDK_ROOT%bin\gdal\csharp;%SDK_ROOT%bin\ms\csharp;%SDK_ROOT%bin\curl;%GNUPLOT_ROOT%bin\;%SDK_ROOT%gsl2\bin\;%PATH%"
SET "GDAL_DATA=%SDK_ROOT%bin\gdal-data"
SET "GDAL_DRIVER_PATH=%SDK_ROOT%bin\gdal\plugins"
SET "PYTHONPATH=%SDK_ROOT%bin\gdal\python\osgeo;%SDK_ROOT%bin\gdal\python;%SDK_ROOT%bin\ms\python;%PYTHON_ROOT%"
SET "PROJ_LIB=%SDK_ROOT%bin\proj6\SHARE"
SET "LD_LIB_PATH=%SDK_ROOT%gsl2\lib"
@echo done setting variables
start "MYSOFT" cmd /c java -jar "%~dp0mysoft.exe%"
@echo started mysoftware
exit
:exit
Несколько вещей здесь:
- Я использовал launch4j для указания пути к jvm для моего jar-файла и сделал его exe-файлом, поэтому существует mysoft.exe
- Я указал относительные пути в своем программном обеспечении для доступа к требуемым исполняемым файлам или сценариям.
- Я использовал встроенный в python и дал относительный путь скрипта python, который я бы вызвал как
gdal_merge.py
.
- Я не хотел делать
setx
один раз в файле bat и запускать программное обеспечение напрямую, потому что, если пользователи изменят каталог программного обеспечения и снова запустят сценарий, ограничение размера пути в окнах будет исчерпано и будет катастрофа. (почему я запускаю программное обеспечение из файла bat).
Сценарий должен был установить переменные среды для всех запущенных дочерних процессов.
Я могу подтвердить, что gdal_translate
работал нормально. [Я указал относительный путь к нему, а не вызывал его из среды.]
Рабочий процесс :
- Я устанавливаю переменные среды в bat-файле и запускаю java-программу.
- У меня есть Java-программа в качестве пользовательского интерфейса. Программа Java вызывает некоторый исполняемый файл или сценарий, который включает
gdal_merge.py
.
- Я указываю полный путь к gdal_merge.py в своем коде и вызываю его с помощью ProcessBuilder
Error
from osgeo import gdal
ModuleNotFoundError: No module named 'osgeo'.
Ожидаемое решение:
После установки пути из файла bat (во встроенный python, jvm, gdal {все, что требуется, например, gdal_data, gdal_driver, путь для двоичных файлов и т. Д.}), Запустите программное обеспечение Java, которое наследует переменные среды, которые запускают файл gdal_merge.py
.
В следующем порядке:
String path = System.getProperty("user.dir");
ProcessBuilder pb = new ProcessBuilder();
pb.inheritIO();
pb.command(Paths.get(path+"/python-embedded/python.exe").toString(),Paths.get(path+"/gdal/....../python/scripts/gdal_merge.py").toString(),...{other parameters required for gdal_merge.py});
PS:
Paths.get(x+"abc/def/").toString()
- Я использую для преобразования путей в стиле * NIX в пути в стиле Windows.