在QT Creator下用CMake编译GEOS库
最近,想要在C++下编一个可用GDAL模块的地图管理系统,找来找去,找到了GEOS。GEOS(Geometry Engine-Open Source)开源几何引擎 是一个用于计算几何的JTS库的 C/C++实现,专注于地理信息系统 (GIS) 软件中使用的算法。 它实现了 OGC 简单要素几何模型,并提供了该标准中的所有空间函数以及许多其他标准。 GEOS 是 PostGIS、QGIS、GDAL、Shapely 等的核心依赖项。GEOS库可以和GDAL库一起编译提供OGR库的所有功能。希望了解GEOS更多信息,可以前往https://trac.osgeo.org/geos/。
本文GEOS库所采用的是QT软件平台下的MinGW32编译器进行编译,编译出来的库文件也用于Windows系统下QT(MinGW)软件平台进行开发。编译后的文件主要有两个:libgeos.dll和libgeos_c.dll,编译出来以后经过测试,可以正常使用。
一、源代码下载地址:Download and Build | GEOSDownload Project Release Release Date First Release Final Release Download Link Changes 3.12.1 2023/11/11 2023/06/27 2027/07/01 geos-3.12.1.tar.bz2 Changes 3.11.3 2023/11/11 2022/07/01 2026/07/01 geos-3.11.3.tar.bz2 Changes 3.10.6 2023/11/11 2021/10/20 2025/10/20 geos-3.10.6.tar.bz2 Changes 3.9.5 2023/11/12 2020/12/09 2024/12/09 geos-3.9.5.tar.bz2 Changes 3.8.4 EOL 2023/11/12 2019/10/10 2023/11/12 geos-3.8.4.tar.bz2 Changes Old releases can be downloaded from https://download.https://libgeos.org/usage/download/下载后的文件为:geos-3.12.1.tar.bz2。解压后备用。
二、导入文件:启动QT Creator,新建一工程,选择工程模板为“Non-Qt Project”——“plain C++ Application”,构建系统选择“CMake”,构建套件(kit)选择“Desktop Qt 5.15.2 MinGW 32-bit”,一路点”下一步“,生成工程框架。将解压后的目录”geos-3.12.1“下面的所有子目录和文件导入到工程目录下面,并删除自动生成的”main.cpp“文件。
三、分析CMakeLists.txt文件并编译:经过仔细对工程目录下的所有CMakeLists.txt文件分析,未发现有误之处,便不再修改CMakeLists.txt文件,进行下一步构建工程。经过4分多钟的等待,最终生成了”libgeos.dll、libgeos_c.dll“两个dll文件和3 个测试可执行文件。编译成功!
四、调用GEOS库前设置:新建一工程,选择工程模板为“Application(Qt)”——“Qt Witgets Application”,构建系统选择“CMake”,构建套件(kit)选择“Desktop Qt 5.15.2 MinGW 32-bit”,一路点”下一步“,生成工程框架。在工程目录下新建“lib”和“include”两个子目录,将”libgeos.dll、libgeos_c.dll“两个dll文件复制到“lib”目录,将解压后的目录”geos-3.12.1“下面的学习“include/geos/”下面的所有文件拷贝至工程目录下的“include”中,至此,调用前设置工作完成。
五、调用GEOS库:使用官方网站的C++API帮助实例,代码如下:
#include <iostream>
#include "mygdalwidget.h"
#include "./ui_mygdalwidget.h"
#include "geos/geom/GeometryFactory.h"
#include "geos/geom/Geometry.h"
#include "geos/io/WKTReader.h"
#include "geos/io/WKTWriter.h"
#include <QMessageBox>
using namespace std;
using namespace geos::geom;
using namespace geos::io;
myGdalWidget::myGdalWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::myGdalWidget)
{
ui->setupUi(this);
}
myGdalWidget::~myGdalWidget()
{
delete ui;
}
void myGdalWidget::on_btnConnectGDAL_clicked()
{
GeometryFactory::Ptr fact = GeometryFactory::create();
WKTReader reader(*fact);
string wkt_a("POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))");
string wkt_b("POLYGON((5 5, 15 5, 15 15, 5 15, 5 5))");
/* Convert WKT to Geometry */
unique_ptr<Geometry> geom_a(reader.read(wkt_a));
unique_ptr<Geometry> geom_b(reader.read(wkt_b));
/* Calculate intersection */
unique_ptr<Geometry> inter = geom_a->intersection(geom_b.get());
/* Convert Geometry to WKT */
WKTWriter writer;
writer.setTrim(true); /* Only needed before GEOS 3.12 */
QString inter_wkt = QString::fromStdString(writer.write(inter.get()));
/* Print out results */
cout << "Geometry A: " << wkt_a << endl;
cout << "Geometry B: " << wkt_b << endl;
cout << "Intersection(A, B): << inter_wkt.toStdString()<<endl;
QMessageBox::information(this,"显示两个图形相交",inter_wkt);
}
代码输入完毕,点构建运行,应用程序输出:
11:54:07: Starting F:\QtProjects\build-firstGDALPro-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\firstGDALPro.exe...
Geometry A: POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))
Geometry B: POLYGON((5 5, 15 5, 15 15, 5 15, 5 5))
Intersection(A, B): POLYGON ((10 10, 10 5, 5 5, 5 10, 10 10))
11:54:26: F:\QtProjects\build-firstGDALPro-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\firstGDALPro.exe 退出,退出代码: 0
至此,成功运行!
相关文章:

