gpt4 book ai didi

android - 如何在 Android 上使用 Spatialite 和 Xamarin

转载 作者:IT王子 更新时间:2023-10-29 06:23:48 24 4
gpt4 key购买 nike

我想在 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 排除在外。如果您知道这方面的好工具,也请告诉我。

  1. 为 Xamarin 创建 .jar 绑定(bind)项目,将其添加到与您的 Android 项目相同的解决方案
  2. 将 jsqlite.jar 添加到 bindings 项目的 Jars 文件夹中。从这里获取:jsqlite.jar
  3. 将 native 库二进制文件(libjsqlite.so 和 libproj.so)添加到您的应用程序 项目,为此创建文件夹 libs/armeabi。从 Nutiteq AdvancedMap3D project 获取这些
  4. 定义.so文件为AndroidNativeLibrary,并设置Copy to Output Directory
  5. 修复绑定(bind)定义以消除构建错误。将以下内容添加到绑定(bind)项目的 Transforms/Metadata.xml:
<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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com