欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

ArcGIS for Android

程序员文章站 2022-05-25 12:37:53
arcgis for android。记录一下前段时间项目中使用过的?arcgis? 官方说明文档: https://developers.arcgis.com/android/latest/ ap...

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

}

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

 

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() {
            @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);
}

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