maior valor do ponto x e y

1. maior valor do ponto x e y

Milena Pereira Dantas
sapynhos

(usa Outra)

Enviado em 20/02/2016 - 22:04h

Pessoal, eu tinha um programa em Java que fazia isso, mas ele deu pau!
Acho que a maneira mais fácil de fazer, seria em fortran
é o seguinte...

eu tenho arquivos diários com valores na primeira coluna (longitude, x), na segunda coluna (latitude, y) e na terceira coluna (valor do pixel). Como eu faria um scrip pra calcular o maior valor do ponto x e y, e criar um único arquivo?
Obg



  


2. Re: maior valor do ponto x e y

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 07/03/2016 - 16:52h

sapynhos escreveu:

Pessoal, eu tinha um programa em Java que fazia isso, mas ele deu pau!
Acho que a maneira mais fácil de fazer, seria em fortran
é o seguinte...

eu tenho arquivos diários com valores na primeira coluna (longitude, x), na segunda coluna (latitude, y) e na terceira coluna (valor do pixel). Como eu faria um scrip pra calcular o maior valor do ponto x e y, e criar um único arquivo?
Obg

-------------------------------------------
Boa tarde.
Você pode usar o awk!
Poste um trecho do seu arquivo

att.:
marcelo




3. Re: maior valor do ponto x e y

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/03/2016 - 18:16h

1) Lê o primeiro arquivo todo para a memória, pois o maior valor de cada ponto na primeira passada será necessariamente o valor do primeiro arquivo, uma vez que não havia nada antes.

2) Procura o próximo arquivo.

3) Se não houver mais arquivos, pula para o passo 6.

4) Lê o arquivo selecionado, comparando, para cada ponto, com o valor existente anteriormente, e substituindo na memória os valores que forem maiores.

5) Volta ao passo 2.

6) Gera a saída com o valor de cada ponto na memória.



Claro que se os arquivos forem gigantescos, ler para a memória RAM pode não ser viável. Nesse caso, uma das alternativa é considerar como “memória” algo que possa ser mais eficientemente mapeado em disco (por exemplo, um arquivo binário ou algo num formato DBM ou Berkeley DB).

Outra possibilidade é optar por abrir e percorrer todos os arquivos em paralelo (se também a quantidade de arquivos não for muito grande), escolhendo o valor do maior dos pixels correspondentes à mesma posição (nesse caso, os arquivos também tem de estar ordenados de modo consistente).


4. Re: maior valor do ponto x e y

Perfil removido
removido

(usa Nenhuma)

Enviado em 07/03/2016 - 18:29h

O algoritmo descritivo está aí.
Qual linguagem você prefere para fazer?
Tem uma amostra da sintaxe interna do arquivo?

----------------------------------------------------------------------------------------------------------------
http://24.media.tumblr.com/tumblr_m62bwpSi291qdlh1io1_250.gif

# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



5. Re: maior valor do ponto x e y

Milena Pereira Dantas
sapynhos

(usa Outra)

Enviado em 07/03/2016 - 19:49h

Isso foi feito para rodar no XP, queria no WIN8


unit UMaiorIVDN;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ExtCtrls, FileCtrl, StdCtrls, Mask, Buttons, ToolWin;

type
TForm1 = class(TForm)
Panel1: TPanel;
DriveComboBox1: TDriveComboBox;
DirectoryListBox1: TDirectoryListBox;
FileListBox1: TFileListBox;
Panel2: TPanel;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
GroupBox1: TGroupBox;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
StaticText1: TStaticText;
CheckBox4: TCheckBox;
Edit1: TEdit;
Label5: TLabel;
Label6: TLabel;
Edit6: TEdit;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
ToolBar1: TToolBar;
SpeedButton1: TSpeedButton;
procedure DriveComboBox1Change(Sender: TObject);
procedure DirectoryListBox1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}




