系列文章目录

ArcGIS紧凑型切片读取与应用1-解析(附源码)

ArcGIS紧凑型切片读取与应用2-webgis动态加载紧凑型切片(附源码)

ArcGIS紧凑型切片读取与应用3-紧凑型批量转分散型(附源码)

1.前言

上篇主要讲了一下紧凑型切片的的解析逻辑,这一篇主要讲一下使用openlayers动态加载紧凑型切片的web地图服务。

2.代码实现

上篇已经可以通过切片的x、y、z得对应的切片图片,现在使用asp.net mvc方式提供读取服务,这里有一问题就是频繁打开切文件会存在资源未释放的占用的情况,导致请求失败,这里使用单例模式保证相同切片文件只打开一次,并且提供文件缓存与过期释放机制,加快服务的请求返回速率。

1.切片请求服务入口,提供基本的参数x、y、z以及紧凑切片文件路径,系统返回对应的切片数据。

// 切片请求控制器
public ActionResult GetTile(int x, int y, int z)
{try{ArcgisBundleHelper Helper = new ArcgisBundleHelper(@"G:\feiq\Recv Files\Map_test\map");var data = Helper.GetTile(x, y, z);return File(data, "image/jpeg");}catch (Exception ex){throw;}
}

2.单例模式实现的切文件缓存类,实现切片文件的新增缓存、过期缓存清除,以及通过索引的方式访问切片文件。

/// <summary>
/// 缓存切片单例类
/// </summary>
public class TileCache
{/// <summary>/// 获取切片文件索引/// </summary>/// <param name="id"></param>/// <returns></returns>public BundleCache this[bundlx id]{get{lock (obj){return AddBundleCache(id);}}}private static volatile TileCache instance;private static readonly object obj = new object();private TileCache() { }//线程安全单例public static TileCache Instance{get{if (null == instance){lock (obj){if (null == instance){instance = new TileCache();}}}return instance;}}/// <summary>/// 设置最多缓存文件数目/// </summary>private static int cacheCount = 20;/// <summary>/// 切片文件缓存集合类/// </summary>private static List<BundleCache> bundleCacheList = new List<BundleCache>();/// <summary>/// 通过id返回切片缓存/// </summary>/// <param name="cache"></param>/// <returns></returns>private static BundleCache AddBundleCache(bundlx cache){string cacheid = cache.id;if (bundleCacheList.Select(e => e.BundleId).ToList().Contains(cacheid)){//更新最后访问时间BundleCache tem = bundleCacheList.Where(e => e.BundleId == cacheid).FirstOrDefault();tem.LastTime = DateTime.Now;changeCache();return bundleCacheList.Where(e => e.BundleId == cacheid).FirstOrDefault();}else{//未添加的文件,写入缓存集合BundleCache bc = new BundleCache();bc.BundleId = cache.id;bc.CTime = DateTime.Now;bc.LastTime = DateTime.Now;using (FileStream file = new FileStream(cache.bundlxFileName, FileMode.Open)){byte[] bufferfile = new byte[file.Length];file.Read(bufferfile, 0, (int)file.Length);//写入数据bc.BundlxData = bufferfile;}using (FileStream file = new FileStream(cache.bundleFileName, FileMode.Open)){byte[] bufferfile = new byte[file.Length];file.Read(bufferfile, 0, (int)file.Length);//写入数据bc.BundleData = bufferfile;}bundleCacheList.Add(bc);changeCache();return bc;}}/// <summary>/// 保证缓存文件数目一定/// </summary>private static void changeCache(){if (bundleCacheList.Count>cacheCount){bundleCacheList= bundleCacheList.OrderByDescending(e => e.LastTime).ToList().Take(cacheCount).ToList();}}
}

3.我们的服务地址为 "/Tile/GetTile?x={x}&y={y}&z={z}",使用openlayers动态加载紧凑型切片。加载的结果如图。