在QT Creator下用CMake编译GEOS库
最近,想要在C下编一个可用GDAL模块的地图管理系统,找来找去,找到了GEOS。GEOS(Geometry Engine-Open Source)开源几何引擎 是一个用于计算几何的JTS库的 C/C实现,专注于地理信息系统 (GIS&#…...
【Qt之Quick模块】4. QML语法格式及命名规范
概述 QML(Qt Meta-Object Language)是一种声明式语言,用于设计用户界面。它是由Qt框架提供的一种描述界面组件的语言,可以与C代码结合使用,用于创建跨平台的应用程序。 QML具有以下特点: 声明式ÿ…...

Python内置类属性__class__属性的使用教程
概要 Python作为一种高级编程语言,提供了丰富的功能和灵活性,使得开发人员能够更加方便地处理各种任务。其中一个强大的功能是内置类属性__class__属性。本文将详细介绍__class__属性的用法,帮助读者更好地理解和利用这一功能。 第一部分&am…...

【后台报错】插入时sql报错,varchar撑爆
后台的一个报错。按照正常的需要复现,或者查一下日志。但是凭借多年经验和大胆猜测,以及对自己代码要自信 引用一下文章 目测7*15 105项。每个id有9个数字加上分隔符刚好十个。大概就是超过了定义的一千的varchar长度。直接改数据库就好了。 简单粗暴…...

OpenSergo使用详解
简介 OpenSergo是一个基于微服务治理的标准和生态,覆盖了服务元信息、流量治理、服务容错、数据库/缓存治理、服务注册发现、配置治理等十几个关键领域,覆盖了完整的微服务生命周期(从开发态到测试态,到发布态,再到运…...

Vanilla Pro for Mac 一款隐藏菜单栏图标工具
Vanilla Pro Vanilla Pro是一款简单易于使用的Mac应用程序,可让您隐藏菜单栏图标。只需下载Vanilla,启动应用程序,然后按照提示即可开始。 资源获取 Vanilla Pro for Mac 功能特性 键盘快捷键:设置自定义键盘快捷键来切换菜单…...

freemarkEngine文件ftl的可视化编辑
在做导出word文件功能时,需要准备ftl模板,设置一些通配符,之后通过相关编码,即可以实现业务数据渲染后导出word的功能。但是ftl文件一般我们看不太懂,所以可视化创建和修改就非常合适。 1、安装office2016版本&#x…...

2023 英特尔On技术创新大会直播 | 边云协同加速 AI 解决方案商业化落地
目录 前言边云协同时代背景边缘人工智能边缘挑战英特尔边云协同的创新成果最后 前言 最近观看了英特尔On技术创新大会直播,学到了挺多知识,其中对英特尔高级首席 AI 工程张宇博士讲解的边云协同加速 AI 解决方案商业化落地特别感兴趣。张宇博士讲解了英…...
Q-star计划的更多细节
继续探讨点Q*相关的话题,这个应该是目前X和Reddit上比较火的话题了,其实就是关于Q*的方法是不是让LLM变得会产生意识,会产生自己的好恶和对人类的偏见,关于Q-star的一些介绍可以看我上一篇的扫盲帖 RLAIF方法与传说中的函数Q,揭露OpenAI那不为人知的Qstar计划 (qq.com) 我…...

python3 数据分析项目案例,用python做数据分析案例
本篇文章给大家谈谈python3 数据分析项目案例,以及用python做数据分析案例,希望对各位有所帮助,不要忘了收藏本站喔。 目录 一丶可视化绘图案例 1.曲线图 2.柱形图 3.点线图 4.3D散点图 5. 绘制漏斗图 6. 绘制词云图 二丶包/模块使用示例 (1)…...
Android 12 (InputMethodManagerService) 替换默认输入法为Pinyin输入法
1.问题场景 由于系统自带的Latin输入法不支持遥控器操作,需要替换为RK的拼音输入法。 2. 替换步骤 1)将LatinIME从mk中删除,让系统编译的时候不编译该apk --- a/Android/build/make/target/product/handheld_product.mkb/Android/build/m…...

【模式识别】探秘判别奥秘:Fisher线性判别算法的解密与实战
🌈个人主页:Sarapines Programmer🔥 系列专栏:《模式之谜 | 数据奇迹解码》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🌌1 初识模式识…...

【XML】TinyXML 详解
1、简介 优点: TinyXML 是一个简单、小型的 C XML 解析器,可以轻松集成到项目中。 TinyXML 解析 XML 文档,并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的,因此可以在开源或商业代码中…...

泛社交裂变场景下AB增量科学评估方案
在数据驱动业务的大环境下,AB实验是对策略效果进行评估的重要指南针,并广泛应用在用增/推荐/搜索/内容/商业化等多个领域,尤其是综合评估多个策略对于大盘影响的对比效果,AB增量的计算就尤为重要。 背景 现在普遍常见的泛社交裂变…...

【无标题】json报错
操作失败,JSON parse error: Cannot deserialize value of type com.alibaba.fastjson.JSONArray from String value (token JsonToken.VALUE_STRING); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize valu…...

MyBatis中延迟加载,全局和局部的开启使用与关闭
文章目录 MyBatis中延迟加载,全局和局部的开启使用与关闭1、问题提出2、延迟加载和立即加载延迟加载立即加载 3、三种对应的表关系中的加载4、打开全局延迟加载(实现一对一的延迟加载)5、实现一对多的延迟加载(将上面设置的全局延…...

MyBatis增删改查基础及其xml文件
目录 一.增删改查基础 1.增 增Insert 获取自增ID 对insert参数进行重命名 2.删 3.改 4.查 1)对MySQL查询结果进行重命名 从MySQL层面--as 从mybatis层面--Results注解 复用Results的定义 2)配置自动转换驼峰命名(推荐) 二.Mybatis xml配置…...
视觉学习(1)—— 理论
一、提问 初入视觉的几个问题: 1、视觉是怎么被控制的 2、怎么让视觉启动 3、视觉需要完成什么东西 4、视觉启动如何将完成的东西反馈给我 二、回答 1、视觉都是通过通讯协议控制,如串口、Modbus TCP等协议 2、视觉中的所有功能块都在流程中&…...

pip 常用指令 pip list 命令用法介绍
📑pip 常用命令归类整理 pip list 是一个用于列出已安装的 Python 包的命令。这个命令会显示出所有已安装的包,以及它们的版本号。 pip list 命令有以下参数 -o, --outdated:列出所有过时的包,即有新版本可用的包。-u, --uptod…...
【DP】62.不同路径
题目 法1:二维DP 必须掌握! class Solution {public int uniquePaths(int m, int n) {int[][] matrix new int[m][n];Arrays.fill(matrix[0], 1);for (int i 0; i < m; i) {matrix[i][0] 1;}for (int i 1; i < m; i) {for (int j 1; j <…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...