const LONGa1 : real = -53.1425; // um número inicial de minha escolha
const LONGq : real = 0.0400; // fator somador do próximo ponto de longitude
const LATa1 : real = 3.6232; // um número inicial de minha escolha
const LATq : real = -0.0398; // fator somador do próximo ponto de latitude
const TAM : integer = 700; //Tamanho da matriz quadrada
const MAXDIAS : integer = 100;

type M = array [1..700, 1..700, 1..100] of real;

Var NLAT, NLONG : integer;
MATRIZ : M;
LATS, LATI, LONGE, LONGD : string;
rLatS, rLatI, rLongE, rLongD : real;

procedure TForm1.DriveComboBox1Change(Sender: TObject);
begin
DirectoryListBox1.Drive := DriveComboBox1.Drive;
FileListBox1.Drive := DriveComboBox1.Drive;
FileListBox1.Directory := DirectoryListBox1.Directory;
end;

procedure TForm1.DirectoryListBox1Change(Sender: TObject);
begin
FileListBox1.Directory := DirectoryListBox1.Directory;
end;

//verifica de há inconsistencias nos dados
function VerificaDados(LatS, LatI, LongE, LongD : string) : boolean;

begin
try
rLatS := strToFloat(LatS);
rLatI := strToFloat(LatI);
rLongE := strToFloat(LongE);
rLongD := strToFloat(LongD);
if((rLatS >= rLatI) and (rLongD >= rLongE)) then
result := true
else result := false;
except result := false;
end;
end;

// ajusta a longitude devido a pequenas diferenças do
// mesmo ponto entre imagens diferentes
function retornarLongitude(Longitude : integer):real;
begin
result := LONGa1 + (longitude - 1)*LONGq;
end;
function ajustarLongitude(longitude : real): real;
begin
// Uma P.A. an = a1 + (n -1)*q
NLONG := round(((longitude - LONGa1)/LONGq) + 1.0); // posiciona na long que desejo
// encontra a nova lontidude
result := retornarLongitude(NLONG);
end;

// da mesma forma para latitude
function retornarLatitude(NLAT: integer):real;
begin
result := LATa1 + (NLAT - 1.0)*LATq;
end;
function ajustarLatitude(latitude : real): real;

begin
// Uma P.A. an = a1 + (n -1)*q
NLAT := round(((latitude - LATa1)/LATq) + 1.0); // posiciona na long que desejo
// encontra a nova latitude
result := retornarLatitude(NLAT);
end;

function pontoOk(long, lat : integer) : boolean;

begin
if ((retornarLongitude(long) >= rLONGE) and (retornarLongitude(long) <= rLONGD)) then
if ((retornarLatitude(lat) >= rLATI) and (retornarLatitude(lat) <= rLATS )) then
result := true
else result:= false
else result := false;
end;

// Preenche a Matriz
procedure preencheMatriz(ValorEntrada : real);
var dia : integer;
begin
dia := 1;
while(Matriz[NLONG,NLAT,dia] <> 0.000) do
dia := dia + 1;
Matriz[NLONG,NLAT,dia] := ValorEntrada;
end;

function buscarMaior(long, lat : integer):real;
var dia : integer;
maior, valor : real;
begin
// varre a Matriz a procura do maior valor para cada ponto
maior := 0.0000;
dia := 1;
valor := MATRIZ[long,lat,dia];
while (( valor <> 0.0000) and (dia <= MAXDIAS)) do begin
if valor > maior then
maior := valor;
dia := dia + 1;
valor := MATRIZ[long,lat,dia];
end;
result := maior;

end;


//********************************************************
//********************************************************
// calcula a média do IVDN em cada ponto da imagem
//********************************************************
//********************************************************

function calcularMedia(long, lat: integer):real;
var dia, n : integer;
soma, valor, media : real;
begin
// varre a Matriz a procura do maior valor para cada ponto
media := 0.0000;
dia := 1;
n := 0;
soma := 0.0000;
valor := MATRIZ[long,lat,dia];
while (( valor <> 0.0000) and (dia <= MAXDIAS)) do begin
soma := soma + valor;
n := n + 1;
dia := dia + 1;
valor := MATRIZ[long,lat,dia];
end;
if (soma > 0.000) then
media := soma / n
else media := 0;
result := media;
end;

