不该挽留的就别强求 發表於 2023-7-19 12:31:00

麒麟系统开发笔记(十二):在国产麒麟系统上编译GDAL库、搭建基础开发环境和基础Demo

<div class="cl-preview-section">
<h1>前言</h1>
</div>
<div class="cl-preview-section">
<p>  麒麟系统上做全球北斗定位终端开发,北斗GPS发过来的是大地坐标,应用需要的是经纬度坐标,所以需要转换,可以使用公式转换,但是之前涉及到了山He智能一个项目使用WG。</p>
</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>大地坐标简介</h1>
</div>
<div class="cl-preview-section">
<h2>概述</h2>
</div>
<div class="cl-preview-section">
<p>  大地坐标(Geodetic coordinate)是大地测量中以参考椭球面为基准面的坐标,地面点P的位置用大地经度L、大地纬度B和大地高H表示。</p>
</div>
<div class="cl-preview-section">
<h2>原理</h2>
</div>
<div class="cl-preview-section">
<p>  当点在参考椭球面上时,仅用大地经度和大地纬度表示。大地经度是通过该点的大地子午面与起始大地子午面(通过格林尼治天文台的子午面)之间的夹角。规定以起始子午面起算,向东由0°至180°称为东经;向西由0°至180°称为西经。大地纬度是通过该点的法线与赤道面的夹角,规定由赤道面起算,由赤道面向北从0°至90°称为北纬;向南从0°到90°称为南纬。大地高是地面点沿法线到参考椭球面的距离。</p>
</div>
<div class="cl-preview-section">
<h2>北京54坐标系:BJZ54</h2>
</div>
<div class="cl-preview-section">
<p>  北京54坐标系(BJZ54)是指北京54坐标系为参心大地坐标系,大地上的一点可用经度L54、纬度M54和大地高H54定位,它是以克拉索夫斯基椭球为基础,经局部平差后产生的坐标系。</p>
</div>
<div class="cl-preview-section">
<ul>
<li>长半轴a = 6378245m</li>
<li>短半轴b = 6356863.0188m</li>
<li>第一偏心率平方e2 = 0.006693421622</li>
<li>扁率α =1/298.3</li>
</ul>
</div>
<div class="cl-preview-section">
<h2>世界大地坐标系统:WGS-84</h2>
</div>
<div class="cl-preview-section">
<p>  WGS-84坐标系是世界大地坐标系统,其坐标原点在地心,采用WGS-84椭球(1984世界大地坐标系)。<br>  WGS-84坐标系是美国国防部研制确定的大地坐标系,是一种协议地球坐标系。<br>  WGS-84坐标系的定义是:原点是地球的质心,空间直角坐标系的Z轴指向BIH(1984.0)定义的地极(CTP)方向,即国际协议原点CIO,它由IAU和IUGG共同推荐。X轴指向BIH定义的零度子午面和CTP赤道的交点,Y轴和Z,X轴构成右手坐标系。<br>  WGS-84椭球采用国际大地测量与地球物理联合会第17届大会测量常数推荐值,采用的两个常用基本几何参数:</p>

</div>
<div class="cl-preview-section">
<ul>
<li>长半轴a = 6378137m</li>
<li>短半轴b = 6356752.3142m</li>
<li>第一偏心率平方e2 = 0.00669437999013</li>
<li>扁率 α= 1/298.257223563</li>

</ul>

</div>
<div class="cl-preview-section">
<h2>国家大地坐标系:CGCS2000</h2>

</div>
<div class="cl-preview-section">
<p>  2000国家大地坐标系,是我国当前最新的国家大地坐标系,英文名称为China Geodetic Coordinate System 2000,英文缩写为CGCS2000。<br>  2000国家大地坐标系的原点为包括海洋和大气的整个地球的质量中心;2000国家大地坐标系的Z轴由原点指向历元2000.0的地球参考极的方向,该历元的指向由国际时间局给定的历元为1984.0的初始指向推算,定向的时间演化保证相对于地壳不产生残余的全球旋转,X轴由原点指向格林尼治参考子午线与地球赤道面(历元2000.0)的交点,Y轴与Z轴、X轴构成右手正交坐标系。采用广义相对论意义下的尺度。</p>

