- 浏览: 1150735 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
RebeccaZhong:
严重: StandardWrapper.Throwableco ...
三步发布java方式的rest服务 -
RebeccaZhong:
严重: StandardWrapper.Throwableco ...
三步发布java方式的rest服务 -
冷酷月光:
楼主。请教一下。arcgis for android 有提供地 ...
ArcGIS API For Android离线地图的实现 -
winney117:
请问如何GET已有网页上的指定内容?比如百度文库中的某一篇文章 ...
三步发布java方式的rest服务 -
zige1012:
您好,我想问问我想换个自己地图的切片,也有4层(L0-L3), ...
ArcGIS API For Android离线地图的实现
今天搞了一个ArcGIS API For Android离线地图的实现。
效果如下:
Android的版本是2.1
main.xml,这里要说明的,初始化范围一定要有,不然会不能显示的。
AgsLOD.java
AgsOfflineTiledLayer.java
AgsOfflineTiledLayerModel.java
AgsOfflineTiles.java
在SD卡的瓦片数据的路径
源码和测试数据在附件中
你需要改Eclipse的一个参数,在Eclipse目录下有eclipse.ini文件,打开,拖到最后,改成:
-Xms256m
-Xmx1024m
后者可以改得更大。参见addegg.net
我也是这样,求解释
效果如下:
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卡的瓦片数据的路径
源码和测试数据在附件中
- BaseMap.rar (1.5 MB)
- 下载次数: 2045
- AgsOfflineTiles.rar (2.4 MB)
- 下载次数: 2059
评论
37 楼
冷酷月光
2015-08-01
楼主。请教一下。arcgis for android 有提供地图导航api没有。新手请教一下
36 楼
zige1012
2014-04-19
您好,我想问问我想换个自己地图的切片,也有4层(L0-L3),为什么显示不了啊?是不是要改下代码啊?
35 楼
捂不白的小黑
2014-01-25
为什么少文件不能运行呢
34 楼
polluxll
2013-02-26
你好,我现在使用最新的2.2 的API,在加载多个切片图层时,涉及到在某一级别可能一个切片图层就没有了,但是上一级别的切片还在地图上,随着地图中MapView的放大不断放大,有解决方法否?
@Override
protected byte[] getTile(int level, int col, int row) throws Exception {
return com.esri.core.internal.b.a.a.a(this.getMapTileUrl(level, col, row), null,d());
}
@Override
protected byte[] getTile(int level, int col, int row) throws Exception {
return com.esri.core.internal.b.a.a.a(this.getMapTileUrl(level, col, row), null,d());
}
33 楼
xuyajun1979
2012-10-10
及时雨啊,非常感谢!正在做一个项目需要做成离线的!
32 楼
Mr羽化
2012-09-28
arcgis sdk 的版本可以给我不,现在的2.0版本找不到TiledLayerModel
31 楼
jazy
2012-09-11
楼主,你的这个离线地图支持编辑和保存吗? 这几天在做这个的android 着急
30 楼
minjie0128
2012-04-07
这个resolution是什么意思
29 楼
yuejie001
2012-03-29
楼主你好:
这个例子我做好了,存在一个问题,就是地图从全图开始放大,放大几级以后,到了数据多的、精细的地方就显示不了了,不知道什么原因,谢谢赐教。
这个例子我做好了,存在一个问题,就是地图从全图开始放大,放大几级以后,到了数据多的、精细的地方就显示不了了,不知道什么原因,谢谢赐教。
28 楼
ilywhax
2012-03-24
请问下你这离线地图可不可以加载不是切片的地图?我换成我的地图(不是用切片做的)没法显示
27 楼
眼高手低
2012-02-20
您好,我还是对com.esri.core.internal.d.c和com.esri.core.internal.d.k比较纠结。您是怎么获取这两个类的用途、属性和方法的详细信息的?或者说您在写代码的时候是怎么知道要用到这些类以及怎么用的?敬求赐教!
26 楼
hardycheng
2012-02-08
我想问一下 :
如何在Activity中知道现在调用的是第几层的切片。
比如我想让一些信息在第三层的时候才显示,而00,01,02这些切片中地图显示的范围比较大,业务信息点不让显示,怎么实现?
如何在Activity中知道现在调用的是第几层的切片。
比如我想让一些信息在第三层的时候才显示,而00,01,02这些切片中地图显示的范围比较大,业务信息点不让显示,怎么实现?
25 楼
jiahui524
2011-12-09
想问一下,万一离线数据特别大,你不用异步任务去完成不会ANR或者FC???如果用到异步任务或者Handler 又如何实现?能说下吗?
24 楼
ls6576837
2011-12-01
请问楼主,public byte[] getTile(int level, int row, int col)这个函数返回的就是对应的切片地图的吗?
23 楼
我叫钱多多
2011-11-22
不错 很强大 学习了
22 楼
sunshine19851
2011-10-28
你这个是arcgis server 10的切片形式,但是针对arcgis server 10以下的切片形式又改如何处理呢?
21 楼
刀枪剑戟
2011-10-24
qyc898 写道
楼主,我只要一建arcgis的项目,就在building workspace的时候整个eclipse卡死了...卡很久然后eclipse说内存不足就关掉了...是什么原因啊?
eclipse是3.6.2的版本,ADT是12,jdk是1.6的,操作系统是windows xp..机器配置也没有问题,2G内容双核CPU,开发普通的安卓项目和谷歌地图都正常
eclipse是3.6.2的版本,ADT是12,jdk是1.6的,操作系统是windows xp..机器配置也没有问题,2G内容双核CPU,开发普通的安卓项目和谷歌地图都正常
你需要改Eclipse的一个参数,在Eclipse目录下有eclipse.ini文件,打开,拖到最后,改成:
-Xms256m
-Xmx1024m
后者可以改得更大。参见addegg.net
20 楼
qyc898
2011-10-19
楼主,我只要一建arcgis的项目,就在building workspace的时候整个eclipse卡死了...卡很久然后eclipse说内存不足就关掉了...是什么原因啊?
eclipse是3.6.2的版本,ADT是12,jdk是1.6的,操作系统是windows xp..机器配置也没有问题,2G内容双核CPU,开发普通的安卓项目和谷歌地图都正常
eclipse是3.6.2的版本,ADT是12,jdk是1.6的,操作系统是windows xp..机器配置也没有问题,2G内容双核CPU,开发普通的安卓项目和谷歌地图都正常
19 楼
壮壮203
2011-10-08
hsjshijiazhuang 写道
哥们。你这程序,有时候,直接调用,会崩溃。然后再次执行,就能加载好。为啥呢???
我也是这样,求解释
18 楼
hsjshijiazhuang
2011-10-08
哥们。你这程序,有时候,直接调用,会崩溃。然后再次执行,就能加载好。为啥呢???
发表评论
-
Java中使用Sqlite数据库
2011-03-24 00:04 3585Sqlite数据库第三方java扩展包下载地址:http:// ... -
Android SDK 2.2 离线安装
2011-03-19 21:14 4161Android各版本的市场份额 android的普通安装 ... -
ACOD:如何在eclipse中使用离线文档中的中文Javadoc
2011-03-19 21:08 25330、下载ACOD(Android Chinese Offlin ... -
Android RatingBar 评分条
2011-03-18 00:31 2988RatingBar评分条是SeekBar拖动条的子类。现阶段系 ... -
Android SeekBar 拖动条 滑动条
2011-03-18 00:29 9456SeekBar可以作为音乐播放器的进度指示和调整工具,音量调整 ... -
Android ProgressBar 进度条
2011-03-18 00:25 3297在某项延续性工作的进 ... -
Android Menu
2011-03-17 23:08 1826本讲内容:菜单 menu (Android 2.1) 1、选项 ... -
Activity之间的相互调用与传递参数
2011-03-16 22:25 5176Activity之间是如何调用的 Activity与Activ ...
相关推荐
《ArcGIS API for Android离线文档》是一款专为Android开发者设计的工具,它包含了使用Esri公司的ArcGIS系统在Android平台上开发地图应用所需的所有技术文档。这个离线文档旨在帮助开发者在没有网络连接的情况下,也...
### ArcGIS for Android 离线地图缓存制作教程 #### 一、ArcGIS地图缓存制作概述 ArcGIS是一款广泛应用于地理信息系统(GIS)领域的软件,它支持地图的创建、管理和分享。随着移动设备的普及和技术的发展,越来越多...
arcgis for android api 离线 版本 下载
ArcGIS API for Android 1.0 支持在线地图访问,同时也允许用户下载地图数据进行离线使用,这对于网络不稳定或者无网络环境下的应用非常重要。 总的来说,ArcGIS API for Android 1.0 提供了全面的GIS功能,让...
**ArcGIS API for Android(10.2版本)** ArcGIS API for Android 是Esri公司为Android平台开发的一款强大的地理信息系统(GIS)开发工具。它允许开发者构建具有地图展示、地理编码、空间分析等功能的移动应用程序...
**ArcGIS Android 2.0 API 离线文档** ArcGIS Android API 是Esri公司提供的一个强大的地理信息系统(GIS)开发工具,专为在Android平台上构建地图应用而设计。这个2.0版本的API引入了一系列增强功能和优化,旨在...
ArcGIS Runtime for Android 2.0 强化了离线地图的功能,用户可以下载地图包并在无网络环境下使用。这极大地拓展了GIS应用的场景,特别是在野外作业、应急响应等领域。 **7. 自定义图层和符号系统** 开发者可以...
《加载本地离线瓦片数据在ArcGIS for JavaScript中的实现》 在GIS应用开发中,尤其是在没有网络连接或者网络环境不稳定的情况下,加载本地离线瓦片数据显得尤为重要。ArcGIS for JavaScript API提供了一种有效的...
ArcGIS Runtime for Android API 10.1.1离线文档
《ArcGIS API for Android教程》是一本专注于在Android平台上利用Esri的ArcGIS技术进行地图应用开发的专业指南。ArcGIS是地理信息系统(Geographic Information System)的缩写,它为开发者提供了一整套用于创建、...
总之,ArcGIS API for Android 1.01 是开发者构建地理信息系统应用的强大工具,结合提供的案例教程和相关资源,可以助力开发者快速掌握并应用这项技术,为Android用户提供丰富的地图服务和地理信息应用。
ArcGIS Android API 是Esri公司为开发者提供的一款强大的地理信息系统开发工具,它允许开发者在Android平台上构建地图应用,实现地理空间数据的展示、分析和处理。版本10.1.1是这个API的一个特定版本,可能包含了...
在“ArcGIS for Android 距离、面积测量(手动打点、自动轨迹)”这个主题中,我们将深入探讨如何利用ArcGIS API实现距离和面积的测量功能,包括手动打点和自动轨迹测量。 1. **手动打点测量距离**: - **添加地图...
7. **自定义开发**:ArcGIS for Android提供了丰富的API和SDK,开发者可以依据项目需求进行二次开发,实现特定功能或界面定制。 在压缩包中,`AndroidMap.apk`是ArcGIS for Android应用的安装文件,用户可以将其...
ArcGIS API for Android 是Esri公司提供的一款强大的地图服务开发工具,专为在Android平台上构建地理信息系统(GIS)应用而设计。本教程将带你深入理解和掌握如何利用这个API进行Android应用的开发。 ### 1. 环境...
基于ArcGIS Runtime SDK for Android的离线编辑功能,可以实现对地图数据的精细操作,包括添加、删除、修改地理要素,以及执行复杂的几何编辑任务。 例如,文章提到了“面修形算法”,这是一种用于处理复杂地理形状...