Совершенствование модуля ГИС РАПИД для вывода графиков распределения значений слоев
Сведения о геоинформационной системе РАПИД. Разработка программы для модуля классификации текстур в среде Borland Delphi, позволяющей строить гистограммы распределения значений слоев с геоданными, с учетом разделения исследуемой территории на классы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 24.06.2014 |
Размер файла | 3,8 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
begin
drawlege;
end;
procedure TForm1.Button2Click(Sender: TObject);
type MData=array of array of real;
MSaved=array of array of string;
var i,p:integer; //номер серии - класса
j,k:integer;//номер бункера-интервала в серии
summ:MData;
clstat:MSaved;
Word,Table,Par,Doc:Variant;//для Word-а
h1,h2, h1sr,h2sr:real;//значения первой и второй гистограмм и их средние
sumh1,sumh2:real;//суммы первой и второй гистограмм
sumbhat:real;//сумма для Бхаттачария
korr,korr_chisl,korr_znam1,korr_znam2:real;//коэф. корр.
procedure AddToWord(data:MData;methodname,descr:string);
var wi,wp:integer;
begin
try
Word:=GetActiveOLEObject('Word.Application');
except
Word:=CreateOLEObject('Word.Application');
end;
setlength (clstat, Chart1.SeriesList.Count+1, Chart1.SeriesList.Count+1);
clstat[0,0]:=_(methodname); //название метода
for wi:= 1 to Chart1.SeriesList.Count do
begin
clstat[wi,0]:=chart1.Series[wi-1].Title;//название i-класса
clstat[0,wi]:=chart1.Series[wi-1].Title;
end;
for wi:=0 to Chart1.SeriesList.Count-1 do
for wp:=wi+1 to Chart1.SeriesList.Count-1 do
clstat[wi+1,wp+1]:= formatfloat('0.###',data[wi,wp]);
Word.Visible:=True;
if VarIsEmpty(doc) then //если документ еще не создан. Иначе допишем в конце.
Doc:=Word.Documents.Add();
Par:=Doc.Paragraphs.Add();
Par.Range.Text:=_(descr); // пояснительный текст
word.selection.font.size:=10;
word.selection.font.name:='arial cyr';
Par:=Doc.Paragraphs.Add();
doc.pagesetup.orientation:=1;
Par:=Doc.Paragraphs.Add();
Table:=Doc.Tables.Add(Par.Range,Chart1.SeriesList.Count+1, Chart1.SeriesList.Count+1);
table.borders.InsideLineStyle:=1;//wdLineStyleSingle;
table.borders.OutsideLineStyle:=1;//wdLineStyleSingle;
try
table.style:='Средняя заливка 2 - Акцент 1';
except end;
for wi:=0 to Chart1.SeriesList.Count do
for wp:=0 to Chart1.SeriesList.Count do
Table.Cell(wi+1,wp+1).Range.Text:=clstat[wi,wp];
Par:=Doc.Paragraphs.Add();
end;
begin
//пересечение
//создаем массив для результатов
setlength(summ,Chart1.SeriesList.Count,Chart1.SeriesList.Count);
for i:=0 to Chart1.SeriesList.Count-1 do //по каждой серии
for p:=i to Chart1.SeriesList.Count-1 do //по каждой серии
summ[i,p]:=0;
//рассчитывается как сумма (по j) ( мин(гист1[j], гист2[j]) );
for i:=0 to Chart1.SeriesList.Count-1 do //по каждой серии
for p:=i+1 to Chart1.SeriesList.Count-1 do //по каждой серии
for j:=0 to chart1.Series[0].Count-1 do
summ[i,p]:=summ[i,p]+min(chart1.Series[i].YValue[j],chart1.Series[p].YValue[j]);
AddToWord(summ,'Histogram distance', 'Histogram intersection. Higher values indicate more similarity.');
//названия переводятся внутри.
//2. Метод Хи-квадрат
//создаем массив для результатов
setlength(summ,Chart1.SeriesList.Count,Chart1.SeriesList.Count);
for i:=0 to Chart1.SeriesList.Count-1 do //по каждой серии
for p:=i to Chart1.SeriesList.Count-1 do //по каждой серии
summ[i,p]:=0;
//рассчитывается http://locv.ru/wiki/7.4.1_%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B3%D0%B8%D1%81%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC
for i:=0 to Chart1.SeriesList.Count-1 do //по каждой серии
for p:=i+1 to Chart1.SeriesList.Count-1 do //по каждой серии
for j:=0 to chart1.Series[0].Count-1 do
begin
h1:=chart1.Series[i].YValue[j];
h2:=chart1.Series[p].YValue[j];
if h1+h2 <>0 then
summ[i,p]:=summ[i,p]+ (h1-h2)*(h1-h2)/(h1+h2);
end;
AddToWord(summ,'Histogram similarity', 'Chi-Square method. Values close to 0 indicate higher similarity.');
//3. Метод Бхаттачария
//создаем массив для результатов
setlength(summ,Chart1.SeriesList.Count,Chart1.SeriesList.Count);
for i:=0 to Chart1.SeriesList.Count-1 do //по каждой серии
for p:=i to Chart1.SeriesList.Count-1 do //по каждой серии
summ[i,p]:=0;
//рассчитывается http://locv.ru/wiki/7.4.1_%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B3%D0%B8%D1%81%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC
for i:=0 to Chart1.SeriesList.Count-1 do //по каждой серии
for p:=i+1 to Chart1.SeriesList.Count-1 do //по каждой серии
begin
sumh1:=0;
sumh2:=0;
for j:=0 to chart1.Series[0].Count-1 do
begin
h1:=chart1.Series[i].YValue[j];
h2:=chart1.Series[p].YValue[j];
sumh1:=sumh1+h1;
sumh2:=sumh2+h2;
end;
if sumh1*sumh2 = 0 then continue; //нельзя сравнить эти две гист.
sumbhat:=0;
for j:=0 to chart1.Series[0].Count-1 do
begin
h1:=chart1.Series[i].YValue[j];
h2:=chart1.Series[p].YValue[j];
sumbhat:=sumbhat + sqrt(h1*h2) / sqrt(sumh1*sumh2);
end;
summ[i,p]:=sqrt(1-sumbhat);
end;
AddToWord(summ,'Histogram distance', 'Bhattacharyya distance. Lower values indicate higher similarity, 1 is for total difference.');
//4. Корреляция
//создаем массив для результатов
setlength(summ,Chart1.SeriesList.Count,Chart1.SeriesList.Count);
for i:=0 to Chart1.SeriesList.Count-1 do //по каждой серии
for p:=i to Chart1.SeriesList.Count-1 do //по каждой серии
summ[i,p]:=0;
for i:=0 to Chart1.SeriesList.Count-1 do //по каждой серии
for p:=i+1 to Chart1.SeriesList.Count-1 do //по каждой серии
begin
//расчет средних значений по гистограммам
sumh1:=0;
sumh2:=0;
for j:=0 to chart1.Series[0].Count-1 do
begin
h1:=chart1.Series[i].YValue[j];
h2:=chart1.Series[p].YValue[j];
sumh1:=sumh1+h1;
sumh2:=sumh2+h2;
end;
if (sumh1=0) or (sumh2=0) then continue;//пустая гистограмма
h1sr:=sumh1/chart1.Series[0].Count;
h2sr:=sumh2/chart1.Series[0].Count;
//расчет корреляции
korr_chisl:=0;
korr_znam1:=0;
korr_znam2:=0;
for j:=0 to chart1.Series[0].Count-1 do
begin
h1:=chart1.Series[i].YValue[j];
h2:=chart1.Series[p].YValue[j];
korr_chisl:=korr_chisl + (h1-h1sr)*(h2-h2sr);
korr_znam1:= korr_znam1+ (h1-h1sr)*(h1-h1sr);
korr_znam2:= korr_znam2+ (h2-h2sr)*(h2-h2sr);
end;
if korr_znam1*korr_znam2=0 then continue;//ну не получилось...
korr:=korr_chisl / sqrt(korr_znam1*korr_znam2);
summ[i,p]:=korr;
end;
AddToWord(summ,'Correlation coefficient', 'Correlation. Values close to 1 indicate higher similarity, 0 is for total difference.');
R.Inform(_('Comparison tables are available in new MS Word document'));
end;
procedure TForm1.Button3Click(Sender: TObject); //Ми
var i:integer;
classstr, Ystr:string;
begin
button2.visible:=false;//кнопка расчета сходства
chart1.Legend.LegendStyle:=lsSeries;
for i:=0 to chart1.SeriesList.Count-1 do //очистка чарта
Chart1.serieslist.delete(0);
if not (GetParamsForSingle) then exit;
show;
memo1.Lines.clear; //параметры графика
classstr:=CLname;
YStr:=_('count');
chart1.LeftAxis.Title.Caption:='N';
memo1.Text:=_('Distribution graph: classes layer - ''')+r.sattr[nofetallayer].alias+_('''; using classes: ')+classstr+_('; with intervals count - ')+inttostr(razr)+_('; Y-axis fixes ')+YStr;
r.Inform(_('Select layer(s) to build distribution graph'));
if r.SelectLayers(true,'F')=false then exit;
SetLength(CLLayers,R.AmountOfActiveLayers);//сохраняем список выбранных слоёв
for i:=0 to R.AmountOfActiveLayers-1 do
CLLayers[i]:=R.ActiveLayers[i];
BuildHist2;
Panel3.Visible:=false; //отключаем ненужные кнопки
ChartLegendImage.Visible:=false; //и шкалу
end;
procedure TForm1.getGlobalMinMax(layers:ArrayOfInteger; var minv,maxv:real);
var i:integer;
tmin,tmax:real;
begin //нахождение общего min/max для всех слоев, а не для одного, как обычно
r.GetMinMax(layers[0],minv,maxv);
for i:= 1 to length(layers)-1 do
begin
r.GetMinMax(layers[i],tmin,tmax);
minv:=min(minv,tmin);
maxv:=max(maxv,tmax);
end;
end;
procedure Tform1.BuildHist2; //Ми
var AmountOfEtalons,i,p:integer;
gmin,gmax:real;
wrd:boolean;
Word,Table,Par,Doc:Variant;//для Word-а
procedure AddToWord;
var wi,wp:integer;
begin
try
Word:=GetActiveOLEObject('Word.Application');
except
Word:=CreateOLEObject('Word.Application');
end;
Word.Visible:=True;
if VarIsEmpty(doc) then //если документ еще не создан. Иначе допишем в конце.
Doc:=Word.Documents.Add();
Par:=Doc.Paragraphs.Add();
Par.Range.Text:=_(st); // название слоя
word.selection.font.size:=10;
word.selection.font.name:='arial cyr';
Par:=Doc.Paragraphs.Add();
doc.pagesetup.orientation:=1;
Par:=Doc.Paragraphs.Add();
Table:=Doc.Tables.Add(Par.Range,2, razr+1+1);
table.borders.InsideLineStyle:=1;//wdLineStyleSingle;
table.borders.OutsideLineStyle:=1;//wdLineStyleSingle;
try
table.style:='Средняя заливка 2 - Акцент 1';
except end;
Table.Cell(1,1).Range.Text:=_('Intervals (centers)');
Table.Cell(2,1).Range.Text:=_('Values');
for wp:=0 to razr do //вывод диапазонов гистограммы
Table.Cell(1,wp+2).Range.Text:=formatfloat('0.###',gmin+razrwidth*wp); //+'.. '+formatfloat('0.###',gmin+razrwidth*(wp+1));
for wp:=0 to razr do //вывод значений делений гистограммы
Table.Cell(2,wp+2).Range.Text:=FreqTable[wp];
Par:=Doc.Paragraphs.Add();
end;
begin
wrd:=False;
if MessageDlg(_('Save report?'),
mtConfirmation, [mbYes, mbNo], 0) = mrYes then wrd:=True;
for i:=0 to chart1.SeriesList.Count-1 do //очистка чарта
Chart1.serieslist.delete(0);
getGlobalminmax(CLLayers,gmin,gmax); //мин/макс среди всех слоёв
RazrWidth:= (gmax-gmin)/razr;
for i:= 0 to length(CLLayers)-1 do //для каждого слоя выполняем
begin
//построение гистограммы
setlength (FreqTable, razr+1); //таблица со значениями гистограммы
objcount:=0; //количество объектов на текущем слое
AmountOfEtalons:=0;
for p:= 0 to razr do FreqTable[p]:=0; //обнуляем гистограмму
st:= r.fattr[CLLayers[i]].Alias; //для вывода названия слоя
for p:= 1 to r.xsize*r.ysize do
if r.GetSData(CLNum,p) = CLname then //если попался объект нужного класса
if r.GetFData (CLLayers[i],p)<>r.GapCodeF then
begin
FreqTable[round((-gmin+r.GetFData (CLLayers[i],p))/razrwidth)]:=FreqTable [round((-gmin+r.GetFData (CLLayers[i],p))/razrwidth)]+1; //добавляем единичку для каждого найденного объекта в соответствующей колонке гистограммы
objcount:=objcount+1; Inc(AmountOfEtalons);
end;
Chart1.AddSeries( TLineSeries.Create( Self ) ); //создаем линию на графице
Chart1.series[i].marks.visible:=false;
Chart1.series[i].title:=copy (st,0,20)+ ' ('+ IntToStr(AmountOfEtalons)+')'; //название (для легенды)
Chart1.series[i].clear;
for p:= 0 to razr do
Chart1.series[i].addXY(p*razrwidth+gmin, FreqTable[p]); //выводим очередную "точку" в график
//вывод результатов текущего слоя в MSWord
if wrd then
AddToWord;
end;
Chart1.Title.Text.clear;
Chart1.Title.Text.add(_('Distribution graph - ')+CLName); //заголовок графика
end;
end.
Размещено на Allbest.ru
Подобные документы
Проектирование программного модуля в среде программирования Borland Delphi 7.0. Схемы алгоритмов решения задач по темам "Символьные переменные и строки", "Массивы", "Работа с файлами", "Создание анимации". Реализация программного модуля, код программы.
отчет по практике [961,6 K], добавлен 21.04.2012Основные операции с матрицами. Проектирование объектно-ориентированного модуля для работы с матрицами в среде Delphi 7. Разработка программы, которая позволяет выполнять различные действия над матрицами. Описание интерфейса программы, исходный код модуля.
курсовая работа [1014,2 K], добавлен 15.01.2013Структурная диаграмма программного модуля. Разработка схемы программного модуля и пользовательского интерфейса. Реализация программного модуля: код программы; описание использованных операторов и функций. Вид пользовательской формы с заполненной матрицей.
курсовая работа [215,3 K], добавлен 01.09.2010Разработка структурной схемы и алгоритма функционирования микропроцессорного модуля программного обеспечения автоматизированной информатизационно-измерительной системы. Характеристика принципиальной схемы модуля, распределения памяти и задание портов.
курсовая работа [1,2 M], добавлен 28.08.2012Анализ исходных данных. Определение структуры модуля для работы файлом. Разработка объектно-ориентированного приложения, использующего массив объектов, в среде Delphi. Модульная структура программного комплекса. Процедура сортировки методом вставки.
курсовая работа [2,2 M], добавлен 20.09.2014Расчет профилей распределения поглощенной энергии с учетом спектральных и температурных зависимостей полупроводниковых материалов. Разработка программы в среде Delphi для моделирования источника тепла, создаваемого в кремнии облучением ионами водорода.
контрольная работа [897,0 K], добавлен 11.01.2013Контроль знаний как форма педагогической деятельности. Особенности и классификация тестовых заданий. Разработка обучающе-контролирующей программы для контроля знаний обучающихся в среде программирования Borland Delphi 7.0 под управлением Windows XP.
курсовая работа [172,5 K], добавлен 24.08.2016Borland Delphi 7 как универсальный инструмент разработки, применяемый во многих областях программирования, функции: добавление информации об абитуриентах в базу данных, формирование отчетов. Рассмотрение и характеристика основных компонентов Delphi.
контрольная работа [3,6 M], добавлен 18.10.2012Сведения о языке Delphi. Основы разработки баз данных. Разработка конвертера таблицы Excel, интерфейса главной формы, модуля отображения, системы поиска информации, средств редактирования. Системные требования программы. Инструкция по эксплуатации.
курсовая работа [2,6 M], добавлен 29.12.2008Разработка функциональной и структурной схемы программного средства. Реализация основного модуля программы. Реализация модуля печати и модуля обновлений. Изучение взаимодействия информационных технологий, методов их интеграции и обмена данными.
дипломная работа [3,2 M], добавлен 27.10.2017