查看: 2633|回复: 0

[Android教程] ArcGIS Runtime For Android 开发 (6)

发表于 2018-1-30 08:00:01
第六课 空间数据的保存及数据显示

本次课程的主要内容有:

通用方式存储 WKT数据存储

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

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

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

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

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

  1. var GeomText:String
  2. var jsonFactory = JsonFactory()
  3. val jsonParser = jsonFactory.createJsonParser(GeomText)
  4. var mapgeom=GeometryEngine.jsonToGeometry(jsonParser)
  5. //注意,这里得到的是一个MapGeometry对象,需要转换一下
  6. var geom=mapgeom.geometry
  7. var graphic=Graphic(geom,symbole)
  8. graphicsLayer.addGraphic(graphic)
复制代码

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

2.WKT数据存储

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

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

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

  1. INSERT INTO MyTable2 (name, geom)
  2. VALUES ('one',
  3. GeomFromText('POLYGON((554000 4692000, 770000 4692000,770000 4925000, 554000 4925000,554000 4692000))'));
  4. //**使用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上。



回复

使用道具 举报