@{ViewBag.Title = "Index";Layout = null;
}
<style>html, body, #map {height: 100%;width: 100%;margin: 0;padding: 0;}
</style>
<div id="map"></div>
<script src="~/Content/openlayer4.64/ol.js"></script>
<script type="text/javascript">var mapurl = "/Tile/GetTile?x={x}&y={y}&z={z}";var maplayer = new ol.layer.Tile({name: "testLayer",// 瓦片图像数据源source: new ol.source.XYZ({crossOrigin: 'anonymous',url: mapurl}),opacity: 1});var map = new ol.Map({target: 'map',layers: [maplayer],view: new ol.View({center: ol.proj.fromLonLat([104.41, 33.82]),zoom: 4})});
</script>

3.结束

上面方法使用动态解析紧凑型切片的方式,实现webgis的实时加载功能,由于是动态解析文件,返回的效率不高,下一篇我们开发一个程序,实现从紧凑型切片批量转为分散型切片的方法。

百度网盘链接:https://pan.baidu.com/s/1I-Bj3EQSN57pQHvKZ2hBUA   提取码:lliw

github项目地址:https://github.com/HuHongYong/TilerArcgisBundle

作者:ATtuing

出处:http://www.cnblogs.com/ATtuing

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

转载于:https://www.cnblogs.com/ATtuing/p/10437979.html

ArcGIS紧凑型切片读取与应用2-webgis动态加载紧凑型切片(附源码)相关推荐

  1. arcgis xml 下载 切片_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...

    内容概览 1.openlayers6结合geoserver利用WFS服务实现图层编辑功能 2.源代码demo下载 效果图如下: 本篇主要是参照openlayers6结合geoserver利用WFS服务 ...

  2. arcgis xml 下载 切片_arcgis api 4.x for js地图加载arcgisserver本地离线瓦片(附源码下载)...

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...

  3. arcgis开发 多版本之间如何兼容_arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)...

    你还在使用 JQuery 或者 Dojo 框架开发 arcgis api 4.x for js 吗?想试试模块化开发吗?随着前端技术的发展,arcgis api 4.x for js 也有了结合 re ...

  4. 读取xml文件转成ListT对象的两种方法(附源码)

    读取xml文件转成List<T>对象的两种方法(附源码) 读取xml文件,是项目中经常要用到的,所以就总结一下,最近项目中用到的读取xml文件并且转成List<T>对象的方法, ...

  5. WebGIS——Openlayers加载图层

    Openlayers加载图层 一.创建Html文件并在body中放入一个Div作为地图显示的容器 <body><div id="map" class=" ...

  6. C#实现excel文件的读取、写入以及异常处理,附源码程序

    C#实现excel文件的读取与写入,附源码程序 说明 关键代码段 源程序下载地址 注意事项及异常解决 说明 通过OleDB方式,对execl文件进行读取.写入操作. 注:网上很多类似的代码,但是代码中 ...

  7. STM32F4 读取双相编码器(附源码)

    STM32F4 读取AB相编码器(附源码) 1. 原理 1.1 AB相编码器 AB相编码器,简而言之,就是有两路输出的脉冲信号,通过对脉冲计数,可以知道转动了多少角度. 读取编码器的数据也就是要让单片 ...

  8. mapbox矢量切片标准_Cesium 加载矢量切片(MapBox Vector Tile)

    矢量切片(vector tile)是当前 WebGIS 较热技术,国内的高德.百度等在线地图都使用了矢量切片技术.相较于传统栅格切片,矢量切片好处很多.简单几点就是:轻量.客户端渲染.还可加密(栅格切 ...

  9. arcgis api 3.x for js 入门开发系列二不同地图服务展示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  10. mysql 读取文件_关于mysql:逐行读取文件而不将整个文件加载到内存中

    我正在使用50 Gb MySQL导出文件,并对其执行脚本操作列表以转换为SQLite3可加载形式(我从这里得到的线索:脚本将mysql dump sql文件转换为可以导入sqlite3的格式D b ) ...

最新文章

  1. $\mathbf{R}^n$中的紧集是闭有界集
  2. android使用桢布局,Android性能优化UI篇
  3. 神策数据入选铅笔道 2021 真榜“企业服务未来独角兽排行榜·营销与销售 TOP20”...
  4. 内存泄漏MobX State Tree_[译]iOS Crash Dump Analysis 错误的内存崩溃
  5. android调用网页方法,Android调用手机浏览器的正确方式
  6. WritePrivateProfileString等读写.ini配置文件
  7. linux部署jar项目报错_Spring boot项目部署linux系统tomcat报错解决办法
  8. Ranger-Yarn插件安装
  9. (转)正则表达式在ORACLE中的使用
  10. 常见色彩表(RGB)
  11. Chromecast 播放电脑本地视频
  12. 桌面计算机图标怎么取消,win7图标箭头怎么取消,win7去除电脑桌面图标箭头
  13. 关于OLAP数据仓库的归纳总结
  14. AD7606八通道AD采集模块测试
  15. LeetCode题解(0695):岛屿的最大面积(Python)
  16. 此计算机上无法找到autocad2017,主编操作win7系统安装autocad2017提示“无法定位inf文件ACAD.inf”的具体步骤...
  17. 实验二、贪吃蛇游戏开发
  18. SWFObject 2.0的使用说明
  19. 绕过discuz论坛阅读或下载权限
  20. Unity报错之【ArgumentOutOfRangeException: Index was out of range........】

热门文章

  1. 编译ffmpeg:libavdevice/xcbgrab.c:28:10: fatal error: xcb/xfixes.h: 没有那个文件或目录
  2. UBUNTU使用五笔98输入法
  3. C++中Vector/Map/List中尽量使用指针,避免直接保存对象
  4. Command(命令)
  5. jsp点击按钮弹出输入框_【问答3】需要点击虚拟键盘上发送(搜索)按钮的写法...
  6. python 直方图的绘制方法全解_5种方法教你用Python玩转histogram直方图
  7. 小红书支付老显示服务器开小差,常见问题
  8. java 数字任意三个数_求Java编程个猜数字游戏!任意输入个数根据提示大了或小了直到选对...
  9. python输入函数设计_(董付国)Python 学习笔记---Python函数设计与使用(3)
  10. java根据xsd验证json文件_JSON解析器之json schema校验及代码实现