</div>
<div class="cl-preview-section">
<ul>
<li>长半轴a = 6378137m</li>
<li>短半轴b = 6356752.314m</li>
<li>第一偏心率平方e2 = 0.00669438002290</li>
<li>扁率α = 1/298.257222101</li>

</ul>

</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>GDAL库</h1>

</div>
<div class="cl-preview-section">
<h2>概述</h2>

</div>
<div class="cl-preview-section">
<p>  GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。 OGR是GDAL项目的一个分支,提供对矢量数据的支持。 有很多著名的GIS类产品都使用了GDAL/OGR库,包括ESRI的ARCGIS 9.3,Google Earth和跨平台的GRASS GIS系统。利用GDAL/OGR库,可以使基于Linux的地理空间数据管理系统提供对矢量和栅格文件数据的支持。</p>

</div>
<div class="cl-preview-section">
<h2>功能特征</h2>

</div>
<div class="cl-preview-section">
<ul>
<li>GDAL提供对多种栅格数据的支持,包括Arc/Info ASCII Grid(asc),GeoTiff (tiff),Erdas Imagine Images(img),ASCII DEM(dem) 等格式。</li>
<li>GDAL使用抽象数据模型(abstract data model)来解析它所支持的数据格式,抽象数据模型包括数据集(dataset),坐标系统,仿射地理坐标转换(Affine Geo Transform),大地控制点(GCPs),元数据(Metadata),栅格波段(Raster Band),颜色表(Color Table),子数据集域(Subdatasets Domain),图像结构域(Image_Structure Domain),XML域(XML:Domains)。</li>
<li>GDALMajorObject类:带有元数据的对象。</li>
<li>GDALDdataset类:通常是从一个栅格文件中提取的相关联的栅格波段集合和这些波段的元数据;</li>
<li>GDALDdataset也负责所有栅格波段的地理坐标转换(georeferencing transform)和坐标系定义。</li>
<li>GDALDriver类:文件格式驱动类,GDAL会为每一个所支持的文件格式创建一个该类的实体,来管理该文件格式。</li>
<li>GDALDriverManager类:文件格式驱动管理类,用来管理GDALDriver类。</li>

</ul>

</div>
<div class="cl-preview-section">
<h2>OGR体系结构</h2>

</div>
<div class="cl-preview-section">
<ul>
<li>Geometry类:Geometry (包括OGRGeometry等类)封装了OpenGIS的矢量数据模型,并提供了一些几何操作,WKB(Well Knows Binary)和WKT(Well Known Text)格式之间的相互转换,以及空间参考系统(投影)。</li>
<li>Spatial Reference类:OGRSpatialReference封装了投影和基准面的定义。</li>
<li>Feature类:OGRFeature封装了一个完整feature的定义,一个完整的feature包括一个geometry和geometry的一系列属性。</li>
<li>Feature Definition类:OGRFeatureDefn里面封装了feature的属性,类型、名称及其默认的空间参考系统等。一个OGRFeatureDefn对象通常与一个层(layer)对应。</li>
<li>Layer类:OGRLayer是一个抽象基类,表示数据源类OGRDataSource里面的一层要素(feature)。</li>
<li>Data Source类:OGRDataSource是一个抽象基类,表示含有OGRLayer对象的一个文件或一个数据库。</li>
<li>Drivers类:OGRSFDriver对应于每一个所支持的矢量文件格式。类OGRSFDriver由类OGRSFDriverRegistrar来注册和管理。</li>

</ul>

</div>
<div class="cl-preview-section">
<h2>下载地址</h2>

