实例介绍
【实例截图】
【核心代码】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OSGeo.GDAL;
using System.IO;
using System.Data.OracleClient;
using System.Data.OleDb;
namespace GDALRead
{
public struct point
{
public float x, y;
public point(float x, float y)
{
this.x = x; this.y = y;
}
}
public partial class Form1 : Form
{
int[,] _data = new int[16, 16];
List<int[]> _QTree = new List<int[]>();
int s = 0;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Gdal.AllRegister();
// string fileName = @"E:\img\jiangxueying.img";
string fileName = @"E:\img\11.tif";
Dataset DEMdata = Gdal.Open(fileName, Access.GA_ReadOnly);
if (DEMdata == null)
{
MessageBox.Show("不能打开:" fileName);
return;
}
int size = DEMdata.RasterCount;//影像大小
int xsize = DEMdata.RasterXSize;//行
int ysize = DEMdata.RasterYSize;//列
Band DEMband = DEMdata.GetRasterBand(1);//波段
double val;
int hasval;
DEMband.GetMinimum(out val, out hasval);
if (hasval != 0)
{
string strmin = val.ToString();
}
DEMband.GetMaximum(out val, out hasval);
if (hasval != 0)
{
string strmax = val.ToString();
}
string strProjection = DEMdata.GetProjectionRef();//投影信息
//输出图像的坐标和分辨率信息
double[] adfGeoTransform = new double[6];
DEMdata.GetGeoTransform(adfGeoTransform);
string strOrigin = adfGeoTransform[0] "," adfGeoTransform[3];
string strPixelsize = adfGeoTransform[1] "," adfGeoTransform[5];
double a;
DEMband.GetNoDataValue(out a, out hasval);
int[] DEM = new int[xsize * ysize];
DEMband.ReadRaster(0, 0, xsize, ysize, DEM, xsize, ysize, 0, 0);
int t1 = 0;
AllDEM = new int[xsize, ysize];
for (int i = 0; i < xsize; i )
{
for (int j = 0; j < ysize; j )
{
AllDEM[i, j] = DEM[t1];
t1 ;
}
}
//OpenFileDialog opF = new OpenFileDialog();
//string[] lines = System.IO.File.ReadAllLines(@"E:\新建文本文档.txt", Encoding.Default);//读取文件
//double[,] data = new double[lines.Length, lines[0].Split(',').Length];//将相应的数据存入数组中并赋值;
//for (int i = 0; i < lines.Length; i )
//{//
//for (int j = 0; j < lines[0].Split(',').Length; j )
//{
//data[i, j] = double.Parse(lines[i].Split(',')[j]);
//}
//}
int[,] element_data = element_array(AllDEM, 256);
int[][,] child = new int[element_data.GetLength(0) * element_data.GetLength(1) / 256 / 256][,];
int count = 0;
string[][] all = new string[child.GetLength(0) * 256 * 256][];
Point[][] p = depart(element_data, 256);
string[][,] result = new string[child.GetLength(0)][,];
string lll;
for (int i = 0; i < child.GetLength(0); i )
{
child[i] = index(element_data, p[i]);
if (i == 132)
lll = "";
result[i] = quadtree(child[i]);
for (int j = 0; j < result[i].GetLength(0); j )
{
if (result[i][j, 0] == null && result[i][j, 1] == null || result[i][j, 1] == "0")
continue;
all[count] = new string[3];
all[count][0] = result[i][j, 0]; all[count][1] = result[i][j, 1]; all[count][2] = i.ToString();
count ;
}
}
MessageBox.Show("数据获取完毕,四叉分成功");
}
////计算morton值的方法
//public int GetMorton(int row, int column)
//{
// int i = 0;
// string c2 = "";
// string r = Convert.ToString(row, 2);
// string c = Convert.ToString(column, 2);
// if (r.Length > c.Length)
// {
// i = r.Length - c.Length;
// for (int a = 0; a < i; a )
// {
// c2 = "0" c2;
// }
// c = c2 c;
// }
// else
// {
// i = c.Length - r.Length;
// for (int a = 0; a < i; a )
// {
// c2 = "0" c2;
// }
// r = c2 r;
// }
// StringBuilder strBu = new StringBuilder();
// char[] rchar = r.ToCharArray();
// char[] cchar = c.ToCharArray();
// for (int j = 0; j < r.Length; j )
// {
// strBu.Append(rchar[j]);
// strBu.Append(cchar[j]);
// }
// string result = strBu.ToString();
// int result10 = Convert.ToInt32(result, 2);
// return result10;
//}
//private void button2_Click(object sender, EventArgs e)
//{{
// //读取txt文件
// //1.读取morton
// OpenFileDialog opF = new OpenFileDialog();
// }
// string s = "2";
//}
//非静态字段访问有疑问,上个程序可以直接访问非静态的
//public static double[,] result = new double[265 * 265, 3];
public static string[,] quad = new string[2048 * 2048, 2];
public static int[][,] value1 = new int[2048 * 2048 1][,];
/* extern */
private int[,] AllDEM;
public static int[,] element_array(int[,] x, int a) //将数组的行列数扩大至64的倍数,补充的元素的数值默认为0;
{
int a1 = x.GetLength(0), a2 = x.GetLength(1);
int add1 = a1 % a, add2 = a2 % a;
int new_x = a1 a - add1, new_y = a2 a - add2;//存放新数组的行列号;
if (add1 == 0)
{
new_x = a1;
}
if (add2 == 0)
{
new_y = a2;
}
int[,] extend = new int[new_x, new_y];
for (int i = 0; i < x.GetLength(0); i )
{
for (int j = 0; j < x.GetLength(1); j )
{
extend[i, j] = x[i, j];
}
}
return extend;
}
public static Point[][] depart(int[,] x, int a)//将图像分成a*a的小块,并以坐标形式返回他们小块的坐上和右下的行列号(对角上的两点可以确定一个矩形);
{
int t2 = x.GetLength(0) * x.GetLength(1) / a / a; //表示分成的总块数
int t1 = 0;
Point[][] position = new Point[t2][];
for (int i = 0; i < t2; i )
{
position[i] = new Point[2];//以二维坐标数组存放块所在的位置
}
for (int i = 0; i < x.GetLength(0) / a; i )
{
for (int j = 0; j < x.GetLength(1) / a; j )
{
position[t1][0].X = i * a;
position[t1][0].Y = j * a;
position[t1][1].X = (i 1) * a;
position[t1][1].Y = (j 1) * a;
t1 ;
}
}
return position;
}
public static int[,] index(int[,] x, Point[] p)//根据序列号索引至相应的块;
{
int a = p[1].X - p[0].X;
int[,] mass = new int[a, a];
for (int i = 0; i < a; i )
{
for (int j = 0; j < a; j )
{
mass[i, j] = x[i p[0].X, j p[0].Y];
}
}
return mass;
}
public static bool compared(int[,] x)//判断数组A中的元素是否全部相等,若不全等则返回false,否则返回true;
{
bool judge = true;
for (int i = 0; i < x.GetLength(0); i )
{
for (int j = 0; j < x.GetLength(1); j )
{
if (i == 0 && j == 0)
continue;
else if (i != 0 && j == 0)
{ if (x[i, j] != x[i - 1, x.GetLength(1) - 1]) { judge = false; return judge; } }
//需要添加排除J=0时,j-1为负数的情况
else if (x[i, j] != x[i, j - 1]) { judge = false; return judge; }
}
}
return judge;
}
public static int[][,] quarter(int[,] value)//四分,并返回四分后的四个二维数组,按行为先;
{
int[][,] child = new int[4][,];
Point[][] p = depart(value, value.GetLength(0) / 2);//先得到四分后子数列的行列号;
for (int i = 0; i < 4; i )//根据行列号给四个子数列赋值;
{
child[i] = new int[value.GetLength(0) / 2, value.GetLength(1) / 2];
child[i] = index(value, p[i]);
}
return child;
}
public static string[,] quadtree(int[,] value)//四叉分,将属性值不同的进行四差分,相同的则暂停输出相应的属性值和moton码
{
int t = 0;
//可实现的嵌套循环
if (!compared(value))
{
for (int i = 0; i < 4; i )
{
string s;
int[,] value1 = quarter(value)[i];
s = i.ToString();
if (!compared(value1))
{
for (int j = 0; j < 4; j )
{
int[,] value2 = quarter(value1)[j];
string s1 = s j.ToString();
if (!compared(value2))
{
for (int k = 0; k < 4; k )
{
int[,] value3 = quarter(value2)[k];
string s2 = s1 k.ToString();
if (!compared(value3))
{
for (int k1 = 0; k1 < 4; k1 )
{
int[,] value4 = quarter(value3)[k1];
string s4 = s2 k1.ToString();
if (!compared(value3))
{
for (int k2 = 0; k2 < 4; k2 )
{
int[,] value5 = quarter(value4)[k2];
string s5 = s4 k2.ToString();
if (!compared(value3))
{
for (int k3 = 0; k3 < 4; k3 )
{
int[,] value6 = quarter(value5)[k3];
string s6 = s5 k3.ToString();
if (!compared(value3))
{
for (int k4 = 0; k4 < 4; k4 )
{
int[,] value7 = quarter(value6)[k4];
string s7 = s6 k4.ToString();
if (!compared(value7))
{
for (int l = 0; l < 4; l )
{
int[,] value11 = quarter(value7)[l];
string s3 = s7 l.ToString();
quad[t, 0] = s3;
quad[t, 1] = value11[0, 0].ToString();
t ;
}
}
else {
quad[t, 0] = s7;
quad[t, 1] = value7[0, 0].ToString();
t ;
}
}
}
else {
quad[t, 0] = s6;
quad[t, 1] = value6[0, 0].ToString();
t ;
}
}
}
else {
quad[t, 0] = s5;
quad[t, 1] = value5[0, 0].ToString();
t ;
}
}
}
else {
quad[t, 0] = s4;
quad[t, 1] = value4[0, 0].ToString();
t ;
}
}
}
else {
quad[t, 0] = s2;
quad[t, 1] = value3[0, 0].ToString();
t ;
}
}
}
else {
quad[t, 0] = s1;
quad[t, 1] = value2[0, 0].ToString();
t ;
}
}
}
else {
quad[t, 0] = s;
quad[t, 1] = value1[0, 0].ToString();
t ;
}
}
}
else {
quad[t, 0] = "-0";
quad[t, 1] = value[0, 0].ToString();
t ;
}
////递归的过程可能错了;
////因为moton码和属性值对不上,moton码出错
//value1[0] = value;
//if (!compared(value1[t]))
//{
// for (int i = 0; i < 4; i )
// {
// value1[t] = quarter(value)[i];
// if (!compared(value1[t]))
// {
// quad[t, 0] = i.ToString();
// quadtree(value1[t]);
// }
// else
// {
// quad[t, 0] = i.ToString();
// quad[t, 1] = value1[t][0, 0].ToString();
// t ;
// }
// }
//}
//else {
// quad[t, 0] = "-0";
// quad[t, 1] = value[0, 0].ToString();
// t ;
//}
string[,] quad1 = new string[t, 2];
for (int i = 0; i < t; i )
{
quad1[i, 0] = quad[i, 0];
quad1[i, 1] = quad[i, 1];
//这里有错需要改正不是t,是i;
}
return quad1;
}
//public static double[][,] reback_piece(double[][,])//将整个表中的属性值以及moton码还原为a*a的块;
//{
//}
private void 文件ToolToolStripMenuItem_Click(object sender, EventArgs e)
{
//打开txt文件
openFD.Filter = "文本文件(*.txt)|*.txt";
if (openFD.ShowDialog() == DialogResult.OK && File.Exists(openFD.FileName))
{
FileStream str = new FileStream(openFD.FileName, FileMode.Open);
StreamReader reader = new StreamReader(str);
try
{
string rline;
int i = 0;
//_data = null;
while ((rline = reader.ReadLine()) != null)
{
//if (_data != null)
//{
string[] s = rline.Split(',');
for (int j = 0; j < s.Length; j )
{
if (s[j] != "")
_data[i, j] = Convert.ToInt32(s[j]);
}
i ;
//}
//else
//{
// string[] s = rline.Split(',');
// _data = new int[Convert.ToInt16(s[0]), Convert.ToInt16(s[1])];
//}
}
int q = 0;
int o = 0;
ShowData(_data.GetLength(0), _data.GetLength(1));
}
catch
{
MessageBox.Show("打开文件出错!", "错误");
}
finally
{
reader.Dispose();
reader.Close();
str.Dispose();
str.Close();
}
}
}
private void ShowData(int n, int m)
{
if (_data != null)
{
s = Convert.ToInt16(Math.Log(n, 2));
listView_data.Columns.Add("行\\列");
listView_Morton.Columns.Add("行\\列");
for (int i = 0; i < n; i )
{
listView_data.Columns.Add(DtoB(i, s));
listView_Morton.Columns.Add(DtoB(i, s));
}
for (int i = 0; i < m; i )
{
ListViewItem item = new ListViewItem(DtoB(i, s));
ListViewItem item_M = new ListViewItem(DtoB(i, s));
for (int j = 0; j < n; j )
{
int[] QTItem = new int[3];
QTItem[2] = s; QTItem[1] = _data[i, j];
QTItem[0] = Convert.ToInt16(DtoB(i, s)) * 2 Convert.ToInt16(DtoB(j, s));
item.SubItems.Add(_data[i, j].ToString());
string Mt = (QTItem[0]).ToString();
while (Mt.Length < s)
Mt = "0" Mt;
item_M.SubItems.Add(Mt);
_QTree.Add(QTItem);
}
listView_data.Items.Add(item);
listView_Morton.Items.Add(item_M);
}
}
}
private string DtoB(int d, int length)
{
string b = "";
int[] m = new int[length];
while (d > 0)
{
m[--length] = Math.Abs(Convert.ToInt16(Math.IEEERemainder(d, 2)));
d = d / 2;
}
for (int i = 0; i < m.Length; i )
b = m[i];
return b;
}
private int BianMa(ref List<int[]> l, int start, int end)
{
int flag = 1;
if (end - start != 3)
{
int length = (end - start 1) / 4;
for (int i = start; i < end; i = length)
{
int a = l.Count;
if (BianMa(ref l, i, i length - 1) == 0)
flag = 0;
end = end - (a - l.Count);
i = i - (a - l.Count);
}
if (flag == 0)
return 0;
}
for (int i = start; i < start 3; i )
if (l[i][1] != l[i 1][1])
{
flag = 0;
break;
}
if (flag == 1)
{
l[start][0] /= 10;
l[start][2]--;
for (int i = 0; i < 3; i )
l.RemoveAt(start 1);
}
return flag;
}
private int compare(int[] x, int[] y)
{
if (x != null && y != null)
return x[0].CompareTo(y[0]);
else
return 0;
}
private void btnbianma_Click(object sender, EventArgs e)
{
{
}
}
private void listView_Morton_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void listView_data_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void button3_Click(object sender, EventArgs e)
{
// string[] lines = File.ReadAllLines(@"E:\新建文本文档.txt", Encoding.Default);
//int[,] DEM_array = new int[lines.Length, lines[0].Split(',').Length];//读取DEM属性值;
//for (int i = 0; i < DEM_array.GetLength(0); i )
//{
// for (int j = 0; j < DEM_array.GetLength(1); j )
// {
// DEM_array[i, j] = int.Parse(lines[i].Split(',')[j]);
// }
//}
Gdal.AllRegister();
string fileName = @"E:\img\jiangxueying.img";
Dataset DEMdata = Gdal.Open(fileName, Access.GA_ReadOnly);
if (DEMdata == null)
{
MessageBox.Show("不能打开:" fileName);
return;
}
int size = DEMdata.RasterCount;//影像大小
int xsize = DEMdata.RasterXSize;//行
int ysize = DEMdata.RasterYSize;//列
int[] DEM = new int[xsize * ysize];
Band DEMband = DEMdata.GetRasterBand(1);//波段
DEMband.ReadRaster(0, 0, xsize, ysize, DEM, xsize, ysize, 0, 0);
int t1 = 0;
AllDEM = new int[xsize, ysize];
for (int i = 0; i < xsize; i )
{
for (int j = 0; j < ysize; j )
{
AllDEM[i, j] = DEM[t1];
t1 ;
}
}
/////////////////////////////////////////之前如果ALLDEM已赋值则前面全部不用;
int[,] DEM_array = AllDEM;
Size DEM_size = pictureBox1.Size;
double pixel_xeach = DEM_array.GetLength(1) / DEM_size.Width;//每一个像素y分量所代表的属性值列向量的个数;
double pixel_yeach = DEM_array.GetLength(0) / DEM_size.Height;//每一个像素y分量所代表的属性值列向量的个数;
int RGB_highvalue = 6;//高程范围为0-1600,此变量表示每个RGB属性所代表的的高程数;
int[,] DEM_viewvalue = new int[DEM_size.Width, DEM_size.Height];
int DEM_length = DEM_size.Height * DEM_size.Width;
int[][,] middle1 = new int[DEM_length][,];//中间变量用于存储所有的分块的DEM属性;
Point[][] point = depart(DEM_array, DEM_array.GetLength(0) / DEM_size.Width, DEM_array.GetLength(1) / DEM_size.Height);
//////////////////假如这句当整体变量直接放循环里面则会增加很多循环;;;
point[,] p = new point[DEM_array.GetLength(0), DEM_array.GetLength(1)];///////假如这里能用上一步depart方法里面所有的值直接除以一个比例系数则就不用下面的循环;
for (int i = 0; i < p.GetLength(0); i )
{
for (int j = 0; j < p.GetLength(1); j )
{
p[i, j].x = (float)(i / pixel_xeach);
p[i, j].y = (float)(j / pixel_yeach);
}
}
int max_value = DEM_array[0, 0], min_value = DEM_array[0, 0];//获取高程值的最大及最小值;
foreach (var item in DEM_array)
{
if (item > max_value)
max_value = item;
if (item < min_value)
min_value = item;
}
//int[] middle_value = new int[DEM_length];
//for (int i = 0; i < DEM_length; i )/////////////////////////先用2来代替
//{
// int count = 0;
// middle1[i] = index(DEM_array, point[i]);//将所有的值按行排列分块赋值;
// foreach (var item in middle1[i])
// {
// //count = item;
// count = item;
// }
// //middle_value[i] = count / middle1[i].Length;
// middle_value[i] = count;
// ///////////前面两句有改动
//}
//int k3 = 0;
//for (int i = 0; i < DEM_size.Width; i )//将高程值按块平均数分配给以分辨率为单位的数组;
//{
// for (int j = 0; j < DEM_size.Height; j )
// {
// DEM_viewvalue[i, j] = middle_value[k3];
// k3 ;
// }
//}
Graphics graphics = this.CreateGraphics();//画图
Pen pens = new Pen(Color.White);
int each_R = (max_value - min_value) / (240 - 0), each_G = (max_value - min_value) / (200 - 100)
, each_B = (max_value - min_value) / (230 - 30);//这里表示以(0,100,30)和(240,200,230)为两个色带;;
////////这里本需要创建一个色带的数组但是本题只选两个色带显示就直接创建本地变量;
for (int i = 0; i < DEM_array.GetLength(0); i )
{
for (int j = 0; j < DEM_array.GetLength(1); j )
{
//int RGB = DEM_viewvalue[i, j] / RGB_highvalue;
int R = (DEM_array[i, j] - min_value) / each_R 0;
int G = (DEM_array[i, j] - min_value) / each_G 100;
int B = (DEM_array[i, j] - min_value) / each_B 30;
if (DEM_array[i, j] > 2000) continue;/////这句得删掉
Color color = Color.FromArgb(R, G, B);
Brush brush = new SolidBrush(color);
//Rectangle rec = new Rectangle(new point(i, j), new Size(1, 1));
//graphics.DrawRectangle(pens, rec);
graphics.FillRectangle(brush, (float)(i / pixel_xeach), (float)(j / pixel_yeach), (float)(1 / pixel_xeach), (float)(1 / pixel_yeach));
brush.Dispose();
if (j % 10 == 0)
{
if (i % 10 == 0)
;
}
}
}
graphics.Dispose(); pens.Dispose();
}
public static Point[][] depart(int[,] x, int a, int b)//将图像分成a*a的小块,并以坐标形式返回他们小块的坐上和右下的行列号(对角上的两点可以确定一个矩形);
{
int t2 = x.GetLength(0) * x.GetLength(1) / a / b; //表示分成的总块数
int t1 = 0;
Point[][] position = new Point[t2][];
for (int i = 0; i < t2; i )
{
position[i] = new Point[2];//以二维坐标数组存放块所在的位置
}
for (int i = 0; i < x.GetLength(0) / a; i )
{
for (int j = 0; j < x.GetLength(1) / b; j )
{
position[t1][0].X = i * a;
position[t1][0].Y = j * b;
position[t1][1].X = (i 1) * a;
position[t1][1].Y = (j 1) * b;
t1 ;
}
}
return position;
}
public static int[,] four_in_one(int[][,] x)//将四个数组按四叉树的逆过程合并成一个数组;
{
int x_size = (int)Math.Sqrt(4 * x[0].GetLength(1));
int[,] com_array = new int[x_size, x_size];
int t1 = 0, t2 = 0;
for (int i = 0; i < x.Length; i )
{
for (int j = 0; j < x[i].GetLength(0); j )
{
for (int k = 0; k < x[i].GetLength(1); k )
{
com_array[t1, t2] = x[i][j, k];
t2 ;
if (t2 % com_array.GetLength(1) == 0)
{ t2 = 0; t1 ; }
}
}
}
return com_array;
}
//public static int[] add_omit( string[][] x, int a)//补充用四叉树存储省略的部分;
//{
// int mo_l = (int)Math.Log(2, a);//存放moton值最长时的位数
// for (int i = 0; i < x.GetLength(0); i )
// {
// int k = x[i][0].Length - mo_l;
// if (k != 0)
// { }
// int k2 = (int)Math.Pow(4, k);
// string[][] k3 = new string[k2 - 1][];
// for (int j = 0; j < k2 - 1; j )
// {
// k3[j] = new string[2];
// k3[j][0] =x[i][0];
// k3[j][0] = x[i][1];
// }
// }
// ///////////////////////////////////这里要修改
//}
/// <summary>
/// //////////////////////////////////////////////////////////上面的有用,只是要改;
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
//public static int[,] qtree_normal(int[,])
//{
//}
private void button3_Paint(object sender, PaintEventArgs e)
{
}
}
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论