当前位置: 移动技术网 > 移动技术>移动开发>Android > ArcGIS for Android

ArcGIS for Android

2018年11月01日  | 移动技术网移动技术  | 我要评论

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

到此 ,就可以将需要的文字说明加载到图层上了

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网