function retornarLinha(long, lat : integer; valor : real): string;
var sLongitude, sLatitude, sValor : string;
i : integer;
begin
sLongitude := formatfloat('##0.0000',retornarLongitude(long));
sLatitude := formatfloat('##0.0000',retornarLatitude(lat));
sValor := formatfloat('0.0000', valor);
for i := 1 to (14 - length(sLongitude)) do
sLongitude := ' ' + sLongitude;
for i := 1 to (14 - length(SLatitude)) do
sLatitude := ' ' + sLatitude;
for i := 1 to (14 - length(sValor)) do
sValor := ' ' + sValor;
result := sLongitude + sLatitude + sValor;
end;

procedure calculaMedia(path: string);
var fout : textfile;
linha : string;
long,lat : integer;
media, valor, soma : real;
dia : integer;
latitude, longitude : real;
slatitude, slongitude, sMedia : string;
i,n : integer;
begin
try
assignfile(fout,path + 'ValorMedio.txt');
rewrite(fout);

// varre a Matriz a procura do maior valor para cada ponto
for lat := 1 to TAM do
for long := 1 to TAM do
if pontoOk(long,lat) then begin
media := calcularMedia(long, lat);
if media > 0.0000 then begin
writeln(fout,retornarLinha(long,lat,media));
end;
end; // for
except
end;
closefile(fout);
end;


// Procura maior valor de IVDN para cada ponto
procedure procuraMaior(path : string);
var fout : textfile;
linha : string;
long,lat : integer;
maior, valor : real;
dia : integer;
latitude, longitude : real;
slatitude, slongitude, sValor : string;
i : integer;
begin
try
// cria arquivo de saida .txt
assignfile(fout,path + 'MaiorValor.txt');
rewrite(fout);

// varre a Matriz a procura do maior valor para cada ponto
for lat := 1 to TAM do
for long := 1 to TAM do
if (pontoOk(long,lat)) then begin
maior := 0.0000;
dia := 1;
valor := MATRIZ[long,lat,dia];
while ((valor <> 0.0000) and (dia <= MAXDIAS)) do begin
if valor > maior then
maior := valor;
dia := dia + 1;
valor := MATRIZ[long,lat,dia];
end;
if (maior > 0.000) then begin
linha := retornarLinha(long,lat,maior);
writeln(fout,linha);
end;
end; // if
except
showmessage('Não foi possível criar o arquivo de saída');
end;
closefile(fout);

end;

// Lê os arquivos e recorta a área de interesse
procedure recortarArea(path, nomeDoArquivo,LatS, LatI, LongE, LongD : string);
var fin : textfile; //arquivo de entrada
fout: textfile; //arquivo de saída
linha, novalinha : string;
valorEntrada : real; //limites de área
latitude, longitude : real;
code,i : integer;
S, Slongitude, Slatitude : string;

begin
s := '';
try
// lê o arquivo txt de entrada gerado pelo ENVI
assignfile(fin, path + nomeDoArquivo);
reset(fin);

// pula 5 linhas
for i := 1 to 5 do readln(fin,linha);

// leitura linha-a-linha do arquivo de entrada
while not eof(fin) do begin
readln(fin,linha);

val(copy(linha,29,14),valorEntrada,code);
val(copy(linha,1,14),longitude,code);
val(copy(linha,15,14),latitude,code);

longitude := ajustarLongitude(longitude);
latitude := ajustarLatitude(latitude);

// verifica se o valor é menor ou igual a zero e despreza
if (valorEntrada < 0.0000) then begin
// verifica se a longitude está dentro da área
if ((longitude >= rLongE) and (longitude <= rLongD)) then begin
if ((latitude <= rLatS) and (latitude >= rLatI)) then begin
preencheMatriz(ValorEntrada);
end; // if latitude
end; // if longitude
end; // if valor de entrada
end; // while não fim do arquivo
except

end;
closefile(fin);
end;

