记录一下前段时间项目中使用过的 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> 添加用户权限

 

<uses-permission android:name="android.permission.INTERNET" />

 

然后你点击Sync 同步下你的项目就ok了

 

2. 地图加载

 

1>创建一个activity ,在布局文件中创建一个承载地图的容器 ,我这里用的是FrameLayout 

<FrameLayout

                android:id="@+id/map_container"

                android:layout_width="match_parent"

                android:layout_height="match_parent" />

 

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);

}

 

如果你的地图服务没有问题,到此你就可以正常的显示出一张地图了

 

 

android arcgis Graphic 属性 arcgis for android_加载

 

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<FeatureSet>() {
            @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<String, Object> 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 是不支持热力图展示的。