spatialite编译使用
零、前言
sqlite本身不支持空间索引,只支持数据存储,spatialite库是对sqlite的扩展,可以对sqlite中存储的坐标进行读写操作,本文就是结合自己的使用过程总结而成,希望能够对你有所帮助。
一、安装依赖库
我这里的编译环境是ubuntu18.04下面的在线编译,spatialite所有的依赖库都是采用在线的方式进行安装,spatialite的依赖库包括:sqlite3、proj、freexl、xml2、iconv、lzma、geos、minizip等。
安装依赖库指令:sudo apt install libsqlite3-dev libproj-dev libfreexl-dev libxml2-dev libiconv-hook-dev liblzma-dev libgeos-dev libmini zip-dev -y
二、编译spatialite库
spatialite源码下载地址:http://www.gaia-gis.it/gaia-sins/libspatialite-sources/
解压源码后进入源码里面编译:
./configure --disable-rttopo --disable-gcp --enable-static=yes CXXFLAGS=-fPIC CFLAGS=-fPIC
make -jnproc
sudo make install
三、spatialite库使用
spatialite库的使用可以直接参考源码下面的example进行学习。有些代码直接改把改把就能用。下面的代码就是结合源码中的样例,直接封装的,其他库的学习,其实也是同样的道理,官方的样例最详细、最好用。
#include "sqlite3.h" // 必须把sqlite3.h放在spatialite.h前面
#include "spatialite/gaiageo.h"
#include "spatialite/gg_const.h"
#include "spatialite.h"
#include <vector>
#include <iostream>
#include <string>
using namespace std;
struct PointD
{
double x = 0.;
double y = 0.;
double z = 0.;
};
// 这个函数演示spatialite读取数据库中坐标的方法
void getGeometryPoints(std::vector<PointD> &points, sqlite3_stmt *stmt, int index)
{
u_char *pBolb = (u_char *)sqlite3_column_blob(stmt, index);
if (pBolb != nullptr)
{
int count = sqlite3_column_bytes(stmt, index);
gaiaGeomCollPtr geo