基于activiti和bpmn.js的wps服务链研究(毕设研究笔记)

1.IDEA导入geoserver源码项目

Intellij Idea启动GeoServer源码工程项目搭建_geoserver 源码部署-CSDN博客

IDEA导入geoserver项目_geoserver org.geoserver.wcs.kvp.rangesubset 文件不存在-CSDN博客

2.邻近分析

【QGIS】在Pycharm中使用pyqgis中的processing工具箱功能_qgis processing.core.processing_西米2231的博客-CSDN博客

【QGIS】在Pycharm中通过独立程序方式使用pyqgis里processing的工具箱功能 - 知乎 (zhihu.com)

栅格的邻近分析可计算一个栅格要素类中各点与另一要素类中最近的栅格像素值之间的距离

研究目的:利用Distance工具中的Euclidean Distance模型,计算菜子湖区每个栅格分别与湖泊、农田、草本沼泽、泥滩、圩堤、道路的距离。

方法实现:使用java封装wps模型调用python的QGIS库api实现邻近分析

具体做法:

1.PyCharm QGIS环境配置

设置解释器方式

新建一个项目,选择Python解释器为:D:\QGIS\bin\python-qgis.bat,这个批处理会自动设置环境变量,然后启动python解释器。

PyCharm可以读取到qgis相关的包,包括qgis.core、qgis.gui

注:此时的PyCharm无法使用processing工具包

解决办法:

在环境变量中创建 PYTHONPATH 字段,将以下地址引入环境变量中

将Processing进行初始化

scss 复制代码
from processing.core.Processing import Processing
qgs = QgsApplication([], False)
qgs.initQgis()
# qgs.initQgis()之后再进行Processing的初始化
Processing.initialize()

里遇到问题即我不能成功索引到sys.path.append(r'D:\Program Files\QGIS\apps\qgis\python\plugins')来成功引入这个Processing包中的py文件,因此我选择直接将processing文件复制到项目文件夹

发现通过以上方法设置后大部分工具箱的功能可以用,但是GDAL中的功能和部分插件不可用。如本次需要使用的gdal:proximity方法

解决方法:创建对 QgsApplication 的引用,以独立脚本的方式启动,并注册算法。

核心代码:

csharp 复制代码
params = {
    'INPUT': input_file,
    'BAND': 1,
    'VALUES': source_pixel_value,
    'UNITS': 1,
    'MAX_DISTANCE': 0,
    'REPLACE': 0,
    'NODATA': 0,
    'OPTIONS': '',
    'EXTRA': '',
    'DATA_TYPE': 5,
    'OUTPUT': output_file
}

result = processing.run("gdal:proximity", params)
  • 'INPUT': 'E:/Edge_download/outputGridCoverage (5).tiff':输入栅格数据集的路径。

  • 'BAND': 1:要计算距离的波段索引。

  • 'VALUES': '2':指定要计算距离的栅格像元值。(这个也是模型封装需要是输入参数,这样才能确定土地利用类型各个代表栅格点到其他土地利用类型的距离)

  • 'UNITS': 1:距离单位,1表示像素单位、0代表配置后的实际坐标。

  • 'MAX_DISTANCE': 0:最大距离,这里设置为0,表示只计算与指定像元值相邻的像元的距离。

2.geoserver对gdal的处理进行WPS封装

重点:Java进程ProcessBuilder类的使用,ProcessBuilder调用外部程序执行python命令

ini 复制代码
// 构造 ProcessBuilder 对象
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "D:\\Program Files\\QGIS\\bin\\python-qgis.bat", "./src/main/webapp/data/python/euclidean_Distance.py");
// 启动进程
process = pb.start();
//获取进程的输出流
OutputStreamWriter streamWriter = new OutputStreamWriter(process.getOutputStream());
BufferedWriter bufferedWriter = new BufferedWriter(streamWriter);
// 将 sourcePixelValue 发送给 Python
bufferedWriter.write(Integer.toString(sourcePixelValue));
bufferedWriter.newLine();
bufferedWriter.flush();
// 读取进程输出
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
// 读取进程错误输出
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String errorLine;
while ((errorLine = errorReader.readLine()) != null) {
    System.err.println(errorLine);
}
// 等待进程结束
int exitCode = process.waitFor();
if (exitCode == 0) {
    System.out.println("Python 脚本运行成功!");
} else {
    System.err.println("Python 脚本运行失败,错误码:" + exitCode);
}

ProcessBuilder 是一个用于创建和启动子进程的工具类。它允许你以 Java 代码的方式执行外部命令。 下面是对 ProcessBuilder 构造函数参数的解释:

1. "cmd.exe":指定要执行的命令解释器,这里使用 Windows 的 cmd.exe 命令提示符。

2. "/c":传递给 cmd.exe 的参数,表示在执行完命令后关闭 cmd.exe。

3. "python-qgis.bat":要执行的可执行脚本或命令,这里是 python-qgis.bat 脚本。

4. "your_script.py":要传递给 python-qgis.bat 的参数,这里是你的 Python 脚本的文件名。

传参到进程中

1.java进程里使用bufferedWriter.write(Integer.toString(sourcePixelValue));将传输传给python进程 2.python进程使用source_pixel_value = str(sys.stdin.readline())获取该传值 这样实现了source_pixel_value参数在两个进程之间的传递

3.适宜性分析和评价

毕设生态适宜性分析的几个步骤:

1.数据的预处理,得到标准化的环境因子数据产品

2.熵权法计算生态适宜性指数(评估点)

3.随机森林模型和主成分分析模型的拟合效果

相关推荐
2401_8572979114 分钟前
秋招内推2025-招联金融
java·前端·算法·金融·求职招聘
通信仿真实验室23 分钟前
MATLAB使用眼图分析QPSK通信系统接收端匹配滤波后的信号
开发语言·算法·matlab
通信仿真实验室28 分钟前
(15)衰落信道模型作用于信号是相乘还是卷积
开发语言·人工智能·算法·matlab
Run with the Wind34 分钟前
【2024.9.29练习】R 格式
算法
Jeremy_1213837 分钟前
三种波束形成方法的区别(MVDR、MMSE以及MSNR波束形成器)
算法
远望樱花兔1 小时前
【d59】【Java】【力扣】146.LRU缓存
java·开发语言·算法
秋夜Autumn1 小时前
贪心算法相关知识
算法·贪心算法
潘多编程1 小时前
Spring Boot微服务架构设计与实战
spring boot·后端·微服务
2402_857589361 小时前
新闻推荐系统:Spring Boot框架详解
java·spring boot·后端
2401_857622661 小时前
新闻推荐系统:Spring Boot的可扩展性
java·spring boot·后端