根据范围获取影像瓦片,并生成GeoTIFF 文件《一》

第一步 :根据查询的坐标范围,提取bundle紧凑型切片文件中的 图片,并保存

输入参数:  四值数值  xmax,xmin,ymax,ymin,

                    切片原点:Xorigin  Yorigin

 private void  TEST()
        {
            CArcGIS103CacheInfo.OriginX = Xorgin;
            CArcGIS103CacheInfo.OriginY = Yorgin;
            CArcGIS103CacheInfo.resolution = resolution;
            int rowNum1; int colNum1;
            CArcGIS103CacheInfo.GetRowColNumber(Xmin, Ymax, out rowNum1, out colNum1);
            int rowNum2;int colNum2;
            CArcGIS103CacheInfo.GetRowColNumber(Xmax, Ymax, out rowNum2, out colNum2);
            int rowNum3;int colNum3;
            CArcGIS103CacheInfo.GetRowColNumber(Xmin, Ymin, out rowNum3, out colNum3);
            int rowNum4; int colNum4;
            CArcGIS103CacheInfo.GetRowColNumber(Xmax, Ymin, out rowNum4, out colNum4);

            int rowNummin = rowNum2;
            int rowNummax = rowNum3;
            int colNummin = colNum1;
            int colNummax = colNum2;
            int disRow = rowNummax - rowNummin;
            int disCol = colNummax - colNummin;
            int a = 1;
            //*********计算左上角坐标
            double ZSJ_x = Xorgin - colNum1 * (-1)*256*resolution;
            double ZSJ_y = Yorgin - (rowNum1) * 256 * resolution;
            

            double XXmax=Xorgin-(colNum2+1)*(-1) * 256 * resolution;
            double YYmax= Yorgin -( rowNum2) * 256 * resolution;

            double  XXmin= Xorgin - (colNum1 ) * (-1) * 256 * resolution;
            double YYmin= Yorgin - (rowNum3+1)  * 256 * resolution;

            /*
            double Xmin = 290657.60;
            double Ymin = 3211323.2;
            double Xmax = 422902.2;
            double Ymax = 3371264.00;



            *****/

            int b = 0;
            Console.WriteLine(DateTime.Now.ToString());
            GetJinCou2SongSan(rowNummin, rowNummax, colNummin, colNummax);
            Console.WriteLine(DateTime.Now.ToString());
        }
 //***** 根据 row  Col   读取切片 ,将紧凑型 转为松散型   *****/

        private  void  GetJinCou2SongSan(int rowNummin,int rowNummax,int colNummin,int colNummax)
        {
            for(int i=rowNummin;i<=rowNummax;i++)
            {
                for(int j=colNummin;j<=colNummax;j++)
                {



                    GetJinCou2SongSan2(i, j, "L08");


                }


            }
        }

        private void GetJinCou2SongSan2(int row,int col,string mlevel)
        {
           
            string col16 = col.ToString("X"); //00A1  16进制的文件名
           
            string row16 = row.ToString("X");//00C5   16进制的文件名

            //计算bundle文件名 

            double rowgroupd = (double)(row / PacketSize);
            int rowgroup = (int)(PacketSize * Math.Floor(rowgroupd));
            double colgroupd = (double)(col / PacketSize);
            int colgroup = (int)(PacketSize * Math.Floor(colgroupd));
            string rowgroup16 = rowgroup.ToString("X");//80
            string colgroup16 = colgroup.ToString("X");//80
            if (rowgroup16.Length < 4)
            {
                int l = 4 - rowgroup16.Length;
                for (int i = 0; i < l; i++)
                {
                    rowgroup16 = "0" + rowgroup16;

                }
            }

            if (colgroup16.Length < 4)
            {
                int lm = 4 - colgroup16.Length;
                for (int i = 0; i < lm; i++)
                {
                    colgroup16 = "0" + colgroup16;

                }
            }
            //获取切片所在的bundle 文件
            string bundlename = @"E:\2019\ArcGIS10.3\_alllayers\" + mlevel + "\\" + "R" + rowgroup16 + "C" + colgroup16 + ".bundle";
            int index = PacketSize * (row - rowgroup) + (col - colgroup);

            FileStream inBundle = new FileStream(bundlename, FileMode.Open, FileAccess.Read);
            inBundle.Seek(64 + 8 * index, SeekOrigin.Begin);
            //获取位置索引并计算切片位置偏移量
            byte[] indexBytes = new byte[4];
            inBundle.Read(indexBytes, 0, 4);
            long offset = (long)(indexBytes[0] & 0xff) + (long)(indexBytes[1] & 0xff) * 256 + (long)(indexBytes[2] & 0xff) * 65536
                                + (long)(indexBytes[3] & 0xff) * 16777216;
            long startOffset = offset - 4;
            inBundle.Seek(startOffset, SeekOrigin.Begin);
            byte[] lengthBytes = new byte[4];
            inBundle.Read(lengthBytes, 0, 4);
            int length = (int)(lengthBytes[0] & 0xff) + (int)(lengthBytes[1] & 0xff) * 256 + (int)(lengthBytes[2] & 0xff) * 65536
                        + (int)(lengthBytes[3] & 0xff) * 16777216;
            //根据切片位置和切片长度获取切片

            byte[] tileBytes = null;
            tileBytes = new byte[length];
            int bytesRead = 0;
            if (length > 4)
            {
                bytesRead = inBundle.Read(tileBytes, 0, tileBytes.Length);
            }
            else
            {
                tileBytes = null;
            }
            string outfilename = @"E:\2019\ArcGIS10.3\L08Song" + "\\" + "R" + row + "C" + col + ".png";
            using (FileStream stream = new FileStream(outfilename, FileMode.OpenOrCreate))
            {
                stream.Write(tileBytes, 0, tileBytes.Length);
            }

        }

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestReadArcgGISCache
{
    class CArcGIS103CacheInfo
    {
        public   static double OriginX;
        public   static double OriginY;
        public    static double resolution;
       public  static void GetRowColNumber(double x,double y,out int RowNum,out int ColNum)
        {

            double colx = Math.Abs((OriginX - x)) / (256 * resolution);
            ColNum = (int)Math.Floor(colx);

            double rowx = (OriginY - y) / (256 * resolution);
             RowNum = (int)Math.Floor(rowx);

            
        }
    }
}

  

posted on 2019-04-19 13:57  markygis  阅读(1257)  评论(0编辑  收藏  举报