简介
spatialite本身基于SQLite 3、PROJ.4、GEOS、FreeXL等开源项目,支持对空间数据的处理,可以做数据的投影转换等,功能强大。
官网地址:http://www.gaia-gis.it/gaia-sins/
下载sptialite for android: https://www.gaia-gis.it/fossil/libspatialite/wiki?name=splite-android
同时官网上可以下载数据库链接工具:sptialite_gui 官网下载

实例
下面新建一个对Spatialite for android 的实例,实现新建或创建一个数据库,创建表,增加空间字段Geometry,插入空间数据等。

1 导入库,包括libs:the native spatialite libraries
libspatialite.so: for different platforms that hold the main library
jsqlite:the basic API classes
下载地址:http://www.gaia-gis.it/gaia-sins/spatialite-android/spatialite-for-android-3.0.1.zip
jts包: compile ‘com.vividsolutions:jts-core:1.14.0’

2 创建一个专门处理数据库的类


package com.yulintu.spatialiteforandroid;


import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.PrecisionModel;
import com.vividsolutions.jts.geom.impl.CoordinateArraySequenceFactory;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import jsqlite.Database;
import jsqlite.Exception;
import jsqlite.Stmt;


public class SpatialiteHelper {

    Database db;
    StringBuffer sb = new StringBuffer();
    private int Id = 0;
    int srid = 4326;

