背景: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命令了。