Geopackage:怎么让ArcGIS for Android SDK Geopackage 支持WGS84以外的坐标系


特别说明:使用的SDK版本是“arcgis-android:10.2.8-1”,ArcGIS SDK API

在GIS移动开发方面,我还是选择了ESRI的产品,始终觉得它的东西更可靠一点,而且在实践当中我也发现它更灵活一些。

2013年我开始使用ArcGIS for Android SDK给公司做一些项目,当时的SDK基本不支持离线矢量数据,于是自己写了加载ShapeFile的类,结果发现效率是个问题。最终只好自己定义了一种结构把数据存储在Sqlite中,效率基本满足要求,BUT!还是有些局限。

最近我发现了OGC的Geopackage,这个数据结构不错,可以存矢量也可以存栅格,矢量数据使用了RTree索引,空间查询速度很快,如果用它来做离线数据包,我以为是完美的,于是就有了下文了。

一开时我没有细看它的API,做了一些数据,从几k条数据到几w条数据,结合公司的业务特性分析,最张店觉得这个很适合,于是就开始在项目中使用了,“坑”,你知道的,前面的路上总是会有这么多大“坑”在等着你。没过多久,我掉坑里了。结果发现它原生的API只支持WGS84一种坐标系。

What。。。废话少说,开始填坑吧!!!!

第一个想到的就是重写initLayer、或调用setDefaultSpatialReference来修改FeatureLayer的坐标系,结果发现在调用native方法时抛了异常。去。。。惊讶的我眼睛都调了。

后面想了就用GraphicsLayer来代替吧,于是对GraphicsLayer的图形渲染做了测试,在使用STATIC模式渲染时的效率与FeatureLayer基本一致,于是坚定了使用GraphicsLayer来做替换的方案,这样唯一的影响可能就是数据加载的过程了。

Geopackage:怎么让ArcGIS for Android SDK Geopackage 支持WGS84以外的坐标系_第1张图片

于是我就设计了一个GraphicsLayer+Geopackage+GeopackageFeatrueTable的结构,通过GraphicsLayer来展示数据,数据的空间查询也通过GraphicsLayer的getGraphicIDs方法来实现,数据的添加、删除、修改通过GeopackageFeatureTable来操作。坐标系的问题呢,就在图层初始化的时候从geopackage中查询出text,新建一个SpatailReference 设置给图层。

这个坑就算是坑上了,问题就解决了,在实际项目中实践了,数据量不是太大的话,加载速度还是挺快的。。。

源码的话在github,来看看吧,源代码@github.com

你可能感兴趣的:(Geopackage:怎么让ArcGIS for Android SDK Geopackage 支持WGS84以外的坐标系)