ArcGIS for Android 10.2.5
记录一下前段时间项目中使用过的 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
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);}
到此 ,就可以将需要的文字说明加载到图层上了
还有密度图展示,有时间再整理吧。。。
地图上边的log是需要付费才阔以去除的,有需要的可以看下它的官网
截止到文章编辑arcgis 是不支持热力图展示的。
更多相关文章
- android使用web加载网页的js问题
- 使用Android Studio开发百度地图LBS过程中遇到找不到so文件
- Android 下载进度条, 自定义加载进度条,loading动画
- Android动态加载学习
- Android插件化开发之DexClassLoader动态加载dex、jar小Demo
- [Android] 开发资料收集:动态加载、插件化、热修复技术
- Activity的四种加载模式