系列文章目录

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 = ;
/// <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动态加载紧凑型切片(附源码)的更多相关文章

  1. arcgis api 4.x for js 结合 react 入门开发系列react全家桶实现加载天地图(附源码下载)

    基于两篇react+arcgis的文章介绍,相信大家也能体会两者的开发区别了.在“初探篇”中作者也讲述了自己的选择,故废话不多说,本篇带大家体验在@arcgis/webpack-plugin环境下,使 ...

  2. arcgis api 3.x for js入门开发系列九热力图效果(附源码下载)

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

  3. arcgis api 3.x for js 入门开发系列十一地图统计图(附源码下载)

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

  4. arcgis api 3.x for js 入门开发系列八聚合效果(附源码下载)

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

  5. arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)

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

  6. arcgis api 3.x for js 入门开发系列四地图查询(附源码下载)

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

  7. arcgis api 3.x for js 入门开发系列三地图工具栏(附源码下载)

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

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

    1.前言 ArcGIS 发布的切片服务分为紧凑型切片和传统的分散型切片以及最新ArcGIS por新增的矢量切片.传统的分散型切片面临的问题是文件个数太多,部署拷贝过程十分的耗时,紧凑型切片是对分散型 ...

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

    1.前言 上篇介绍了webgis动态加载解析紧凑型切片的例子,现在我们使用逆向思维实现紧凑型切片转分散型切片,在实际工作中很有用处,紧凑型切片易于拷贝,但读取只有部署到Arcgis Server才行. ...

随机推荐

  1. codeforces 455E

    题目:http://codeforces.com/problemset/problem/455/E 题意:给定数组a,及f的定义: f[1][j] = a[j];  1 <= j <= n ...

  2. [jquery]如何实现页面单块DIV区域滚动展示

    // 未实现功能的代码 1(自己写的代码) var _cur_top = $(window).scrollTop(); var num = $(".class_section"). ...

  3. uniGUI for C++ builder之杂七杂八小知识

    uniGUI for C++ builder之杂七杂八小知识 2018年09月30日 22:16:05 中国银行之路在脚下 阅读数:41 标签: uniguibuilder 更多 个人分类: C++ ...

  4. Spring下配置几种常用连接池

    1.连接池概述 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是 ...

  5. C#中解析JSON数据,并获取到其中的值

    1.应需求创建一个Json字符串 string json = "[{'Name':'张三','age':'20','Data':{'ID':100,'heigh':'180','weight ...

  6. 解决SHAREJPOINT 跨域问题

    目前仅支持IE7/8不支持IE11和谷歌 对于跨域情况,目前找到如果jquery是get获取方式,可以配置web.config相关属性,具体powershell命令如下: Add-PSSnapin M ...

  7. 背水一战 Windows 10 (40) - 控件(导航类): AppBar, CommandBar

    [源码下载] 背水一战 Windows 10 (40) - 控件(导航类): AppBar, CommandBar 作者:webabcd 介绍背水一战 Windows 10 之 控件(导航类) App ...

  8. 【UOJ244】 【UER #7】短路(贪心)

    传送门 uoj Solution 简单题? 考虑一条路径长什么样子,一定是经过某一个字母环的左上角,那么答案就很简单了. 我们记一个前缀最小值,这样子让他一路走下去一定是最优! 然后扫一遍就好了. 代 ...

  9. GoLang学习控制语句之if/else

    if语句 if 是用于测试某个条件(布尔型或逻辑型)的语句,如果该条件成立,则会执行 if 后由大括号括起来的代码块,否则就忽略该代码块继续执行后续的代码. if condition { // do ...

  10. day 71 crm(8) 权限组件的设置,以及权限组件的应用

    ---恢复内容开始--- 前情提要: strak 组件是增删改查组件 , 生活中,需求权限组件,  不足: 1,前后端不分离,   2, 空url也会刷新界面,造成资源浪费   3,如果角色忘记设置权 ...