procedure mediaDosPontos(path : string; fator : integer);
var fout : textfile;
novalat, novalong, sublat, sublong : integer;
novoTam :integer;
valor, acumulado, media : real;
totalDeZeros : integer;
linha, zeros : string;
lat, long : integer;
verLat, verLong : real;
begin
try
zeros := form1.Edit6.text;
assignfile(fout, path + 'ValorMedio' + inttostr(fator) + '.txt');
rewrite(fout);
// novo tamanho da matriz
novoTam := trunc(TAM/fator);
for novaLat := 1 to novoTam do
for novaLong := 1 to novoTam do begin
media := 0.0000;
totalDeZeros := 0;
acumulado := 0;
for subLat := 1 to fator do
for subLong := 1 to fator do begin
long := subLong + (novaLong - 1)* fator;
lat := subLat + (novaLat - 1)* fator;
if pontoOk(long,lat) then begin
valor := BuscarMaior(long,lat);
if (valor = 0.000) then
totalDeZeros := totaldeZeros + 1;
acumulado := acumulado + valor;
end;
end;
//calcula média
if (totalDeZeros <= strToint(zeros)) then
if (acumulado > 0.0000) then begin
media := acumulado / (fator * fator - totalDeZeros);
linha := retornarLinha(long - trunc((fator + 1)/2) , lat - trunc((fator+1)/2) , media);
//grava em arquivo
writeln(fout,linha);
end;

end;
except
showmessage('Não foi possível criar arquivo fator de saida');
end;
closefile(fout);
end;

procedure TForm1.Button1Click(Sender: TObject);
var TotalDeArquivos : integer;
path : string;
nomeDoArquivo : string;
indice, i, j, k : integer;
begin
// inicialização das constantes
TotalDeArquivos := FileListBox1.Items.Count;
LatS := Edit2.Text;
LatI := Edit3.Text;
LongE := Edit4.Text;
LongD := Edit5.Text;
button1.Enabled := false;
if (VerificaDados(LatS, LatI, LongE, LongD)) then
if ((TotalDeArquivos > 0) and (TotalDeArquivos <= MAXDIAS)) then begin
// limpar Matriz 3D (Lat, Long, Valor) com valores zerados
for i := 1 to TAM do
for j := 1 to TAM do
for k := 1 to MAXDIAS do
Matriz[i,j,k] := 0.000;

path := DirectoryListBox1.Directory + '\';
for indice := 0 to TotalDeArquivos - 1 do begin
nomeDoArquivo := FileListBox1.Items.Strings[indice];
statictext1.caption := nomeDoArquivo;
// selecionar área e ajusta lat e long
recortarArea(path, nomeDoArquivo,LatS, LatI, LongE, LongD);
// gera arquivo final maior valor;
if checkbox1.Checked then
procuraMaior(path);
// gera arquivo final media;
if checkbox2.Checked then
calculaMedia(path);
// gera arquivo diário
//if checkbox3.Checked then
//calculaDiario(path);
if checkbox4.Checked then
// calcular média ponto
mediaDosPontos(path, strtoint(edit1.text));

end;
end
else showmessage('Não há arquivos selecionados ou é maior que 31')
else showmessage('Dados informados incorretos');
button1.Enabled := true;
showmessage('fim');
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
Edit2.Text := '-6.0000';
Edit3.Text := '-8.5000';
Edit4.Text := '-39.0000';
Edit5.Text := '-34.0000';
end;

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
Edit2.Text := '-0.0000';
Edit3.Text := '-18.5000';
Edit4.Text := '-49.0000';
Edit5.Text := '-34.0000';
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
form2.show;
end;

end.






6. Re: maior valor do ponto x e y

Perfil removido
removido

(usa Nenhuma)

Enviado em 07/03/2016 - 20:02h

Mas isso é Object Pascal de Delphi.
Eu estava pensando no arquivo de texto.
Mas se você quer script então teria que ser em algo que funcione em Windows©.

----------------------------------------------------------------------------------------------------------------
http://24.media.tumblr.com/tumblr_m62bwpSi291qdlh1io1_250.gif

# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts