- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想在 Android 上使用 Spatialite 而不是带有 Xamarin 的普通 SQLite 来管理和显示地理数据。内置 SQLite 不允许加载扩展。我该怎么做?
最佳答案
简短回答:您需要使用自己定制的 SQLite 作为 Android native 库,就像其他 NDK 库一样。棘手的部分是为数据库获取有用的 C# API。 Xamarin 文档似乎只有非常简单的单一方法 API 的指南。
由于我对 Java 比 .Net 更熟悉,所以我结合使用了 Android Java 库 (.jar) 和 Android native 库 (.so)。 Android Java 库已经为数据库提供了 Java API 包装器,它与可以在通常的 Android Java 应用程序中使用的包装器完全相同。当然,从技术上讲,从 C# 直接访问 native 库也是可能的,因此可以将 java/jar 排除在外。如果您知道这方面的好工具,也请告诉我。
<remove-node path="/api/package[@name='jsqlite']/class[@name='Backup']/field[@name='handle']" />
<remove-node path="/api/package[@name='jsqlite']/class[@name='Database']/field[@name='handle']"/>
<attr path="/api/package[@name='jsqlite']" name="managedName">jsqlite</attr>
这应该会为您生成适用于 bundle SQLite 的 C# API,以及 Spatialite、Proj.4 和 GEOS included。 jsqlite DB API 本身与其他 C# SQLite API 不同,需要使用回调类。请参阅以下示例检查模块的版本:
try {
db.Open ("/sdcard/mapxt/estonia-latest-map.sqlite", Constants.SqliteOpenReadonly);
// show versions to verify that modules are there
db.Exec ("SELECT spatialite_version(), proj4_version(), geos_version(), sqlite_version()", new GeneralQryResult ());
} catch (jsqlite.Exception ex) {
Log.Error( ex.LocalizedMessage );
}
...
// prints query results as text
public class GeneralQryResult : Java.Lang.Object, ICallback
{
public bool Newrow (string[] rowdata)
{
string row = "";
foreach (var data in rowdata) {
row += data + " | ";
}
Log.Info(row);
return false;
}
public void Types (string[] types)
{
// never called really
}
public void Columns (string[] cols){
Log.Debug ("Query result:");
string row = "";
foreach (var col in cols) {
row += col + " | ";
}
Log.Info (row);
}
}
现在终于可以查询真实空间数据了,使用 Nutiteq 3D Maps SDK for Xamarin可视化它:
// Spatialite query, show results on map
// 1. create style and layer for data
LineStyle.Builder lineStyleBuilder = new LineStyle.Builder ();
lineStyleBuilder.SetColor (NutiteqComponents.Color.Argb(0xff, 0x5C, 0x40, 0x33)); //brown
lineStyleBuilder.SetWidth (0.05f);
LineStyle lineStyle = lineStyleBuilder.Build ();
GeometryLayer geomLayer = new GeometryLayer (view.Layers.BaseLayer.Projection);
view.Layers.AddLayer (geomLayer);
// 2. do the query, pass results to the layer
Database db = new Database ();
try {
db.Open ("/sdcard/mapxt/estonia-latest-map.sqlite", Constants.SqliteOpenReadonly);
// spatial query. Limit to 1000 objects to avoid layer overloading
String qry = "SELECT id, HEX(AsBinary(Transform(geometry,3857))), sub_type, name FROM ln_railway LIMIT 1000";
db.Exec (qry, new SpatialQryResult (geomLayer, lineStyle));
} catch (jsqlite.Exception ex) {
Log.Error( ex.LocalizedMessage );
}
...
// adds query results to given layer, with given style
public class SpatialQryResult : Java.Lang.Object, ICallback
{
GeometryLayer _geomLayer;
Style _geomStyle;
public SpatialQryResult(GeometryLayer geomLayer, Style geomStyle){
_geomLayer = geomLayer;
_geomStyle = geomStyle;
}
public bool Newrow (string[] rowdata)
{
string id = rowdata [0];
string geomHex = rowdata [1];
string type = rowdata [2];
string name = rowdata [3];
Label label;
if (name != null && name.Length > 1) {
label = new DefaultLabel (name, type);
} else {
label = null;
}
Geometry[] lineGeoms = WkbRead.ReadWkb(new ByteArrayInputStream(Utils
.HexStringToByteArray(geomHex)), rowdata);
// following fails if not Line, change for other geometries
foreach (Line lineGeom in lineGeoms) {
_geomLayer.Add(new Line(lineGeom.VertexList, label, (LineStyle)_geomStyle, _geomLayer));
}
return false;
}
}
关于android - 如何在 Android 上使用 Spatialite 和 Xamarin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20419390/
我有以下查询: select distance(GeomFromText('POINT(8 49)',4326),GeomFromText('LINESTRING(8.329969 49.919323
我为此苦苦挣扎了几天,我不知道为什么查询是错误的..我想找到给定纬度/经度的最近点。 SELECT rid,DISTANCE(geometry, MakePoint(-79.91759, 43.266
我的 models.py 具有包含此字段的用户和业务模型: location = PointField(geography=True) 我通过地理编码服务从用户指定的地址获取 Google map 坐
我正在使用来自 Gaia-SINS 的 SpatiaLite for Android使用 this tutorial . 我设法创建了空间数据库,并且运行良好。但是我无法获得以米为单位的点(或任何其他
我正在尝试构建一个带有 spatialite 扩展的 sqlite 副本。我看过 one或 two网上相关的帖子都和这个问题有关,但是好像没有一个人一路走下去。 我已经下载了 spatialite a
我正在尝试使用 System.Data.SQLite 提供程序从 C# 访问 SpatiaLite。当我尝试加载 SpatiaLite 扩展时,我总是得到 System.Data.SQLite.SQL
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭去年。 Improve this quest
Spatialite有能力用它的 Distance() 计算 2 个几何之间的距离功能。还有其他functions适用于 LINESTRING。但是我不知道它返回的单位是什么。是米吗?如果我有 2 个
我想找到距离给定坐标最近的节点。我检查了这个 https://gis.stackexchange.com/questions/186783/how-to-get-the-long-lat-inform
我在 QGIS-user forum 上发布了这个问题但这可能太技术性了,因此我也捕获机会在这里尝试一下。 我的计划是有一个 QGIS 插件来读取和绘制与矢量图层中选定点对应的时间序列数据(这些点代表
我正在查看 tutorial for Spatialite-Android ,我注意到以下代码示例: String query = "SELECT AsText(Transform(MakePoint
我对 spatialite 很陌生。我在 Max OS Mountain lion 上运行,我已经安装了 SQLite 版本 3.7.17 和 libspatialite 4.1.1(使用自制软件)
根据 https://docs.djangoproject.com/en/1.3/ref/contrib/gis/db-api/ , Spatialite 支持 GeoQuerySet.distanc
我正在通过来自空间表的SQL查询创建一个新表: CREATE TABLE SomeShapes AS SELECT ash.id, ash.Geometry FROM AllShapes ash WH
我可能需要经验丰富的 Unix 用户的帮助。据我了解,mapnik 库默认只使用通用的 sqlite3 库。虽然 mapnik 支持空间 sqlite 数据库,但 spatialite 必须是 sql
最近在研究spatialite,我可以把二维数据(像这样:POINT(1 1))写入空间数据表,但是我不能写3D数据(像这样:POINT(1 1 1))到空间数据表中。 谁能告诉我spatialite
我关注了this link安装 Spatialite。 如何在我的 Java 代码中使用 spatialite 安装?我为 spatialite 函数加载哪个扩展 addGeometry()(Linu
是否可以使用 Entity Framework 对 geom 数据类型执行 sqlite 相交查询? 我在下面的 SQLiteConnection 上取得了成功(在加载 'libspatialite-
我在构建现有项目时遇到了一些麻烦: http://code.google.com/p/spatialite-android/ 我正在使用 Win7 和 Cygwin 我通过使用“GIT for Win
首先,如果我要使用其他协议(protocol)来引用另一个线程/帖子,请原谅并指出。 之前有一个话题how to compile spatialite for iOS其中最佳答案部分描述了将 spat
我是一名优秀的程序员,十分优秀!