    //打开或创建数据库
    public Database openOrCreateDatabase(String dbPath) {
        if (StringUtils.isBlank(dbPath)) {
            return null;
        }
        try {
            db = new jsqlite.Database();
            db.open(dbPath, jsqlite.Constants.SQLITE_OPEN_READWRITE
                    | jsqlite.Constants.SQLITE_OPEN_CREATE);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return db;
    }

    //查询数据库版本
    public String queryVerson() throws Exception {
        if (db == null || sb == null)
            return null;
        Stmt stmt = db.prepare("SELECT spatialite_version();");
        if (stmt.step()) {
            sb.append("spatialite_version:" + stmt.column_string(0));
            sb.append("\n");
        }
        stmt = db.prepare("SELECT proj4_version();");
        if (stmt.step()) {
            sb.append("proj4_version:" + stmt.column_string(0));
            sb.append("\n");
        }
        stmt = db.prepare("SELECT geos_version();");
        if (stmt.step()) {
            sb.append("geos_version:" + stmt.column_string(0));
            sb.append("\n");
        }
        stmt.close();
        return sb.toString();
    }

    //初始化空间元数据
    public String initSpatialMetaData() throws Exception {
        if (db == null)
            return sb.toString();
        Stmt stmt = db.prepare("select InitSpatialMetaData(1)");
        while (stmt.step()) {
            String nomeStr = "InitSpatialMetaData():" + stmt.column_string(0);
            sb.append("\n").append(nomeStr).append("\n");
        }
        stmt.close();
        return sb.toString();
    }

    //检查是空间元数据是否创建成功
    public boolean checkSpatialMetaData() throws Exception {
        if (db == null)
            return false;
        Stmt stmt = db.prepare("select checkSpatialMetaData()");
        int flag = 0;
        if (stmt.step()) {
            flag = stmt.column_int(0);
        }
        stmt.close();
        return flag == 1;
    }

    //创建表
    public String createTable(final String tableName, Map<String, String> fields) throws Exception {
        if (db == null)
            return sb.toString();
        StringBuilder sql = new StringBuilder("CREATE TABLE " + tableName);
        sql.append("(");
        int i = 0;
        for (Map.Entry<? extends Object, String> entry : fields.entrySet()) {
            sql.append(entry.getKey());
            sql.append(" ");
            sql.append(entry.getValue());
            if (i == fields.size() - 1)
                break;
            sql.append(",");
            i++;
        }
        sql.append(");");
        db.spatialite_create();
        db.exec(sql.toString(), null);
        return sb.toString();
    }

    //列出所有表
    public String listTable() throws Exception {
        if (db == null || sb == null)
            return null;
        Stmt stmt = db.prepare("SELECT name,rootpage,sql FROM sqlite_master WHERE type='table' order by name");
        while (stmt.step()) {
            String nomeStr = stmt.column_string(0);
            sb.append("\t").append(nomeStr).append("\n");
            String rootpage = stmt.column_string(1);
            sb.append("\t").append(rootpage).append("\n");
            String sql = stmt.column_string(2);
            sb.append("\t").append(sql).append("\n");
        }
        stmt.close();
        getFields("person");
        return sb.toString();
    }

    //查询表的记录
    public String query(String tableName) throws Exception {
        if (db == null || sb == null)
            return null;
        Stmt stmt = db.prepare("SELECT Id,username,AsText(shape) FROM " + tableName);
        while (stmt.step()) {
            String Id = stmt.column_string(0);
            sb.append("\t").append(Id).append("\n");
            String name = stmt.column_string(1);
            sb.append("\t").append(name).append("\n");
            String shape = stmt.column_string(2);
            sb.append("\t").append(shape).append("\n");
        }
        stmt.close();
        return sb.toString();
    }

    //为表添加一个空间字段
    public String AddGeometryColumn(String tableName, String column) throws Exception {
        if (db == null || sb == null)
            return sb.toString();
        String sql = "select AddGeometryColumn('" + tableName + "','" + column + "',4326,'GEOMETRY')";
        Stmt stmt = db.prepare(sql);
        int flag = 0;
        if (stmt.step()) {
            flag = stmt.column_int(0);
            if (flag == 1) {
                createSpatialIndex(tableName, column);
            }
        }
        stmt.close();
        sb.append("AddGeometryColumn " + column + ":" + flag);
        return sb.toString();
    }

    //创建索引
    public String createSpatialIndex(final String tableName, String column) throws Exception {
        if (db == null || sb == null)
            return sb.toString();
        String sql = "SELECT CreateSpatialIndex('" + tableName + "', '" + column + "');";
        Stmt stmt=db.prepare(sql);
        int flag=0;
        if(stmt.step()){
            flag=stmt.column_int(0);
        }
        sb.append("\nCreateSpatialIndex+"+flag);
        return sb.toString();
    }

    //插入一条数据
    public String insertData(String tableName) throws Exception {
        if (db == null)
            return sb.toString();
        GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), srid,
                CoordinateArraySequenceFactory.instance());
        Coordinate coord = new Coordinate(109.013388, 32.715519);
        Point p = geometryFactory.createPoint(coord);
        String sql = "INSERT INTO " + tableName + " (Id,username,password,shape) values ("+Id+",'chen','123456',GeomFromText('"+p+"',4326))";
        db.exec(sql,null);
        long l=db.changes();
        sb.append("\nINSERT :" + l);
        return sb.toString();
    }

    //删除表
    public String dropTable(String tableName) throws Exception {
        if (db == null)
            return sb.toString();
        String sql = " DROP TABLE " + tableName;
        db.exec(sql,null);
        sb.append("\nDROP TABLE " );
        return sb.toString();
    }

    public List<SQLiteFieldInfo> getFields(String tableName) throws Exception {
        if (db == null)
            return null;
        String sql = "PRAGMA table_info(" + tableName + ")";
        Stmt stmt = db.prepare(sql);
        List<SQLiteFieldInfo> list = new ArrayList<>();
        while (stmt.step()) {
            int index = stmt.column_int(0);
            String name = stmt.column_string(1);
            String type = stmt.column_string(2);
            int notnull = stmt.column_int(3);
            Object column = stmt.column(4);
            int key = stmt.column_int(5);
            SQLiteFieldInfo sqLiteFieldInfo = new SQLiteFieldInfo(index, name, type, notnull, column, key);
            list.add(sqLiteFieldInfo);
        }
        return list;
    }

    //关闭库
    public void close() {
        if (db != null) {
            try {
                db.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


}


3 调用该类方法实现空间数据库的创建初始化等。

package com.yulintu.spatialiteforandroid;

import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import com.yulintu.spatialiteforandroid.databinding.ActivityMainBinding;

import java.util.HashMap;
import java.util.Map;

import jsqlite.Database;
import jsqlite.Exception;

public class MainActivity extends AppCompatActivity {

    ActivityMainBinding bind;
    MainViewModel mainViewModel;
    final SpatialiteHelper helper = new SpatialiteHelper();
    String tableName = "person";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bind = DataBindingUtil.setContentView(this, R.layout.activity_main);
        mainViewModel = new MainViewModel();
        bind.setModel(mainViewModel);
        String dataBasePath = FileUtil.getDataBasePath("123.sqlite");
        Database db = helper.openOrCreateDatabase(dataBasePath);
        String s = null;
        try {
            s = helper.queryVerson();
            mainViewModel.setResult(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
        bind.initMetaData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    mainViewModel.setResult(helper.initSpatialMetaData());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        bind.createTable.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Map<String, String> feilds = new HashMap<String, String>();
                feilds.put("tableName",tableName);
                feilds.put("Id", "INT PRIMARY KEY NOT NULL");
                feilds.put("username", "CHAR(50)");
                feilds.put("password", "CHAR(50)");
                try {
                    mainViewModel.setResult(helper.createTable(feilds));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        bind.listTable.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    mainViewModel.setResult(helper.listTable());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        bind.query.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    mainViewModel.setResult(helper.query(tableName));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        bind.addShape.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    mainViewModel.setResult(helper.AddGeometryColumn(tableName, "shape"));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        bind.insertData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    mainViewModel.setResult(helper.insertData(tableName));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        helper.close();
    }
}

更多推荐