为了账号安全,请及时绑定邮箱和手机立即绑定

ArcGIS Runtime For Android 开发 (6)

标签:
Android
第六课 空间数据的保存及数据显示

本次课程的主要内容有:

  • 通用方式存储
  • WKT数据存储

1.通用方式存储要素数据
这里说的通用方式存储要素数据,指的是不使用第三方类库来实现的数据存储方式,其原理是将一个Geometry转换为JSON字符串存储再Sqlite数据库中。

ArcGIS Runtime 10.2.9版本中,ESRI给我们提供了一个Geometey转换为JSON数据的接口,我们使用这个接口将Geometry转换为JSON字符串写入到数据库中。

下面是数据保存代码(kotlin):

   var geom:Geometry//绘制完成的Geometry
   var geomText=GeometryEngine.geometryToJson(mapView.spatialReference,geom)
……
   var cnv =ContentValues()
   cnv.put("GEOID",UUID) //GEOID 图形编号
   cnv.put("RecordTime",RecordTime)//采集时间
   cnv.put("Geometry", geomText)//图形
   var db=SQLiteDatabase.openDatabase(dbFile, null, SQLiteDatabase.OPEN_READWRITE)    
   var res = db!!.insert(tabName, nullColumnHack, cv)

当下次要再地图上查看的时候,将数据从数据库中查询然后绘制再GraphicsLayer上显示:

var GeomText:String

var jsonFactory = JsonFactory()
val jsonParser = jsonFactory.createJsonParser(GeomText)
var mapgeom=GeometryEngine.jsonToGeometry(jsonParser)
//注意,这里得到的是一个MapGeometry对象,需要转换一下
var geom=mapgeom.geometry
var graphic=Graphic(geom,symbole)
graphicsLayer.addGraphic(graphic)

缺点:采取这种方式存储的时候,在数据库中不能够实现想要的空间分析及查询
优点:存储方便,简单易用

2.WKT数据存储

WKT我再这里就不多说了,如果你想了解更多的请自行百度或者google吧。

如果有需要在数据库中进行数据的空间分析及空间查询的话,那么就有必要使用spatialite的库来进行空间数据的操作了。spatialite库包含一个jar包和与之对应的so库文件。将jar包复制到你的库文件夹下面,将so库复制项目的jniLibs文件夹下(注意选择:armeabi、armeabi-v7a、x86)。

采集或者绘制完成的时候,会得到一个Geometry,但是我们在使用WKT向数据库存储的时候,使用的是一系列的点坐标按照WKT格式构建的插入字符串。如果是已经有记录的点集合,可以直接使用点集合构建插入字符串。在插入的时候,需要使用GeomFromText()函数在数据库中创建要素对象。

INSERT INTO MyTable2 (name, geom) 
VALUES ('one', 
GeomFromText('POLYGON((554000 4692000, 770000 4692000,770000 4925000, 554000 4925000,554000 4692000))'));
//**使用GeomFromText来创建一个几何图形,然后存储到数据库,注意里边的格式:几何类型((x y)),如果是点的话则是几何类型(x y);注意,如果没有创建触发器,直接使用GeomFromText就能够将数据存储到数据库中,但是如果创建了触发器,那么GeomFromText有两个参数,要特别注意,GeomFromText("图形类型(坐标)",空间参考代码)  就为后边的空间参考代码**

从数据库中查询数据使用:SELECT name, AsText(geom) FROM Table
可以参考网址:http://www.gaia-gis.it/gaia-sins/spatialite-tutorial-2.3.1.html

使用图形查询图形
SELECT AsText(Geometry) FROM Table WHERE MbrWithIn(Geometry, BuildMbr(102.49141036093958,24.904292307255247,102.49141036093958,24.904292307255247));//图形在图形内
SELECT AsText(Geometry) FROM IllegalInfo
WHERE MbrContains(Geometry, BuildMbr(102.49141036093958,24.904292307255247,102.49141036093958,24.904292307255247));//图形包含图形
SELECT AsText(Geometry) FROM IllegalInfo
WHERE MbrIntersects(Geometry, BuildMbr(102.49141036093958,24.904292307255247,102.49141036093958,24.904292307255247));//图形与图形相交
如果是点,请将两个坐标设置为相同数值
同时,可以使用Buffer返回一个缓冲的集合对象。

同样的,从数据库中获取结果有两种,wkt的字符串表示的集合对象及而二进制表示的对象,我们都得将这些数据转换成Geometry然后绘制到graphicslayer上。

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消