如何在Android上的Xamarin中使用Spatialite

贾克

我想在Android上的Xamarin中使用Spatialite而不是普通的SQLite来管理和显示地理数据。内置的SQLite不允许加载扩展。我该怎么做?

贾克

简短答案:您需要像其他NDK库一样使用自己的自定义SQLite作为Android本机库。棘手的部分是获得有用的而不是琐碎的C#API。Xamarin文档似乎仅具有非常简单的单方法API的指南。

由于我对Java的熟悉程度远超过.Net,因此我使用了Android Java库(.jar)和Android本机库(.so)的组合。Android Java库已经为数据库提供了Java API包装器,它与通常的Android Java应用程序中使用的包装器完全相同。当然,从C#技术上直接访问本机库也是可能的,因此可以将Java / jar从故事中排除。如果您知道用于此目的的好的工具,也请告诉我。

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

这将为您生成绑定捆绑的SQLite的有效C#API,以及Spatialite,Proj.4和GEOSjsqlite 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);
    }
}

最后,现在使用Xamarin的Nutiteq 3D Maps SDK可视化真实的空间数据

// 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;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Spatialite Android中使用准备好的语句?

来自分类Dev

如何在Xamarin Android中使用RunOnUIThread()

来自分类Dev

如何在Xamarin Android中使用RunOnUIThread()

来自分类Dev

如何在Xamarin Android中使用NLog

来自分类Dev

如何在Xamarin.Android中使用SharedPreferences?

来自分类Dev

如何在Xamarin Forms PCL中使用本机Android ImageView?

来自分类Dev

如何在Xamarin Android应用程序中使用动画?

来自分类Dev

如何在Xamarin中使用Android的内部存储?

来自分类Dev

如何在Xamarin.Forms中使用Android控件

来自分类Dev

如何在Xamarin.Android中使用Value Animator?

来自分类Dev

如何在Xamarin.Android中使用NFC发送消息?

来自分类Dev

如何在Xamarin.Android中使用MPAndroidChart的ValueFormatter

来自分类Dev

如何在 xamarin Android 中使用 netstandard 2.1?

来自分类Dev

如何在Android上使用Xamarin中的ScrollView

来自分类Dev

如何在Xamarin上使用本机Android XML?

来自分类Dev

如何在 Android 上的 Spinner 中使用 itemClickListener

来自分类Dev

如何在Xamarin iOS中使用applicationDidBecomeActive?

来自分类Dev

如何在Xamarin中使用SignalR

来自分类Dev

如何在xamarin中使用OnPageScrollStateChanged

来自分类Dev

如何在Xamarin中使用Hash SHA

来自分类Dev

Xamarin Android:如何在 Canvas 上绘图

来自分类Dev

如何在Xamarin.Android和Xamarin.iOS上使用dllmap?

来自分类Dev

如何在Xamarin.Android/Monodroid中使用Android KitKat EvaluateJavascript并检索结果?

来自分类Dev

如何在Xamarin.Android/Monodroid中使用Android KitKat EvaluateJavascript并检索结果?

来自分类Dev

如何在Xamarin.Android中使用mipmap文件夹?

来自分类Dev

如何在Xamarin.android中使用oxyplot创建甜甜圈图?

来自分类Dev

如何在Xamarin.Android中使用自定义字体?

来自分类Dev

如何在我的Xamarin Android应用程序中使用SharpNLP

来自分类Dev

如何在Xamarin.Android中使用C#查找到所选图像的文件路径?

Related 相关文章

  1. 1

    如何在Spatialite Android中使用准备好的语句?

  2. 2

    如何在Xamarin Android中使用RunOnUIThread()

  3. 3

    如何在Xamarin Android中使用RunOnUIThread()

  4. 4

    如何在Xamarin Android中使用NLog

  5. 5

    如何在Xamarin.Android中使用SharedPreferences?

  6. 6

    如何在Xamarin Forms PCL中使用本机Android ImageView?

  7. 7

    如何在Xamarin Android应用程序中使用动画?

  8. 8

    如何在Xamarin中使用Android的内部存储?

  9. 9

    如何在Xamarin.Forms中使用Android控件

  10. 10

    如何在Xamarin.Android中使用Value Animator?

  11. 11

    如何在Xamarin.Android中使用NFC发送消息?

  12. 12

    如何在Xamarin.Android中使用MPAndroidChart的ValueFormatter

  13. 13

    如何在 xamarin Android 中使用 netstandard 2.1?

  14. 14

    如何在Android上使用Xamarin中的ScrollView

  15. 15

    如何在Xamarin上使用本机Android XML?

  16. 16

    如何在 Android 上的 Spinner 中使用 itemClickListener

  17. 17

    如何在Xamarin iOS中使用applicationDidBecomeActive?

  18. 18

    如何在Xamarin中使用SignalR

  19. 19

    如何在xamarin中使用OnPageScrollStateChanged

  20. 20

    如何在Xamarin中使用Hash SHA

  21. 21

    Xamarin Android:如何在 Canvas 上绘图

  22. 22

    如何在Xamarin.Android和Xamarin.iOS上使用dllmap?

  23. 23

    如何在Xamarin.Android/Monodroid中使用Android KitKat EvaluateJavascript并检索结果?

  24. 24

    如何在Xamarin.Android/Monodroid中使用Android KitKat EvaluateJavascript并检索结果?

  25. 25

    如何在Xamarin.Android中使用mipmap文件夹?

  26. 26

    如何在Xamarin.android中使用oxyplot创建甜甜圈图?

  27. 27

    如何在Xamarin.Android中使用自定义字体?

  28. 28

    如何在我的Xamarin Android应用程序中使用SharpNLP

  29. 29

    如何在Xamarin.Android中使用C#查找到所选图像的文件路径?

热门标签

归档