</div>
<div class="cl-preview-section">
<p>  Home:https://gdal.org/download.html<br> 选择3.2.1版本</p>

</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>编译GDAL</h1>

</div>
<div class="cl-preview-section">
<h2>步骤一:下载解压</h2>

</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token builtin class-name">cd ~/work/src/
<span class="token function">tar xvf gdal-3.2.1.tar.gz
</span></span></code></pre>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/22dc39861b154581bc6d7cb8368919e5.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤二:配置configure</h2>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token builtin class-name">cd gdal-3.2.1
./configure
</span></code></pre>
</div>
<div class="cl-preview-section">
<p>  错误“configure:error: PROJ 6 symbols not found”,需要编译PROJ6:<br>  <img src="https://img-blog.csdnimg.cn/347ce6e0aa6b419b921769beea7fcab5.png"></p>

</div>
<div class="cl-preview-section">
<p>  请查看后面的章节“编译PROJ6”,编译完成后,回到此处继续配置:</p>

</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token builtin class-name">cd gdal-3.2.1
./configure
</span></code></pre>
</div>
<div class="cl-preview-section">
<p>  配置通过:<br>  <img src="https://img-blog.csdnimg.cn/a4fb5a7bf7894d58a0c90a461e5dd2f9.png"></p>

</div>
<div class="cl-preview-section">
<p>  Proj6也是yes的。</p>

</div>
<div class="cl-preview-section">
<h2>步骤三:编译make</h2>

</div>
<div class="cl-preview-section">
<pre><code>make -j4
</code></pre>
</div>
<div class="cl-preview-section">
<p>  开始编译:<br>  <img src="https://img-blog.csdnimg.cn/09991b0eb46346289b18335a838e6376.png"></p>

</div>
<div class="cl-preview-section">
<p>  这个gdal库编译,花费了一些时间。<br>  <img src="https://img-blog.csdnimg.cn/01691e85109542b3a34d50922a1a22dc.png"></p>

</div>
<div class="cl-preview-section">
<p>  编译完成后,继续一次make不带j的,确保都正确编译通过了。</p>

</div>
<div class="cl-preview-section">
<h2>步骤四:安装make install</h2>

</div>
<div class="cl-preview-section">
<p>  需要管理员权限安装</p>

</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token function">sudo <span class="token function">make <span class="token function">install
</span></span></span></code></pre>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/45aa4867dd6d4ffc997b52286cfb30e7.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤五:新建工程引入基础</h2>
</div>
<div class="cl-preview-section">
<p>  之前安装的都是安装到系统路径去了,所以此处先引入系统路径的库。<br>  <img src="https://img-blog.csdnimg.cn/47b6f3bad46c41b5adcd3faca6ff992a.png"></p>

</div>
<div class="cl-preview-section">
<p>  这里会有个错误:<br>  <img src="https://img-blog.csdnimg.cn/34d0a287b3a94a2da93ba88031d4a927.png"></p>

</div>
<div class="cl-preview-section">
<p>  是需要sudo ldconfig的,重新将库引入系统,再次编译运行如下:<br>  <img src="https://img-blog.csdnimg.cn/66b09d3856974c12acbbcfe6769ea79e.png"></p>

</div>
<div class="cl-preview-section">
<p>  成功打印出版本,这里因为是linux,还有一些依赖库,这v1.0.0版本的就是依赖系统include和lib的了(PS:后续会再次将库封入模块,但本次不做)。</p>

</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>编译PROJ6</h1>

</div>
<div class="cl-preview-section">
<h2>步骤一:下载解压</h2>

</div>
<div class="cl-preview-section">
<p>  下载地址:https://proj.org<br>  选择版本6.2.0<br>  下载后拷贝至虚拟机:</p>

