天天看點

arcgis切片緊湊型_ArcGIS緊湊型切片讀取與應用3-緊湊型批量轉分散型(附源碼)

1.前言

上篇介紹了webgis動态加載解析緊湊型切片的例子,現在我們使用逆向思維實作緊湊型切片轉分散型切片,在實際工作中很有用處,緊湊型切片易于拷貝,但讀取隻有部署到Arcgis Server才行。相比分散型切片很通用可以部署在類似Geoewebcache的地圖緩存伺服器或者也可以直接部署到web伺服器下。

軟體核心功能:

arcgis切片緊湊型_ArcGIS緊湊型切片讀取與應用3-緊湊型批量轉分散型(附源碼)

(1)支援切片等級範圍選擇。

(2)支援切圖範圍的選擇,有利于局部資料的更新。

(3)支援多線程解析,充分利用系統資源,加快解析速率。

(4)檔案命名格式與Arcgis分散型切片相同。

2.核心代碼解析

1.首先要解析将輸入的坐标轉為切片對應x、y、z值

arcgis切片緊湊型_ArcGIS緊湊型切片讀取與應用3-緊湊型批量轉分散型(附源碼)

/// /// 通過經緯度擷取切片位置/// /// 緯度/// 經度/// 切片等級private double[] ConvertTile(double lat_deg, double lon_deg, int zoom)

{     double lat_rad = (Math.PI / 180) * lat_deg;     double n = Math.Pow(2, zoom);     double xtile = Math.Floor((lon_deg + 180.0) / 360.0 * n);     double ytile = Math.Floor((1.0 - Math.Log(Math.Tan(lat_rad) + (1 / Math.Cos(lat_rad))) / Math.PI) / 2.0 * n);     return new double[2] { xtile, ytile };

}

arcgis切片緊湊型_ArcGIS緊湊型切片讀取與應用3-緊湊型批量轉分散型(附源碼)

2.通過左上角坐标和右上角坐标,解析出指定切片等級下的所有緊湊型切片檔案

arcgis切片緊湊型_ArcGIS緊湊型切片讀取與應用3-緊湊型批量轉分散型(附源碼)

/// /// 擷取某一切片等級下的檔案對象/// /// /// 【x1,y1,x2,y2】/// private List GetLevelBundle(int level, int[] xy)

{

List bundleModelList = new List();     int minx = ((xy[0] + 1) / 128) * 128;     int maxx = ((xy[1] + 1) / 128) * 128;     int miny = ((xy[2] + 1) / 128) * 128;     int maxy = ((xy[3] + 1) / 128) * 128;     int xcount = (maxx - minx) / 128 + 1;     int ycount = (maxy - miny) / 128 + 1;     for (int x = 0; x 

{         for (int y = 0; y 

{

BundleModel bm = new BundleModel();

bm.StartX = minx + (x) * 128;

bm.StartY = miny + (y) * 128;             var rGroup = Convert.ToInt32(128 * Convert.ToInt32(bm.StartX / 128));             var cGroup = Convert.ToInt32(128 * Convert.ToInt32(bm.StartY / 128));             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;

}

arcgis切片緊湊型_ArcGIS緊湊型切片讀取與應用3-緊湊型批量轉分散型(附源碼)

3.多線程切片實作,将檔案平均分給不同線程

arcgis切片緊湊型_ArcGIS緊湊型切片讀取與應用3-緊湊型批量轉分散型(附源碼)

//将檔案平均分給各個線程int count = bundleModelList.Count() / threadcount;int yu = bundleModelList.Count() % threadcount;if (count == 0)

{     for (int i = 0; i 

{

List model = bundleModelList.Skip(i).Take(1).ToList();

System.Threading.ThreadPool.QueueUserWorkItem((state) =>

{             foreach (var item in model)

{

ToImg(item);

}             this.BeginInvoke(new Action(() =>

{

}));

}, model);

}

}else{     for (int i = 0; i 

{

List model = bundleModelList.Skip(i * count).Take(count).ToList();         if (i 

{

model.AddRange(bundleModelList.Skip(threadcount * count + i).Take(1).ToList());

}

System.Threading.ThreadPool.QueueUserWorkItem((state) =>

{             foreach (var item in model)

{

ToImg(item);

}             this.BeginInvoke(new Action(() =>

{

}));

}, model);

}

}

arcgis切片緊湊型_ArcGIS緊湊型切片讀取與應用3-緊湊型批量轉分散型(附源碼)

4.Arcgis散片檔案路徑格式的生成

arcgis切片緊湊型_ArcGIS緊湊型切片讀取與應用3-緊湊型批量轉分散型(附源碼)

string L="L"+ zeroPad(z, 2);string C = "C" + zeroPad(x, 8,1);string R = "R" + zeroPad(y, 8,1);//儲存路徑string path = textBox2.Text+"\\"+L+"\\"+R+"\\"+C+ ".png";//檔案命名函數private string zeroPad(int num, int len,int type=0)

{     string str = num.ToString();     if (type==1)

{

str = num.ToString("X");

}     while (str.Length 

{

str = "0" + str;

}     return str;

}

arcgis切片緊湊型_ArcGIS緊湊型切片讀取與應用3-緊湊型批量轉分散型(附源碼)

解析結果展示

arcgis切片緊湊型_ArcGIS緊湊型切片讀取與應用3-緊湊型批量轉分散型(附源碼)

3.結束

開啟多線程模式切片的速率比較滿意,通過比較簡單的代碼了解了緊湊型切片的所有的細節,我們現在完全可以實作散片型裝緊湊型的檔案,有興趣可以反推一下。所有的源代碼已近上傳到了GitHub,歡迎大家指教。

作者:ATtuing

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。