记录一下前段时间项目中使用过的 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);
}
如果你的地图服务没有问题,到此你就可以正常的显示出一张地图了
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 是不支持热力图展示的。