本次课程的主要内容有:
- 通用方式存储
- 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上。