在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.icon-default.png?t=N7T8https://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
至此,成功运行!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

速通Python基础语法--语句篇

缩进和代码块 一 条件语句if/elif if的基本语法 示例 条件语句嵌套 练习1 练习2 二 空语句 三 while循环 示例 打印1-10 求1-100的和 求5! 求1-5的阶乘之和 四 for循环 for的基本语法 1~range[ ,) 五 continue/break continue:结束当前循环,继续下一次循环 break:结束整个循…

《每天一分钟学习C语言·四》文本读写操作及二进制读写

fopen(参数1,参数2)&#xff0c;第一个参数是要打开的文件名&#xff0c;文件名字符串&#xff0c;第二个参数用于制定文件打开模式的一个字符串。 注&#xff1a;如果要打开某个盘的文本如F盘test文件夹下的test.txt文本&#xff0c;则fopen(“F:\test\test.txt”,”r”); 程序…

AcWing算法进阶课-1.1.2Dinic/ISAP求最大流

算法进阶课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 给定一个包含 n n n 个点 m m m 条边的有向图&#xff0c;并给定每条边的容量&#xff0c;边的容量非负。 图中可能存在重边和自环。求从点 S S S 到点 T T T 的最大流。 输入格式 第一行包…

本地websocket服务端结合cpolar内网穿透实现公网访问

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

黑马头条--day07--app文章搜索

目录 一.安装elasticsearch 1.拉取镜像 2.创建存放数据及配置文件的文件夹&#xff0c;启动时挂载。 4.修改文件夹权限 5.启动容器 5.1参数解释 6.安装ik分词器 6.2测试一下Ik分词器 二.添加文章索引库 1查询所有的文章信息&#xff0c;批量导入到es索引库中 2)测试 …

深度盘点:除了BRC20外 这些公链潜力铭文也值得关注

近日的铭文市场风起云涌&#xff0c;除BRC20占据着市场70%以上的份额外&#xff0c;其他公链的铭文也在快速发展

Spring Boot + EasyUI 全屏布局(二)

一、创建一个Spring Boot EasyUI项目 Spring Boot EasyUI 创建第一个项目&#xff08;一&#xff09;_springboot整合easyui-CSDN博客 二、相关知识点总结 布局&#xff08;layout&#xff09;是有五个区域&#xff08;北区 north、南区 south、东区 east、西区 west 和中区…

Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第十三章、拦截器 拦截器 &#xff1a;Interceptor 拦截 中断 类似于javaweb中的Filter&#xff0c;不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦…

typeScript安装及TypeScript tsc 不是内部或外部命令,也不是可运行的程序或批处理文件解决办法

一、typeScript安装&#xff1a; # 全局安装 TypeScript npm i -g typescript 二、检查是否安装成功ts&#xff1a; #检查ts的版本号 确定是否安装成功 tsc -v出现报错&#xff1a;‘tsc’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 解决&#xff1…

fastGitHub工具推荐(如果打不开github或者使用很慢可以使用该工具)

目录 一&#xff0c;针对问题二&#xff0c;下载1&#xff0c;github里面下载FastGitHub2&#xff0c;博客上传了下载资源 三&#xff0c;安装使用点击执行文件即可 一&#xff0c;针对问题 当使用github很慢&#xff0c;或者根本打不开的时候&#xff0c;就可以使用该工具 …

Java基础知识复习

目录 一、Java语言基础知识&#xff0c;包括面向对象编程、语法特性等 0、什么是面向对象编程&#xff1f; 1、基本语法&#xff1a; 2、变量和数据类型&#xff1a; 3、运算符和表达式&#xff1a; 4、控制结构&#xff1a; 5、函数和方法&#xff1a; 6、类和对象&#xff1a…

电商数仓项目----笔记五(数仓架构和建模)

ODS&#xff1a;数据源 DWD&#xff1a;加工数据 DWS&#xff1a;统计数据 ADS&#xff1a;分析数据 DIM&#xff1a; 维度层&#xff08;大家都有可能用得上的部分&#xff09; ER模型 数据仓库之父Bill Inmon提出的建模方法是从全企业的…

如何使用jenkins、ant、selenium、testng搭建自动化测试框架

如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入&#xff0c;然后写一些测试脚本&#xff0c;这就是你所说的自动化测试&#xff0c;其实这个还不能算是真正的自动化测试&#xff0c;你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗&#xff…

Ubuntu 常用命令之 unzip 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 unzip命令在Ubuntu系统中用于解压缩.zip文件。它可以解压缩一个或多个.zip文件&#xff0c;并将文件解压缩到当前目录或指定的目录。 unzip命令的一般格式 unzip [选项] zipfile [file...]其中&#xff0c;zipfile是要解压的.zi…

三种方式简单搭建http本地文件服务

有时候想写一个简单的html文件&#xff0c;然后加上一些image、js、css文件用于测试。希望有一个简单的http服务&#xff0c;总结了如下三种方式&#xff0c;欢迎讨论更多高效的方式。 &#xff08;一&#xff09;使用Web Server for Chrome浏览器扩展 之前写过一篇博文&#x…

uniapp uview 页面多个select组件回显处理,默认选中

<view class"add-item column space-around" click"selectClick(1)"><text class"w-s-color-3 f-28">商品分类</text><view class"w-100 space-between"><!-- 第一个参数为你的单选数组&#xff0c;第二个…

传输层协议分析--第4关:UDP 包分析

任务描述 本关任务&#xff1a;能够掌握简单的 UDP 包分析。 相关知识 为了更好掌握本章内容&#xff0c;你需要了解的有&#xff1a; UDP 报文的简介&#xff1b;UDP 报文格式&#xff1b;Wireshark 软件中的 UDP 抓包分析。 UDP 简介 UDP&#xff08;User Datagram Pro…

anaconda 安装 使用 pytorch onnx onnxruntime

一&#xff1a;安装 如果不是 x86_64&#xff0c;需要去镜像看对应的版本 安装 Anaconda 输入命令 bash Anaconda3-2021.11-Linux-x86_64.sh 然后输入 yes 表示同意 确认安装的路径&#xff0c;一般直接回车安装在默认的 /home/你的名字/anaconda3 很快就安装完毕。输入 yes…

三防平板定制|5G三防工业平板电脑终端联发科MTK方案

三防平板&#xff0c;顾名思义&#xff0c;是指具备防水、防尘、防坠落等特性的平板电脑。它可以在各种恶劣环境中正常使用&#xff0c;如煤矿、工业制造、户外、建筑等。 三防平板的优势在于其坚固耐用、性能稳定。它通常采用高强度的材料制成&#xff0c;具有较强的抗冲击性和…

如何在 openKylin 上使用 ONLYOFFICE 桌面编辑器

文章作者&#xff1a;ajun ONLYOFFICE 桌面编辑器是一款基于依据 AGPL v.3 许可进行分发的开源办公套件。使用这款应用&#xff0c;您无需保持网络连接状态即可处理存储在计算机上的文档。 本文章基于中国根操作系统 openKylin 操作系统&#xff0c;使用软件商店快速安装与手…