ArcGIS紧凑型切片读取与应用2-webgis动态加载紧凑型切片(附源码)
系列文章目录
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 = ;
/// <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, , (int)file.Length);
//写入数据
bc.BundlxData = bufferfile;
}
using (FileStream file = new FileStream(cache.bundleFileName, FileMode.Open))
{
byte[] bufferfile = new byte[file.Length];
file.Read(bufferfile, , (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: %;
width: %;
margin: ;
padding: ;
}
</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:
});
var map = new ol.Map({
target: 'map',
layers: [
maplayer
],
view: new ol.View({
center: ol.proj.fromLonLat([104.41, 33.82]),
zoom:
})
});
</script>
3.结束
上面方法使用动态解析紧凑型切片的方式,实现webgis的实时加载功能,由于是动态解析文件,返回的效率不高,下一篇我们开发一个程序,实现从紧凑型切片批量转为分散型切片的方法。
百度网盘链接:https://pan.baidu.com/s/1I-Bj3EQSN57pQHvKZ2hBUA 提取码:lliw
github项目地址:https://github.com/HuHongYong/TilerArcgisBundle
作者:ATtuing
出处:http://www.cnblogs.com/ATtuing
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
ArcGIS紧凑型切片读取与应用2-webgis动态加载紧凑型切片(附源码)的更多相关文章
- arcgis api 4.x for js 结合 react 入门开发系列react全家桶实现加载天地图(附源码下载)
基于两篇react+arcgis的文章介绍,相信大家也能体会两者的开发区别了.在“初探篇”中作者也讲述了自己的选择,故废话不多说,本篇带大家体验在@arcgis/webpack-plugin环境下,使 ...
- arcgis api 3.x for js入门开发系列九热力图效果(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- arcgis api 3.x for js 入门开发系列十一地图统计图(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- arcgis api 3.x for js 入门开发系列八聚合效果(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- arcgis api 3.x for js 入门开发系列四地图查询(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- arcgis api 3.x for js 入门开发系列三地图工具栏(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- ArcGIS紧凑型切片读取与应用1-解析(附源码)
1.前言 ArcGIS 发布的切片服务分为紧凑型切片和传统的分散型切片以及最新ArcGIS por新增的矢量切片.传统的分散型切片面临的问题是文件个数太多,部署拷贝过程十分的耗时,紧凑型切片是对分散型 ...
- ArcGIS紧凑型切片读取与应用3-紧凑型批量转分散型(附源码)
1.前言 上篇介绍了webgis动态加载解析紧凑型切片的例子,现在我们使用逆向思维实现紧凑型切片转分散型切片,在实际工作中很有用处,紧凑型切片易于拷贝,但读取只有部署到Arcgis Server才行. ...
随机推荐
- hdu 5047 大数找规律
http://acm.hdu.edu.cn/showproblem.php?pid=5047 找规律 信kuangbin,能AC #include <stdio.h> #include & ...
- npm 及安装
一.npm nodejs使开发者摆脱了浏览器的束缚,一系列基于nodejs的应用和工具不断出现,无论是在node应用的开发,还是使用中,包管理都扮演着一个很重要的作用.NPM(node package ...
- EBS中 EXCEL 格式报表输出的公用API
http://blog.itpub.net/10359218/viewspace-752601/ 最近的项目上写了一个公用的API,很久以前就用EXCEL发布过报表,但从没想过写API来简化... ...
- 【转】ABP webapi三种方式
作者:圣杰 链接:https://www.jianshu.com/p/d14733432dc2 來源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1. 引言 上一节我们 ...
- hash的安全性
在区块链中,我们面临着两个问题: 隐私问题 快速对账问题 由于区块链中,每个人都存在着一个账本,当一个人有收入的时候,将会进行广播到所有人的账本,例如张三收入xxx钱,这样子所有的账本才能同步更新.但 ...
- zabbix 监控安装
注意:此篇是在安装好lnmp环境后才能部署的操作,所以,做之前准备好lnmp环境,或者可以参考我做的lnmp环境,之后接着此篇开始安装 监控系统Zabbix-3.2.1的安装 zabbix-serve ...
- 使用json-server模拟REST API
https://segmentfault.com/a/1190000005793257 在开发过程中,前后端不论是否分离,接口多半是滞后于页面开发的.所以建立一个REST风格的API接口,给前端页面提 ...
- 如何开启windows的linux子系统
win10一周年纪念版 1607的版本增加了bash,bash,bash,windows的shell中可以直接运行bash了. 下面说一下配置步骤: 1.设置 —更新和安全—针对开发人员,选择开发人 ...
- 06-01 Java 二维数组格式、二维数组内存图解、二维数组操作
二维数组格式1 /* 二维数组:就是元素为一维数组的一个数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的 ...
- Celery启动Django项目:Client sent AUTH, but no password is set 错误处理
celery -A CeleryTest worker -l info [2017-02-22 07:26:52,666: ERROR/MainProcess] consumer: Cannot co ...