特別說明:使用的SDK版本是“arcgis-android:10.2.8-1”膜赃,ArcGIS SDK API
在GIS移動(dòng)開發(fā)方面诉稍,我還是選擇了ESRI的產(chǎn)品,始終覺得它的東西更可靠一點(diǎn)缴允,而且在實(shí)踐當(dāng)中我也發(fā)現(xiàn)它更靈活一些荚守。
2013年我開始使用ArcGIS for Android SDK給公司做一些項(xiàng)目,當(dāng)時(shí)的SDK基本不支持離線矢量數(shù)據(jù)练般,于是自己寫了加載ShapeFile的類矗漾,結(jié)果發(fā)現(xiàn)效率是個(gè)問題。最終只好自己定義了一種結(jié)構(gòu)把數(shù)據(jù)存儲(chǔ)在Sqlite中薄料,效率基本滿足要求敞贡,BUT!還是有些局限摄职。
最近我發(fā)現(xiàn)了OGC的Geopackage誊役,這個(gè)數(shù)據(jù)結(jié)構(gòu)不錯(cuò),可以存矢量也可以存柵格谷市,矢量數(shù)據(jù)使用了RTree索引蛔垢,空間查詢速度很快,如果用它來做離線數(shù)據(jù)包迫悠,我以為是完美的鹏漆,于是就有了下文了。
一開時(shí)我沒有細(xì)看它的API及皂,做了一些數(shù)據(jù)甫男,從幾k條數(shù)據(jù)到幾w條數(shù)據(jù),結(jié)合公司的業(yè)務(wù)特性分析验烧,最張店覺得這個(gè)很適合板驳,于是就開始在項(xiàng)目中使用了,“坑”碍拆,你知道的若治,前面的路上總是會(huì)有這么多大“坑”在等著你慨蓝。沒過多久,我掉坑里了端幼。結(jié)果發(fā)現(xiàn)它原生的API只支持WGS84一種坐標(biāo)系礼烈。
What。婆跑。此熬。廢話少說,開始填坑吧;O馈!扶关!
第一個(gè)想到的就是重寫initLayer阴汇、或調(diào)用setDefaultSpatialReference來修改FeatureLayer的坐標(biāo)系,結(jié)果發(fā)現(xiàn)在調(diào)用native方法時(shí)拋了異常节槐。去搀庶。。铜异。驚訝的我眼睛都調(diào)了哥倔。
后面想了就用GraphicsLayer來代替吧,于是對GraphicsLayer的圖形渲染做了測試熙掺,在使用STATIC模式渲染時(shí)的效率與FeatureLayer基本一致未斑,于是堅(jiān)定了使用GraphicsLayer來做替換的方案,這樣唯一的影響可能就是數(shù)據(jù)加載的過程了币绩。
于是我就設(shè)計(jì)了一個(gè)GraphicsLayer+Geopackage+GeopackageFeatrueTable的結(jié)構(gòu),通過GraphicsLayer來展示數(shù)據(jù)府阀,數(shù)據(jù)的空間查詢也通過GraphicsLayer的getGraphicIDs方法來實(shí)現(xiàn)缆镣,數(shù)據(jù)的添加、刪除试浙、修改通過GeopackageFeatureTable來操作董瞻。坐標(biāo)系的問題呢,就在圖層初始化的時(shí)候從geopackage中查詢出text田巴,新建一個(gè)SpatailReference 設(shè)置給圖層钠糊。
這個(gè)坑就算是坑上了,問題就解決了壹哺,在實(shí)際項(xiàng)目中實(shí)踐了抄伍,數(shù)據(jù)量不是太大的話,加載速度還是挺快的管宵。截珍。攀甚。
源碼的話在github,來看看吧岗喉,源代碼@github.com