系列文章目录

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

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

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

1.前言

上篇介绍了webgis动态加载解析紧凑型切片的例子,现在我们使用逆向思维实现紧凑型切片转分散型切片,在实际工作中很有用处,紧凑型切片易于拷贝,但读取只有部署到Arcgis Server才行。相比分散型切片很通用可以部署在类似Geoewebcache的地图缓存服务器或者也可以直接部署到web服务器下。

软件核心功能:

(1)支持切片等级范围选择。

(2)支持切图范围的选择,有利于局部数据的更新。

(3)支持多线程解析,充分利用系统资源,加快解析速率。

(4)文件命名格式与Arcgis分散型切片相同。

2.核心代码解析

        1.首先要解析将输入的坐标转为切片对应x、y、z值

  1. /// <summary>
  2. /// 通过经纬度获取切片位置
  3. /// </summary>
  4. /// <param name="lat_deg">纬度</param>
  5. /// <param name="lon_deg">经度</param>
  6. /// <param name="zoom">切片等级</param>
  7. private double[] ConvertTile(double lat_deg, double lon_deg, int zoom)
  8. {
  9. double lat_rad = (Math.PI / ) * lat_deg;
  10. double n = Math.Pow(, zoom);
  11. double xtile = Math.Floor((lon_deg + 180.0) / 360.0 * n);
  12. double ytile = Math.Floor((1.0 - Math.Log(Math.Tan(lat_rad) + ( / Math.Cos(lat_rad))) / Math.PI) / 2.0 * n);
  13. return new double[] { xtile, ytile };
  14. }

       2.通过左上角坐标和右上角坐标,解析出指定切片等级下的所有紧凑型切片文件

  1. /// <summary>
  2. /// 获取某一切片等级下的文件对象
  3. /// </summary>
  4. /// <param name="level"></param>
  5. /// <param name="xy">【x1,y1,x2,y2】</param>
  6. /// <returns></returns>
  7. private List<BundleModel> GetLevelBundle(int level, int[] xy)
  8. {
  9. List<BundleModel> bundleModelList = new List<BundleModel>();
  10. int minx = ((xy[] + ) / ) * ;
  11. int maxx = ((xy[] + ) / ) * ;
  12. int miny = ((xy[] + ) / ) * ;
  13. int maxy = ((xy[] + ) / ) * ;
  14. int xcount = (maxx - minx) / + ;
  15. int ycount = (maxy - miny) / + ;
  16. for (int x = ; x < xcount; x++)
  17. {
  18. for (int y = ; y < ycount; y++)
  19. {
  20. BundleModel bm = new BundleModel();
  21. bm.StartX = minx + (x) * ;
  22. bm.StartY = miny + (y) * ;
  23. var rGroup = Convert.ToInt32( * Convert.ToInt32(bm.StartX / ));
  24. var cGroup = Convert.ToInt32( * Convert.ToInt32(bm.StartY / ));
  25. var bundleBase = getBundlePath(textBox1.Text, level, rGroup, cGroup);
  26. bm.Level = level;
  27. bm.BundlxDire = bundleBase + ".bundlx";
  28. bm.BundleDire = bundleBase + ".bundle";
  29. bm.BundleName = Path.GetFileNameWithoutExtension(bm.BundleDire);
  30. bundleModelList.Add(bm);
  31. }
  32. }
  33. return bundleModelList;
  34. }

    3.多线程切片实现,将文件平均分给不同线程

  1. //将文件平均分给各个线程
  2. int count = bundleModelList.Count() / threadcount;
  3. int yu = bundleModelList.Count() % threadcount;
  4.  
  5. if (count == )
  6. {
  7. for (int i = ; i < bundleModelList.Count; i++)
  8. {
  9. List<BundleModel> model = bundleModelList.Skip(i).Take().ToList();
  10. System.Threading.ThreadPool.QueueUserWorkItem((state) =>
  11. {
  12. foreach (var item in model)
  13. {
  14. ToImg(item);
  15. }
  16. this.BeginInvoke(new Action(() =>
  17. {
  18.  
  19. }));
  20. }, model);
  21. }
  22. }
  23. else
  24. {
  25. for (int i = ; i < threadcount; i++)
  26. {
  27. List<BundleModel> model = bundleModelList.Skip(i * count).Take(count).ToList();
  28. if (i < yu)
  29. {
  30. model.AddRange(bundleModelList.Skip(threadcount * count + i).Take().ToList());
  31. }
  32. System.Threading.ThreadPool.QueueUserWorkItem((state) =>
  33. {
  34. foreach (var item in model)
  35. {
  36. ToImg(item);
  37. }
  38. this.BeginInvoke(new Action(() =>
  39. {
  40.  
  41. }));
  42. }, model);
  43. }
  44. }

    4.Arcgis散片文件路径格式的生成

  1. string L="L"+ zeroPad(z, );
  2. string C = "C" + zeroPad(x, ,);
  3. string R = "R" + zeroPad(y, ,);
  4.  
  5. //保存路径
  6. string path = textBox2.Text+"\\"+L+"\\"+R+"\\"+C+ ".png";
  7.  
  8. //文件命名函数
  9.  
  10. private string zeroPad(int num, int len,int type=)
  11. {
  12. string str = num.ToString();
  13. if (type==)
  14. {
  15. str = num.ToString("X");
  16. }
  17. while (str.Length < len)
  18. {
  19. str = "" + str;
  20. }
  21. return str;
  22. }

