系列文章目录

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

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

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

1.前言

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

软件核心功能:

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

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

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

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

2.核心代码解析

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

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

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

/// <summary>
/// 获取某一切片等级下的文件对象
/// </summary>
/// <param name="level"></param>
/// <param name="xy">【x1,y1,x2,y2】</param>
/// <returns></returns>
private List<BundleModel> GetLevelBundle(int level, int[] xy)
{
List<BundleModel> bundleModelList = new List<BundleModel>();
int minx = ((xy[] + ) / ) * ;
int maxx = ((xy[] + ) / ) * ;
int miny = ((xy[] + ) / ) * ;
int maxy = ((xy[] + ) / ) * ;
int xcount = (maxx - minx) / + ;
int ycount = (maxy - miny) / + ;
for (int x = ; x < xcount; x++)
{
for (int y = ; y < ycount; y++)
{
BundleModel bm = new BundleModel();
bm.StartX = minx + (x) * ;
bm.StartY = miny + (y) * ;
var rGroup = Convert.ToInt32( * Convert.ToInt32(bm.StartX / ));
var cGroup = Convert.ToInt32( * Convert.ToInt32(bm.StartY / ));
var bundleBase = getBundlePath(textBox1.Text, level, rGroup, cGroup);
bm.Level = level;
bm.BundlxDire = bundleBase + ".bundlx";
bm.BundleDire = bundleBase + ".bundle";
bm.BundleName = Path.GetFileNameWithoutExtension(bm.BundleDire);
bundleModelList.Add(bm);
}
}
return bundleModelList;
}

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

//将文件平均分给各个线程
int count = bundleModelList.Count() / threadcount;
int yu = bundleModelList.Count() % threadcount; if (count == )
{
for (int i = ; i < bundleModelList.Count; i++)
{
List<BundleModel> model = bundleModelList.Skip(i).Take().ToList();
System.Threading.ThreadPool.QueueUserWorkItem((state) =>
{
foreach (var item in model)
{
ToImg(item);
}
this.BeginInvoke(new Action(() =>
{ }));
}, model);
}
}
else
{
for (int i = ; i < threadcount; i++)
{
List<BundleModel> model = bundleModelList.Skip(i * count).Take(count).ToList();
if (i < yu)
{
model.AddRange(bundleModelList.Skip(threadcount * count + i).Take().ToList());
}
System.Threading.ThreadPool.QueueUserWorkItem((state) =>
{
foreach (var item in model)
{
ToImg(item);
}
this.BeginInvoke(new Action(() =>
{ }));
}, model);
}
}

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

string L="L"+ zeroPad(z, );
string C = "C" + zeroPad(x, ,);
string R = "R" + zeroPad(y, ,); //保存路径
string path = textBox2.Text+"\\"+L+"\\"+R+"\\"+C+ ".png"; //文件命名函数 private string zeroPad(int num, int len,int type=)
{
string str = num.ToString();
if (type==)
{
str = num.ToString("X");
}
while (str.Length < len)
{
str = "" + str;
}
return str;
}

解析结果展示

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. JS中访问对象的两种方式区别

    可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名["方法名"]() var obj = { n ...

  2. Android自适应屏幕的实现方法

    首先我们先了解下手机分辨率 分辨率是指屏幕上有横竖各有多少个像素目前手机分辨率大概情况如下: QVGA 分辨率:320×240 简    介:QVGA即"Quarter VGA". ...

  3. centos下添加git

    CentOS中yum里没有Git,需要手动安装. 首先需要安装git的依赖包 yum install curl yum install curl-devel yum install zlib-deve ...

  4. poj 3264 区间最大最小值 RMQ问题之Sparse_Table算法

    Balanced Lineup Time Limit: 5000 MS Memory Limit: 0 KB 64-bit integer IO format: %I64d , %I64u Java ...

  5. WPF实战案例-打印

    在前段时间做了一下打印,因为需要支持的格式比较多,所以wpf能打印的有限分享一下几种格式的打印(.xls .xlsx .doc .docx .png .jpg .bmp .pdf) 首先为了保证exc ...

  6. EF架构获取数据时报错:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. Do you want to correct the value?

    场景: EF底层,获取完主表,点击按钮,添加主表,字表内容时,报以上错误 解决方案: 在EF文件的空白处右键--属性,将“应用延迟加载”,改为False

  7. UWP 使用Windows Community Toolkit 的OneDrive service上传下载文件

    上一年年底写过两篇文章 UWP 使用OneDrive云存储2.x api(一)[全网首发] UWP 使用OneDrive云存储2.x api(二)[全网首发] 没想到半年之后,VS编译提示方法已经过时 ...

  8. 解决SHAREJPOINT 跨域问题

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

  9. 小猴打架(luogu4430)(数论+生成树计数)

    一开始森林里面有\(N\)只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过\(N-1\)次打架之后,整个森林的小猴 ...

  10. spring cloud学习(五) 配置中心

    Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持.配置服务中心采用Git的方式存储配置文件,因此我们很容易部署修改,有助于对环境配置进行版本管理. 一.配置中心 ...