</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token builtin class-name">cd ~/workl/src
<span class="token function">tar xfv proj-6.2.0.tar.gz
</span></span></code></pre>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/5da3571a713c4ef3bac0553be827af3c.png"></p>
</div>
<div class="cl-preview-section">
<h2>步骤二:配置configure</h2>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token builtin class-name">cd proj-6.2.0/
./configure
</span></code></pre>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/1446811873814b4cb298b9afc883a886.png"></p>
</div>
<div class="cl-preview-section">
<p>  配置成功:<br>  <img src="https://img-blog.csdnimg.cn/18072c8820e1449cbb1db0c249418b23.png"></p>

</div>
<div class="cl-preview-section">
<h2>步骤三:编译make</h2>

</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token function">make <span class="token parameter variable">-j4
</span></span></code></pre>
</div>
<div class="cl-preview-section">
<p>  开始编译:<br>  <img src="https://img-blog.csdnimg.cn/2b27ed4a809d4755bb5b3fa413985f65.png"></p>

</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/01104c6d1a9647f8baf88760e349f182.png"></p>

</div>
<div class="cl-preview-section">
<p>  编译完成后,继续一次make不带j的,确保都正确编译通过了。</p>

</div>
<div class="cl-preview-section">
<h2>步骤四:安装make install</h2>

</div>
<div class="cl-preview-section">
<p>  要使用管理员权限,不然安装失败,无法系统目录创建:</p>

</div>
<div class="cl-preview-section">
<pre><code class="prism language-shell"><span class="token function">sudo <span class="token function">make <span class="token function">install
</span></span></span></code></pre>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/f4fcb0c45292478e9dd52042c6f519e1.png"></p>
</div>
<div class="cl-preview-section">
<p>  测试,不需要ldconfig也可以依赖了,至此proj6库编译完成。</p>
</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>Demo模块化</h1>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/11db623ab4d647e38a538d58d85d8e6d.png"></p>
</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>Demo源码</h1>
</div>
<div class="cl-preview-section">
<h2>GDALManager.pri</h2>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-cpp">INCLUDEPATH <span class="token operator">+= $$PWD
DEPENDPATH <span class="token operator">+= $$PWD

HEADERS <span class="token operator">+= \
    $$PWD<span class="token operator">/GDALManager<span class="token punctuation">.h

SOURCES <span class="token operator">+= \
    $$PWD<span class="token operator">/GDALManager<span class="token punctuation">.cpp


win32 <span class="token punctuation">{

<span class="token punctuation">}<span class="token keyword">else <span class="token punctuation">{
    DEFINES <span class="token operator">+= LINUX
    <span class="token macro property"><span class="token directive-hash"># <span class="token expression">GDAL系统安装的默认路径位<span class="token operator">/usr<span class="token operator">/local
    # 系统库,头文件路径和库文件默认已包含
    LIBS <span class="token operator">+= <span class="token operator">-lgdal
<span class="token punctuation">}

