ArcGIS紧凑型切片读取与应用2-webgis动态加载紧凑型切片(附源码)
系列文章目录
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动态加载紧凑型切片(附源码)相关推荐
- arcgis xml 下载 切片_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...
内容概览 1.openlayers6结合geoserver利用WFS服务实现图层编辑功能 2.源代码demo下载 效果图如下: 本篇主要是参照openlayers6结合geoserver利用WFS服务 ...
- arcgis xml 下载 切片_arcgis api 4.x for js地图加载arcgisserver本地离线瓦片(附源码下载)...
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...
- arcgis开发 多版本之间如何兼容_arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)...
你还在使用 JQuery 或者 Dojo 框架开发 arcgis api 4.x for js 吗?想试试模块化开发吗?随着前端技术的发展,arcgis api 4.x for js 也有了结合 re ...
- 读取xml文件转成ListT对象的两种方法(附源码)
读取xml文件转成List<T>对象的两种方法(附源码) 读取xml文件,是项目中经常要用到的,所以就总结一下,最近项目中用到的读取xml文件并且转成List<T>对象的方法, ...
- WebGIS——Openlayers加载图层
Openlayers加载图层 一.创建Html文件并在body中放入一个Div作为地图显示的容器 <body><div id="map" class=" ...
- C#实现excel文件的读取、写入以及异常处理,附源码程序
C#实现excel文件的读取与写入,附源码程序 说明 关键代码段 源程序下载地址 注意事项及异常解决 说明 通过OleDB方式,对execl文件进行读取.写入操作. 注:网上很多类似的代码,但是代码中 ...
- STM32F4 读取双相编码器(附源码)
STM32F4 读取AB相编码器(附源码) 1. 原理 1.1 AB相编码器 AB相编码器,简而言之,就是有两路输出的脉冲信号,通过对脉冲计数,可以知道转动了多少角度. 读取编码器的数据也就是要让单片 ...
- mapbox矢量切片标准_Cesium 加载矢量切片(MapBox Vector Tile)
矢量切片(vector tile)是当前 WebGIS 较热技术,国内的高德.百度等在线地图都使用了矢量切片技术.相较于传统栅格切片,矢量切片好处很多.简单几点就是:轻量.客户端渲染.还可加密(栅格切 ...
- arcgis api 3.x for js 入门开发系列二不同地图服务展示(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- mysql 读取文件_关于mysql:逐行读取文件而不将整个文件加载到内存中
我正在使用50 Gb MySQL导出文件,并对其执行脚本操作列表以转换为SQLite3可加载形式(我从这里得到的线索:脚本将mysql dump sql文件转换为可以导入sqlite3的格式D b ) ...
最新文章
- $\mathbf{R}^n$中的紧集是闭有界集
- android使用桢布局,Android性能优化UI篇
- 神策数据入选铅笔道 2021 真榜“企业服务未来独角兽排行榜·营销与销售 TOP20”...
- 内存泄漏MobX State Tree_[译]iOS Crash Dump Analysis 错误的内存崩溃
- android调用网页方法,Android调用手机浏览器的正确方式
- WritePrivateProfileString等读写.ini配置文件
- linux部署jar项目报错_Spring boot项目部署linux系统tomcat报错解决办法
- Ranger-Yarn插件安装
- (转)正则表达式在ORACLE中的使用
- 常见色彩表(RGB)
- Chromecast 播放电脑本地视频
- 桌面计算机图标怎么取消,win7图标箭头怎么取消,win7去除电脑桌面图标箭头
- 关于OLAP数据仓库的归纳总结
- AD7606八通道AD采集模块测试
- LeetCode题解(0695):岛屿的最大面积(Python)
- 此计算机上无法找到autocad2017,主编操作win7系统安装autocad2017提示“无法定位inf文件ACAD.inf”的具体步骤...
- 实验二、贪吃蛇游戏开发
- SWFObject 2.0的使用说明
- 绕过discuz论坛阅读或下载权限
- Unity报错之【ArgumentOutOfRangeException: Index was out of range........】
热门文章
- 编译ffmpeg:libavdevice/xcbgrab.c:28:10: fatal error: xcb/xfixes.h: 没有那个文件或目录
- UBUNTU使用五笔98输入法
- C++中Vector/Map/List中尽量使用指针,避免直接保存对象
- Command(命令)
- jsp点击按钮弹出输入框_【问答3】需要点击虚拟键盘上发送(搜索)按钮的写法...
- python 直方图的绘制方法全解_5种方法教你用Python玩转histogram直方图
- 小红书支付老显示服务器开小差,常见问题
- java 数字任意三个数_求Java编程个猜数字游戏!任意输入个数根据提示大了或小了直到选对...
- python输入函数设计_(董付国)Python 学习笔记---Python函数设计与使用(3)
- java根据xsd验证json文件_JSON解析器之json schema校验及代码实现