ArcGIS for Android
arcgis for android。记录一下前段时间项目中使用过的?arcgis?
官方说明文档:
https://developers.arcgis.com/android/latest/
api:
https://developers.arcgis.com/android/10-2/api-reference/reference/packages.html
1 .sdk接入?
1 > 在 project 的 build.gradle 添加maven地址
maven{ url 'https://esri.bintray.com/arcgis' }
2> 在module 的?build.gradle 添加sdk版本库引用(我这里用的是10.2.5的版本)
compile 'com.esri.arcgis.android:arcgis-android:10.2.5'
3> 添加用户权限
然后你点击sync?同步下你的项目就ok了
2. 地图加载
1>创建一个activity ,在布局文件中创建一个承载地图的容器 ,我这里用的是framelayout?
<framelayout android:id="@+id/map_container" android:layout_height="match_parent" android:layout_width="match_parent"></framelayout>
2>.在代码中初始化一个地图然后以view的形式添加到这个容器中
/** * 设置地图属性 */ private void setupmap() { //实例化一个mapview对象 map = new mapview(this); //设置不允许缩放 map.setallowonefingerzoom(false); //设置不允许放大 map.setallowmagnifiertopanmap(false); //设置不允许缩放时旋转 map.setallowrotationbypinch(false); //设置地图不显示背后网格 map.setmapbackground(0xffffff, 0xffffff, 1.0f, 100.0f); //featurelayer所需的可选参数对象 arcgisfeaturelayer.options mo = new arcgisfeaturelayer.options(); mo.mode = arcgisfeaturelayer.mode.snapshot;//立即执行 //设置筛选参数 mo.outfields = new string[]{"*"}; //定义featurelayer对象,url指向为服务的一个图层 flayer = new arcgisfeaturelayer(constants.mapurl, mo); //将图层添加到map中 map.addlayer(flayer); map_container.addview(map); }
如果你的地图服务没有问题,到此你就可以正常的显示出一张地图了
3. 地图渲染
加载出的地图可以进行不同颜色的标识,通过调用arcgis 对外提供的api 进行渲染可以实现
//创建渲染器 classbreaksrenderer breaksrender = arcgismaputil.getbreaksrender(mcontext, color, colunm, double.parsedouble(minvalue), double.parsedouble(maxvalue)); //设置图层渲染器 flayer.setrenderer(breaksrender);
需求是根据指标的最大最小值均分为8级,简单封装了一下,并创建了每个级别的渲染器
/** * 设置 颜色级别 * * @param field 地图区域标识 * @param minvalue 最小值 * @param maxvalue 最大值 * @return */ public static classbreaksrenderer getbreaksrender(context context, int[] color, string field, double minvalue, double maxvalue) { //创建渲染器 classbreaksrenderer breaksrenderer = new classbreaksrenderer(); //设置区域表示 breaksrenderer.setfield(field); //设置最小值 breaksrenderer.setminvalue(minvalue); //取到最小值和最大值的差值的 1/8 double level_stage = (maxvalue - minvalue) / 8; simplefillsymbol simplefillsymbol; double leve1 = minvalue + level_stage; // for (int i = 0; i < color.length; i++) { //创建单个色值区域 classbreak cb = new classbreak(); if (i == color.length - 1) { cb.setclassmaxvalue(maxvalue); } else { cb.setclassmaxvalue(leve1); leve1 += level_stage; } //设置色值 simplefillsymbol = new simplefillsymbol(color[i]); //设置边线为白色 simplefillsymbol.setoutline(new simplelinesymbol(context.getresources().getcolor(r.color.map_line_color), 1)); cb.setsymbol(simplefillsymbol); //创建默认色值配置 simplefillsymbol symbol = new simplefillsymbol(color.rgb(120, 175, 60)); symbol.setoutline(new simplelinesymbol(color.rgb(238, 238, 238), 1)); breaksrenderer.setdefaultsymbol(symbol); //添加到渲染器中 breaksrenderer.addclassbreak(cb); } return breaksrenderer; }
到此就可以将一张透明的地图渲染成自己想要的颜色了
4.设置地图默认展示坐标范围
非常简单,调用一个api就可以实现,需要你做的只是传入的只有四个 double 类型的坐标值就可以了
map.setextent(new envelope(min_x, min_y, max_x, max_y), 0);
5.设置地图文字说明
这个地方非常坑,有个文字字体的问题,android默认是不支持的,试过很多方式解决,度娘很多推荐在的字体库中添加需要的字体,结果不太好用,最终是将文字转换为bitmapdrawable 的方式加载到图层上的,缺点就是文字信息较多时,加载出文字会有明显的刷新地图的视感。。。
private void getmapnameinfo() { // 添加地图说明 try { if (mgraphicslayer == null) { mgraphicslayer = new graphicslayer(); map.addlayer(mgraphicslayer); } mgraphicslayer.removeall(); //创建查询参数对象 query query = new query(); //设置参数 * 代表全部 query.setoutfields(new string[]{"*"}); //查询条件 query.setwhere("1=1"); flayer.queryfeatures(query, new callbacklistener() { @override public void oncallback(featureset featureset) { graphic[] graphics = featureset.getgraphics(); if (graphics != null && graphics.length > 0) { for (int i = 0; i < graphics.length; i++) { graphic graphic = graphics[i]; map attr = graphic.getattributes(); string code = (string) attr.get("code"); //这些参数问 服务端要 string name = (string) attr.get("name"); double x = (double) attr.get("center_x"); double y = (double) attr.get("center_y"); geometry geometry = new point(x, y); //创建marker picturemarkersymbol markersymbol = new picturemarkersymbol( arcgismaputil.createmapbitmap(attr.get("name") + "")); //将 marker添加到图像中 graphic gtext = new graphic(geometry, markersymbol); mgraphicslayer.addgraphic(gtext); } } } @override public void onerror(throwable throwable) { } }); } catch (exception e) { e.printstacktrace(); } } /** * 文字转换bitmap * * @param text * @return */ public static drawable createmapbitmap(string text) { paint paint = new paint(); paint.setcolor(color.white); paint.settextsize(24); paint.setantialias(true); paint.settextalign(paint.align.center); float textlength = paint.measuretext(text); int width = (int) textlength + 10; int height = 40; bitmap newb = bitmap.createbitmap(width, height, bitmap.config.argb_8888); canvas cv = new canvas(newb); cv.drawcolor(color.parsecolor("#00000000")); cv.setdrawfilter(new paintflagsdrawfilter(0, paint.anti_alias_flag | paint.filter_bitmap_flag)); cv.drawtext(text, width / 2, 20, paint); cv.save(canvas.all_save_flag);// 保存 cv.restore();// 存储 return new bitmapdrawable(newb); }
到此 ,就可以将需要的文字说明加载到图层上了
上一篇: 吃香蕉好吗,听听专家怎么说
推荐阅读
-
解决android Listview的item中最外层Margin失效的问题
-
Android textview 实现长按*选择复制功能的方法
-
Android 中CheckBox的isChecked的使用实例详解
-
解析Android截取手机屏幕两种实现方案
-
Android Studio安装配置方法图文教程
-
Android 自定义一套 Dialog通用提示框 (代码库)
-
Android XML設置屏幕方向(android:screenOrientation)详解
-
Android获取分享应用列表详解及实例
-
Android中pendingIntent与Intent的深入分析
-
Android 静默安装实现方法