解析结果展示

3.结束

     开启多线程模式切片的速率比较满意,通过比较简单的代码理解了紧凑型切片的所有的细节,我们现在完全可以实现散片型装紧凑型的文件,有兴趣可以反推一下。所有的源代码已近上传到了GitHub,欢迎大家指教。

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

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

作者:ATtuing

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

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

ArcGIS紧凑型切片读取与应用3-紧凑型批量转分散型(附源码)的更多相关文章

  1. spring应用中多次读取http post方法中的流(附源码)

    一.问题简述 先说下为啥有这个需求,在基于spring的web应用中,一般会在controller层获取http方法body中的数据. 方式1: 比如http请求的content-type为appli ...

  2. arcgis api 4.x for js 图层拓展篇之mapvLayer(附源码下载)

    因为在项目开发过程中,使用的arcgis js api版本是4.7,并不能支持客户端渲染热力图,想到arcgis js api 4.x的渲染是基于canvas,故琢磨着是否能借助类似于mapV.ech ...

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

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

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

    1.前言 上篇主要讲了一下紧凑型切片的的解析逻辑,这一篇主要讲一下使用openlayers动态加载紧凑型切片的web地图服务. 2.代码实现 上篇已经可以通过切片的x.y.z得对应的切片图片,现在使用 ...

  5. 开源方案搭建可离线的精美矢量切片地图服务-8.mapbox 之sprite大图图标文件生成(附源码)

    项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...

  6. arcgis api 3.x for js 解决 textSymbol 文本换行显示(附源码下载)

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

  7. 读取xml文件转成List<T>对象的两种方法(附源码)

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

  8. ASP.NET程序读取二代身份证(附源码)

    原文:ASP.NET程序读取二代身份证(附源码) 一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一 ...

  9. arcgis api 3.x for js 入门开发系列批量叠加 zip 压缩 SHP 图层优化篇(附源码下载)

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

随机推荐

  1. 牛客网2018暑期训练 第三场 a题

    #include <bits/stdc++.h> using namespace std; vector<int> path; ; short dp[maxn][maxn][m ...

  2. EBS中查看其他用户或所有用户的请求和输出文件

      R12: How To Configure Access To Request Output Of The Same Responsibility (Doc ID 804296.1) To Bot ...

  3. mooctest项目总结 【转载】

    原文链接 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3 ...

  4. 第42件事 移动App设计的11大法则

    移动App设计的重要法则指的是我们在设计App需要遵守的一些设计规范和法则,这些法则就好像一些行为规范一样. 1.导航手机客户端上的主导航(一级导航)如图6-22所示. 对图6-22中所示的几个主导航 ...

  5. 几款移动跨平台App开发框架比较

    整理目前流行的跨平台WebApp开发技术的特点,仅供参考. 每个框架几乎都包含以下特性: 使用 HTML5 + CSS + JavaScript 开发 跨平台重用代码 丰富的UI库 提供访问设备原生A ...

  6. C#之WinForm设置控件居中

    简单阐述 在C#的WinForm里面,原生控件是没有居中属性的,故通过重写OnResize(EventArgs e)方法,通过计算,重新定位控件位置. 以Label控件为例 (1)将label的Aut ...

  7. Nginx负载均衡初识

    1.背景 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外ngi ...

  8. Linux常用命令 - ls

    目录 Linux常用命令-ls 简介 ls -F ls -a ls -R ls -l 后记 Linux常用命令-ls 简介 ls主要用于显示文件和目录列表.作为最常见的Linux命令,大家应该都不会陌 ...

  9. 【文文殿下】NOIp2018游记

    Day-1 本段更新于 2018年11月8日23:26:44 今天还在机房里面,无所事事吧.上午睡了一上午,出去理了一下发,花了20块钱 QAQ. 下午来到机房,复习了一下exgcd的东西. 发现自己 ...

  10. linux防火墙(三)—— iptables语法之匹配条件

    一.iptables规则的匹配条件类型有三类 1.通用匹配:可直接使用,不依赖于其他条件或扩展,包括网络协议.IP地址.网络接口等条件 2.隐含匹配:要求以特定的协议匹配作为前提,包括端口.TCP标记 ...