在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 <…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
