当前位置: 首页 > 工具软件 > SpatiaLite > 使用案例 >

spatialite android,spatialite for android 编译

陈飞语
2023-12-01

背景:spatialite for

android一般网上都有编译好的so库,但是使用的时候发现确实split等函数,这些函数需要LWGEOM库的支持,故需要重新编译,但编译时报错,所以就花了很长的时间来解决这个问题。

其他函数还有:MakeValid、MakeValidDiscarded、Segmentize等,网址如下:

http://www.gaia-gis.it/gaia-sins/spatialite-sql-4.2.0.html

上一篇文章分析了原因,这一篇文章提出解决办法。

我在Spatialite

Users论坛中发了一个帖子,非常幸运,作者很快就回复了,虽然没有说具体操作,但是可以尝试一下。

作者意思liblwgeom是一个单独的模块,在PostGIS中,所以就从网上下了PostGIS-2.1.6的源码,不出意料,其中有一个专门的文件夹,名称叫“liblwgeom”。

今天下午刚编译成功,且测试成果,所以趁热打铁,赶快做好笔记,以免后面忘记。

1、我将PostGIS源码下liblwgeom这个文件夹拷贝到...\SpatialiteAndroid\jni\libspatialite-4.2.1\src\gaiageo文件夹中

备注:还有一个sqldefines.h文件也需要拷贝进来,修改后的sqldefines.h内容如下:

#define

POSTGIS_SVN_REVISION 13384 //新增加的,将#include。。。svn。那部分干掉,本身内容就少,所以没有必要咯。

2、分析..\SpatialiteAndroid\jni\Android.mk文件,它包含的spatialite的mk文件部分为:include

$(LOCAL_PATH)/spatialite-4.2.1.mk

3、打开..\SpatialiteAndroid\jni\spatialite-4.2.1.mk文件

进行尝试性的添加,就是缺什么函数,然后在liblwgeom中搜索,搜索到后将c文件放进spatialite-4.2.1.mk文件中,并注意先后顺序,按照此方法修改后的spatialite-4.2.1.mk文件部分如下:

... ...

$(SPATIALITE_PATH)/src/gaiageo/gg_kml.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/g_util.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwcircstring.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwsegmentize.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwcurvepoly.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwcompound.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/measures.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwalgorithm.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/g_box.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwpoint.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwmpoint.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwline.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwpoly.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwmpoly.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwcollection.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwgeom_geos_clean.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwgeom_api.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/ptarray.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/vsprintf.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwutil.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwtriangle.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/stringbuffer.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwout_wkt.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwspheroid.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwgeodetic.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwtin.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwpsurface.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwmpoly.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwgeom.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwmline.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwgeom_geos.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwgeom_geos_split.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwout_x3d.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/lwgeom_geos_node.c

\

$(SPATIALITE_PATH)/src/gaiageo/liblwgeom/measures3d.c

\ $(SPATIALITE_PATH)/src/gaiageo/gg_lwgeom.c

\

... ...

红色部分是新增内容

4、在libspatialite-4.2.1文件夹下,修改了config.h和config-msvc.h,修改内容如下:

... ...

#define ENABLE_LWGEOM

1

... ...

#define HAVE_LIBLWGEOM_H

1

... ...

5、修改liblwgeom文件夹下的一些头文件,将

#include

"../postgis_config.h" 注释掉

//#include

"../postgis_config.h"

6、进入cygwin,我的整个文件路径未:D:\SpatialiteAndroid\jni

依次输入命令:

cd

/cygdriver/d/spatialiteandroid/jni

ndk-build

-j8

即可实现编译

7、我的NDK版本为F:\Soft\android-ndk-r8e,并且将此路径放在环境变量Path中,那么就可以直接使用ndk-build

-j8命令了。

 类似资料: