- 浏览: 1137870 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 3536Sqlite数据库第三方java扩展包下载地址:http:// ... -
Android SDK 2.2 离线安装
2011-03-19 21:14 4122Android各版本的市场份额 android的普通安装 ... -
ACOD:如何在eclipse中使用离线文档中的中文Javadoc
2011-03-19 21:08 24760、下载ACOD(Android Chinese Offlin ... -
Android RatingBar 评分条
2011-03-18 00:31 2951RatingBar评分条是SeekBar拖动条的子类。现阶段系 ... -
Android SeekBar 拖动条 滑动条
2011-03-18 00:29 9413SeekBar可以作为音乐播放器的进度指示和调整工具,音量调整 ... -
Android ProgressBar 进度条
2011-03-18 00:25 3265在某项延续性工作的进 ... -
Android Menu
2011-03-17 23:08 1786本讲内容:菜单 menu (Android 2.1) 1、选项 ... -
Activity之间的相互调用与传递参数
2011-03-16 22:25 5135Activity之间是如何调用的 Activity与Activ ...
相关推荐
ArcGIS API for Android离线文档
arcgis for android api 离线 版本 下载
ArcGIS API for Android 1.0离线文档
ArcGIS Android 2.0 API 离线文档
ArcGIS Runtime for Android 2.0离线文档
ArcGIS Runtime for Android API 10.1.1离线文档
ArcGIS Android 10.1.1 API离线帮助手册。
arcgis for android 2.0 的离线文档
使用ArcGIS for Android开发的加载GoogleMap地图。并判断无网络时自动加载本地图片。图片存放在/ArcGIS/samples/tiledcache/下。在有网络时自动存储地图图片。未做容量控制及清空策略。并集成了从ArcGIS Server缓存...
arcgis-runtime-sdk-android-100.9.0
通过ArcGIS for Android API提供的接口实现添加标绘。内有android程序和离线切片地图。
2. ArcGIS Runtime for Android简介 2 第二章. 开发环境配置 4 1. 系统要求 4 2. Android配置 5 3. ArcGIS Runtime for Android配置 7 4. 使用Android模拟器开发 8 5. 使用Android设备开发 10 第三章. 创建第...
• 大量的预定义图块源:Google地图,Mapbox,ArcGIS,诺基亚地图,必应地图,Open Street Maps和其他许多地图项(16个提供程序,88种地图类型); • 能够创建自己的地图样式或使用自己的图块源(例如,WMS); • ...
基于android平台的arcgis开发,包括jar包、英文离线html格式文档、安装使用方法、中文案例(pdf)
supermap加载天地图图层API,非常的试用
离线风力涡轮机检查员机器人========================================弃用通知此存储库已被弃用,因为 ArcGIS Android API 已更新用于处理离线数据的 API 模式。 请参阅了解现代离线模式,并查看了解未来更多此类...
•在线和离线地图; •带有高程的2D地图和3D地图; •2D,3D和Billboard标记; •支持Texture,NGUI,SpriteRenderer,uGUI(UIImage,UIRawImage)和Tileset; •谷歌地图,Mapbox,ArcGIS,诺基亚地图(HERE.com)...