win32 <span class="token punctuation">{

<span class="token punctuation">}<span class="token keyword">else <span class="token punctuation">{
    DEFINES <span class="token operator">+= LINUX
    <span class="token macro property"><span class="token directive-hash"># <span class="token expression">PROJ系统安装的默认路径位<span class="token operator">/usr<span class="token operator">/local
    # 系统库,头文件路径和库文件默认已包含
    LIBS <span class="token operator">+= <span class="token operator">-lproj
<span class="token punctuation">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<div class="cl-preview-section">
<h2>GDALManager.h</h2>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-cpp"><span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">ifndef <span class="token expression">GDALMANAGER_H
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">define <span class="token macro-name">GDALMANAGER_H

<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">include <span class="token string">&lt;QObject&gt;

<span class="token keyword">class <span class="token class-name">GDALManager <span class="token operator">: <span class="token base-clause"><span class="token keyword">public <span class="token class-name">QObject
<span class="token punctuation">{
    Q_OBJECT
<span class="token keyword">public<span class="token operator">:
    <span class="token keyword">explicit <span class="token function">GDALManager<span class="token punctuation">(QObject <span class="token operator">*parent <span class="token operator">= <span class="token number">0<span class="token punctuation">)<span class="token punctuation">;

signals<span class="token operator">:

<span class="token keyword">public<span class="token operator">:
    <span class="token keyword">static <span class="token keyword">void <span class="token function">testEnv<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;                     <span class="token comment">// v1.0.0 测试环境

<span class="token keyword">private<span class="token operator">:
<span class="token punctuation">}<span class="token punctuation">;

<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">endif <span class="token comment">// GDALMANAGER_H
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<div class="cl-preview-section">
<h2>GDALManager.cpp</h2>
</div>
<div class="cl-preview-section">
<pre><code class="prism language-cpp"><span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">include <span class="token string">"GDALManager.h"

<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">include <span class="token string">"gdal.h"

<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">include <span class="token string">&lt;QDebug&gt;
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">include <span class="token string">&lt;QDateTime&gt;
<span class="token comment">//#define LOG qDebug()&lt;&lt;__FILE__&lt;&lt;__LINE__
<span class="token comment">//#define LOG qDebug()&lt;&lt;__FILE__&lt;&lt;__LINE__&lt;&lt;__FUNCTION__
<span class="token comment">//#define LOG qDebug()&lt;&lt;__FILE__&lt;&lt;__LINE__&lt;&lt;QThread()::currentThread()
<span class="token comment">//#define LOG qDebug()&lt;&lt;__FILE__&lt;&lt;__LINE__&lt;&lt;QDateTime::currentDateTime().toString("yyyy-MM-dd")
<span class="token macro property"><span class="token directive-hash">#<span class="token directive keyword">define <span class="token macro-name">LOG <span class="token expression"><span class="token function">qDebug<span class="token punctuation">(<span class="token punctuation">)<span class="token operator">&lt;&lt;<span class="token constant">__FILE__<span class="token operator">&lt;&lt;<span class="token constant">__LINE__<span class="token operator">&lt;&lt;<span class="token class-name">QDateTime<span class="token double-colon punctuation">::<span class="token function">currentDateTime<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">.<span class="token function">toString<span class="token punctuation">(<span class="token string">"yyyy-MM-dd hh:mm:ss:zzz"<span class="token expression"><span class="token punctuation">)

<span class="token class-name">GDALManager<span class="token double-colon punctuation">::<span class="token function">GDALManager<span class="token punctuation">(QObject <span class="token operator">*parent<span class="token punctuation">)
    <span class="token operator">: <span class="token function">QObject<span class="token punctuation">(parent<span class="token punctuation">)
<span class="token punctuation">{
    <span class="token comment">// 注册所有驱动
    <span class="token function">GDALAllRegister<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;
<span class="token punctuation">}

<span class="token keyword">void <span class="token class-name">GDALManager<span class="token double-colon punctuation">::<span class="token function">testEnv<span class="token punctuation">(<span class="token punctuation">)
<span class="token punctuation">{
    QString version <span class="token operator">= <span class="token function">QString<span class="token punctuation">(<span class="token function">GDALVersionInfo<span class="token punctuation">(<span class="token string">"RELEASE_NAME"<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">;
    LOG <span class="token operator">&lt;&lt; version<span class="token punctuation">;
<span class="token punctuation">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<div class="cl-preview-section">&nbsp;</div>
<div class="cl-preview-section">
<h1>Demo工程模板v1.0.0</h1>
</div>
<div class="cl-preview-section">
<p>  <img src="https://img-blog.csdnimg.cn/ec1b5326184b4106b664429d6100b525.png"></p>
</div><br><br>
来源:https://www.cnblogs.com/qq21497936/p/17565273.html
頁: [1]
查看完整版本: 麒麟系统开发笔记(十二):在国产麒麟系统上编译GDAL库、搭建基础开发环境和基础Demo