`
Virgo_S
  • 浏览: 1153550 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ArcGIS API For Android离线地图的实现

阅读更多
今天搞了一个ArcGIS API For Android离线地图的实现。
效果如下:



Android的版本是2.1
main.xml,这里要说明的,初始化范围一定要有,不然会不能显示的。
<?xml version="1.0" encoding="utf-8"?>
<com.esri.android.map.MapView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/map" android:layout_width="fill_parent" 
     android:layout_height="fill_parent"
     initExtent="120.64101459999999 31.280566089 120.6769494 31.303135911">
         
  <com.esri.arcgis.sample.AgsOfflineTiledLayer android:id="@+id/layer"/>
      
</com.esri.android.map.MapView>



AgsLOD.java
package com.esri.arcgis.sample;

import com.esri.core.internal.d.c;

public class AgsLOD extends c {
    private static final long serialVersionUID = 4341699179151728883L;
    
    private int level;
    private double resolution;
    private double scale;

    public AgsLOD(int level, double scale, double resolution) {
	super();

	this.level = level;
	this.scale = scale;
	this.resolution = resolution;
    }

    public int a() {
	return this.level;
    }

    public double b() {
	return this.resolution;
    }

    public double c() {
	return this.scale;
    }
}



AgsOfflineTiledLayer.java
package com.esri.arcgis.sample;

import java.io.File;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;

import com.esri.android.map.TiledLayer;
import com.esri.core.geometry.Envelope;
import com.esri.core.geometry.Point;
import com.esri.core.geometry.SpatialReference;
import com.esri.core.internal.d.c;
import com.esri.core.internal.d.k;
import com.esri.core.map.TiledLayerModel;

public class AgsOfflineTiledLayer extends TiledLayer {

	//瓦片文件的路径呀  
	private String location = "/sdcard/BaseMap/Layers";

	//REST里面的空间参考
	private SpatialReference spatialReference = SpatialReference.create(4326);
	//全图范围
	private Envelope fullExtent = new Envelope(120.64101459999999,
			31.280566089, 120.6769494, 31.303135911);
	private k tileInfo;

	public AgsOfflineTiledLayer(Context context, AttributeSet attrs) {
		super(context, attrs);

		try {
			init();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	@Override
	protected TiledLayerModel initModel() throws Exception {
		return new AgsOfflineTiledLayerModel(location, spatialReference, fullExtent, tileInfo);
	}

	private void init() {
		String confPath = location + File.separator + "conf.xml";

		Log.i("conf", confPath);
		try {
			tileInfo = new k();

			DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
			File file = new File(confPath);
			Document doc = docBuilder.parse(file);

			NodeList nsX = doc.getElementsByTagName("X");
			double originX = Double.valueOf(nsX.item(0).getFirstChild()
					.getNodeValue());
			NodeList nsY = doc.getElementsByTagName("Y");
			double originY = Double.valueOf(nsY.item(0).getFirstChild()
					.getNodeValue());
			tileInfo.f = new Point(originX, originY);

			NodeList nsTileRows = doc.getElementsByTagName("TileRows");
			tileInfo.a = Integer.valueOf(nsTileRows.item(0).getFirstChild()
					.getNodeValue());

			NodeList nsTileCols = doc.getElementsByTagName("TileCols");
			tileInfo.b = Integer.valueOf(nsTileCols.item(0).getFirstChild()
					.getNodeValue());

			NodeList nsLODInfos = doc.getElementsByTagName("LODInfos");
			tileInfo.h = new ArrayList<c>();
			NodeList lodInfos = nsLODInfos.item(0).getChildNodes();
			for (int j = 0, jcount = lodInfos.getLength(); j < jcount; j++) {
				Node lod = lodInfos.item(j);
				NodeList list = lod.getChildNodes();
				int level = Integer.valueOf(list.item(0).getFirstChild()
						.getNodeValue());
				double scale = Double.valueOf(list.item(1).getFirstChild()
						.getNodeValue());
				double resolution = Double.valueOf(list.item(2).getFirstChild()
						.getNodeValue());
				tileInfo.h.add(new AgsLOD(level, scale, resolution));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}



AgsOfflineTiledLayerModel.java
package com.esri.arcgis.sample;

import java.io.File;
import java.io.FileInputStream;

import android.util.Log;

import com.esri.core.geometry.Envelope;
import com.esri.core.geometry.SpatialReference;
import com.esri.core.internal.d.k;
import com.esri.core.map.TiledLayerModel;

public class AgsOfflineTiledLayerModel extends TiledLayerModel {
	private static final long serialVersionUID = 7726567118839553087L;

	private String location;

	public AgsOfflineTiledLayerModel(String location, SpatialReference sr,
			Envelope full, k tileInfo) {
		super(sr, full, tileInfo);

		this.location = location;
	}


	@Override
	public byte[] getTile(int level, int row, int col) throws Exception {
		byte[] result = null;
		try {
			String bundlesDir = location + File.separator + "_alllayers";

			Log.i("location", bundlesDir);
			
			String l = "0" + level;
			int lLength = l.length();
			if (lLength > 2) {
				l = l.substring(lLength - 2);
			}
			l = "L" + l;

			int rGroup = 128 * (row / 128);
			String r = "000" + Integer.toHexString(rGroup);
			int rLength = r.length();
			if (rLength > 4) {
				r = r.substring(rLength - 4);
			}
			r = "R" + r;

			int cGroup = 128 * (col / 128);
			String c = "000" + Integer.toHexString(cGroup);
			int cLength = c.length();
			if (cLength > 4) {
				c = c.substring(cLength - 4);
			}
			c = "C" + c;

			String bundleBase = String
					.format("%s/%s/%s%s", bundlesDir, l, r, c);
			String bundlxFileName = bundleBase + ".bundlx";
			String bundleFileName = bundleBase + ".bundle";

			int index = 128 * (col - cGroup) + (row - rGroup);
			FileInputStream isBundlx = new FileInputStream(bundlxFileName);
			isBundlx.skip(16 + 5 * index);
			byte[] buffer = new byte[5];
			isBundlx.read(buffer);
			long offset = (long) (buffer[0] & 0xff) + (long) (buffer[1] & 0xff)
					* 256 + (long) (buffer[2] & 0xff) * 65536
					+ (long) (buffer[3] & 0xff) * 16777216
					+ (long) (buffer[4] & 0xff) * 4294967296L;

			FileInputStream isBundle = new FileInputStream(bundleFileName);
			isBundle.skip(offset);
			byte[] lengthBytes = new byte[4];
			isBundle.read(lengthBytes);
			int length = (int) (lengthBytes[0] & 0xff)
					+ (int) (lengthBytes[1] & 0xff) * 256
					+ (int) (lengthBytes[2] & 0xff) * 65536
					+ (int) (lengthBytes[3] & 0xff) * 16777216;
			result = new byte[length];
			isBundle.read(result);
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		return result;
	}

}



AgsOfflineTiles.java
package com.esri.arcgis.sample;

import com.esri.android.map.MapView;

import android.app.Activity;
import android.os.Bundle;

public class AgsOfflineTiles extends Activity {
	
	MapView map = null;
	AgsOfflineTiledLayer layer = null;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        map = (MapView) findViewById(R.id.map);
		layer = (AgsOfflineTiledLayer) findViewById(R.id.layer);       
        
    }
}

在SD卡的瓦片数据的路径




源码和测试数据在附件中

  • 大小: 44.4 KB
  • 大小: 36.8 KB
分享到:
评论
17 楼 Virgo_S 2011-09-17  
眼高手低 写道
您能给我提供一个ArcGIS Server 10的下载地址吗?我在网上找了好几天也没找到。

呵呵,这个你要找esri中国了,不然有侵权的嫌疑了
16 楼 眼高手低 2011-09-16  
您能给我提供一个ArcGIS Server 10的下载地址吗?我在网上找了好几天也没找到。
15 楼 眼高手低 2011-09-16  
我是个新手,不太明白您说的“有一些包你在eclipse里提示可以找到”。您指的是"import com.esri.core.internal.d.k;",然后将光标放在上面后给出的那个提示吗?我的Eclipse给出的是"Note: This element has no attached source and the Javadoc could not be found in the attached Javadoc"。这应该是没有相关信息的意思吧?
14 楼 Virgo_S 2011-09-14  
眼高手低 写道
AgsOfflineTiledLayerModel.java部分从int index = 128 * (col - cGroup) + (row - rGroup);开始我就没看懂,您能给解释一下吗?


这个是瓦片的算法,建议你看一下关于esri的瓦片生成原理
13 楼 Virgo_S 2011-09-14  
眼高手低 写道
您好,我想请教一个问题。就是com.esri.core.internal.d.c和com.esri.core.internal.d.k是什么类啊?我看到工程目录中有很多这样后面是简单字母的包及类。这些在参考中又查不到。当然除了这些之外还有许多查不到的包及类。我能不能知道您是通过什么渠道学习那些参考中查不到的包及类的?我是个新人,刚刚接触ArcGIS API for Android,手上只有一个《ArcGIS API for Android+案例教程》,您能不能给推荐一些资料?我万分感谢!

有一些包你在eclipse里提示可以找到
12 楼 眼高手低 2011-09-08  
AgsOfflineTiledLayerModel.java部分从int index = 128 * (col - cGroup) + (row - rGroup);开始我就没看懂,您能给解释一下吗?
11 楼 眼高手低 2011-09-08  
您好,我想请教一个问题。就是com.esri.core.internal.d.c和com.esri.core.internal.d.k是什么类啊?我看到工程目录中有很多这样后面是简单字母的包及类。这些在参考中又查不到。当然除了这些之外还有许多查不到的包及类。我能不能知道您是通过什么渠道学习那些参考中查不到的包及类的?我是个新人,刚刚接触ArcGIS API for Android,手上只有一个《ArcGIS API for Android+案例教程》,您能不能给推荐一些资料?我万分感谢!
10 楼 anndaming 2011-08-31  
Virgo_S 写道
anndaming 写道
请问一下,你这个离线地图,是自己做的么,怎么做的?

自己做的呀,arcgis server的切图呀,要不数据不大的话,我就上传了,方便大家的

用arcgis server切的图,可以附上自己的图不?
9 楼 Virgo_S 2011-08-31  
anndaming 写道
请问一下,你这个离线地图,是自己做的么,怎么做的?

自己做的呀,arcgis server的切图呀,要不数据不大的话,我就上传了,方便大家的
8 楼 anndaming 2011-08-31  
请问一下,你这个离线地图,是自己做的么,怎么做的?
7 楼 helloandroid 2011-08-25  
呵呵,真在搞android离线地图,谢过
6 楼 Virgo_S 2011-08-17  
hjh811 写道
级别有问题  放大的时候会有问题  放大图调用不了

你需要自己根据自己的地图文件修改一下里面固定参数呀,例如:4326
5 楼 hjh811 2011-08-15  
级别有问题  放大的时候会有问题  放大图调用不了
4 楼 Virgo_S 2011-05-25  
trojantale 写道
楼主有ArcGIS for Android的离线安装包吗?为什么我在线安装老是出现错误?

没有离线安装包,可能是eclipse的版本问题吧,第一次我也有这样的问题,多试几次就好了,个人感觉,ArcGIS for Android的API发布的比较着急,并没有很好的定位
3 楼 sjrhero 2011-05-11  
我哥们儿说你很牛X:特别让我来给你送句祝福的话儿。祝你天天开心。。。他说对你顶礼膜拜  !!!!过两天他就来亲自找你了。。嘿嘿。。。
2 楼 Virgo_S 2011-04-25  
trojantale 写道
楼主有ArcGIS for Android的离线安装包吗?为什么我在线安装老是出现错误?

没有
在线安装挺容易的,是不是eclipse的版本不对呀
1 楼 trojantale 2011-04-23  
楼主有ArcGIS for Android的离线安装包吗?为什么我在线安装老是出现错误?

相关推荐

    ArcGIS API for Android离线文档

    《ArcGIS API for Android离线文档》是一款专为Android开发者设计的工具,它包含了使用Esri公司的ArcGIS系统在Android平台上开发地图应用所需的所有技术文档。这个离线文档旨在帮助开发者在没有网络连接的情况下,也...

    Arcgis for android 离线地图缓存制作教程

    ### ArcGIS for Android 离线地图缓存制作教程 #### 一、ArcGIS地图缓存制作概述 ArcGIS是一款广泛应用于地理信息系统(GIS)领域的软件,它支持地图的创建、管理和分享。随着移动设备的普及和技术的发展,越来越多...

    arcgis api android离线版

    arcgis for android api 离线 版本 下载

    ArcGIS API for Android 1.0 离线文档

    ArcGIS API for Android 1.0 支持在线地图访问,同时也允许用户下载地图数据进行离线使用,这对于网络不稳定或者无网络环境下的应用非常重要。 总的来说,ArcGIS API for Android 1.0 提供了全面的GIS功能,让...

    ArcGIS API for Android (10.2版本)

    **ArcGIS API for Android(10.2版本)** ArcGIS API for Android 是Esri公司为Android平台开发的一款强大的地理信息系统(GIS)开发工具。它允许开发者构建具有地图展示、地理编码、空间分析等功能的移动应用程序...

    ArcGIS Android 2.0 API 离线文档

    **ArcGIS Android 2.0 API 离线文档** ArcGIS Android API 是Esri公司提供的一个强大的地理信息系统(GIS)开发工具,专为在Android平台上构建地图应用而设计。这个2.0版本的API引入了一系列增强功能和优化,旨在...

    ArcGIS Runtime for Android 2.0离线文档

    ArcGIS Runtime for Android 2.0 强化了离线地图的功能,用户可以下载地图包并在无网络环境下使用。这极大地拓展了GIS应用的场景,特别是在野外作业、应急响应等领域。 **7. 自定义图层和符号系统** 开发者可以...

    ArcGIS Runtime for Android API 10.1.1离线文档

    ArcGIS Runtime for Android API 10.1.1离线文档

    ArcGis API for Android进阶

    通过使用 ArcGIS API for Android,开发者可以访问丰富的地图服务、地理数据处理能力以及与 ArcGIS Server 的集成等功能。 ##### 1.1 发布时间与版本 - **测试版**: 已于 2011 年 2 月发布。 - **正式版**: 计划于 ...

    arcgis for js 加载本地离线瓦片数据

    《加载本地离线瓦片数据在ArcGIS for JavaScript中的实现》 在GIS应用开发中,尤其是在没有网络连接或者网络环境不稳定的情况下,加载本地离线瓦片数据显得尤为重要。ArcGIS for JavaScript API提供了一种有效的...

    ArcGIS API For Android教程

    《ArcGIS API for Android教程》是一本专注于在Android平台上利用Esri的ArcGIS技术进行地图应用开发的专业指南。ArcGIS是地理信息系统(Geographic Information System)的缩写,它为开发者提供了一整套用于创建、...

    ArcGIS API for Android1.01

    总之,ArcGIS API for Android 1.01 是开发者构建地理信息系统应用的强大工具,结合提供的案例教程和相关资源,可以助力开发者快速掌握并应用这项技术,为Android用户提供丰富的地图服务和地理信息应用。

    ArcGIS Android 10.1.1 API离线帮助手册

    ArcGIS Android API 是Esri公司为开发者提供的一款强大的地理信息系统开发工具,它允许开发者在Android平台上构建地图应用,实现地理空间数据的展示、分析和处理。版本10.1.1是这个API的一个特定版本,可能包含了...

    Arcgis For Android 距离、面积测量(手动打点、自动轨迹)

    在“ArcGIS for Android 距离、面积测量(手动打点、自动轨迹)”这个主题中,我们将深入探讨如何利用ArcGIS API实现距离和面积的测量功能,包括手动打点和自动轨迹测量。 1. **手动打点测量距离**: - **添加地图...

    arcgis for android通用终端采集项目

    7. **自定义开发**:ArcGIS for Android提供了丰富的API和SDK,开发者可以依据项目需求进行二次开发,实现特定功能或界面定制。 在压缩包中,`AndroidMap.apk`是ArcGIS for Android应用的安装文件,用户可以将其...

    ArcGIS-API-for-Android.rar_Android arcgis_ArcGIS API_android_arc

    ArcGIS API for Android 是Esri公司提供的一款强大的地图服务开发工具,专为在Android平台上构建地理信息系统(GIS)应用而设计。本教程将带你深入理解和掌握如何利用这个API进行Android应用的开发。 ### 1. 环境...

    基于ArcGIS Runtime SDK for Android离线编辑关键技术应用研究.pdf

    基于ArcGIS Runtime SDK for Android的离线编辑功能,可以实现对地图数据的精细操作,包括添加、删除、修改地理要素,以及执行复杂的几何编辑任务。 例如,文章提到了“面修形算法”,这是一种用于处理复杂地理形状...

Global site tag (gtag.js) - Google Analytics