informatica per scienze geologiche lt a.a.2017-2018...load('dtm_esercizio3');...
TRANSCRIPT
Informatica per Scienze
Geologiche LT
a.a.2017-2018
Rappresentazione grafica modello
DTM del Friuli venezia Giulia
Analisi numerica del DTM
Docente: Prof. Carla Braitenberg,
Tutor: Dott. Alberto Pastorutti
Dipartimento Matematica e Geoscienze, Via Weiss 1, Università di Trieste
E-mail: [email protected] Tel. 040 5582258
Modelli der terreno utilizzati
• Nella esercitazione utilizzeremo due
database:
• DTM in coordinate geografiche alta
risoluzione e bassa risoluzione• DTM_ortom_reg_regrid10m_WGS84_HD.mat
• DTM_ortom_reg_regrid10m_WGS84_LD.mat
• DTM alta risoluzione in coordinate
cartesiane• DTM_esercizio3.mat
Modello digitale del terreno FVG
Rappresentazione grafica del modello
digitale del terreno
• Scopo dell’esercizio:
• Utilizzare il modello digitale del terreno in zona
carsica
• - rappresentare il modello digitale del terreno in 3D
• - calcolare le isolinee di quota
%Plot_Topografia3D
%caricamento dati digitali del terreno
load DTM_ortom_reg_regrid10m_WGS84_HD.mat;
figure
%surface plot
surf(X1,Y1,Z1)
shading interp;
% visualizzazione 3D (azimuth -78°, elevation 62°)
view([-78,62]);
% etichette sugli assi
xlabel('asse orizzantale X');
ylabel('asse verticale Y');
zlabel('asse Z quota');
Grafico della topografia in 3D
Comando View
• view(az,el) and view([az,el]) set the viewing angle for a
three-dimensional plot. The azimuth, az, is the horizontal
rotation about the z-axis as measured in degrees from
the negative y-axis. Positive values indicate
counterclockwise rotation of the viewpoint. el is the
vertical elevation of the viewpoint in degrees. Positive
values of elevation correspond to moving above the
object; negative values correspond to moving below the
object.
Grafico creato con lo script Plot_Topografia3D.m
Grafico delle isolinee della topografia • %Plot_DTM_isolinea
• Zmin=200; Zmax=500;
• step=2;
• v=Zmin:step:Zmax;
• sv=size(v);
• load DTM_ortom_reg_regrid10m_WGS84_HD.mat;
• %num2str converte i numeri in stringhe, altrimenti la
concatenazione(di stringhe) non e' possibile
• figure('name',['esempio 2D isolinee Zmin: ' num2str(Zmin) ' Zmax: '
num2str(Zmax)])
• %contour rappresenta in grafico le isolinee in 2D
• [C, h]=contour(X1,Y1,Z1,v);
Grafico prodotto con script
Plot_DTM_isolinea
Scegli una zona di particolare interesse:
aggiungi comando axis. Qui il grafico e’
ristretto su una dolina.
• %Plot_DTM_isolinea
• Zmin=180; Zmax=500;
• step=2;
• v=Zmin:step:Zmax;
• sv=size(v);
• load DTM_ortom_reg_regrid10m_WGS84_HD.mat;
•
• %num2str converte i numeri in stringhe, altrimenti la concatenazione(di
• %stringhe) non e' possibile
• figure('name',['esempio 2D isolinee Zmin: ' num2str(Zmin) ' Zmax: '
num2str(Zmax)])
• %contour rappresenta in grafico le isolinee in 2D
• [C, h]=contour(X1,Y1,Z1,v);
• %axis([xmin xmax ymin ymax])
• axis([13.74 13.76 45.715 45.725]);
13.74 13.742 13.744 13.746 13.748 13.75 13.752 13.754 13.756 13.758 13.7645.715
45.716
45.717
45.718
45.719
45.72
45.721
45.722
45.723
45.724
45.725
Segue l’analisi numerica del DTM. Di seguito
utilizziamo il DTM proiettato in coordinate
metriche.
• Proiezione utilizzata: RDN2008 fuso 33
• Nome del file: DTM_esercizio3.MAT
Analisi di una superficie:
profilo e minimi locali nella topografia
Possiamo trovare
automaticamente tutte
le doline in un modello
del terreno?
A A′
Profilo topografico /1
load('DTM_esercizio3');
contourf(X,Y,Z,25);
• Vogliamo estrarre il profilo lungo un segmento qualsiasi
• Il segmento è definito dalle coordinate di inizio e fine
• Otteniamo le coordinate cliccando sulla figura della mappa
• carichiamo il DTM, che contiene Z, X, Y
• contourf: linee di livello con riempimento, 25 livelli
• Questo modello del terreno è in
coordinate proiettate, le unità sugli assi
sono metri
• È presente un valore di altitudine ogni 10
metri, sia lungo x che lungo y
• Ovvero: la risoluzione è di 10 metri/pixel
Profilo topografico /2
• Vogliamo estrarre il profilo lungo un segmento qualsiasi
• Il segmento è definito dalle coordinate di inizio e fine
• Otteniamo le coordinate cliccando sulla figura della mappa
Scriviamo una funzione per ottenere questo, utilizzeremo:
• ginput per leggere le coordinate dei punti cliccati da una figura aperta
• interp2 per calcolare, interpolando, l’altitudine per ogni punto lungo il profilo
– i punti del profilo non coincidono con i nodi della griglia del modello del terreno
Profilo topografico /3
function [profX,profY,profL,profZ] = ... TracciaProfilo(X,Y,Z,passo)
% input dei punti
contourf(X,Y,Z,25);
hold on
[xclick,yclick] = ginput(2);
plot(xclick,yclick,'r','LineWidth',4)
% costruzione del segmento del profilo
deltax = xclick(2)-xclick(1);
deltay = yclick(2)-yclick(1);
lunghezza = sqrt((deltax)^2 + (deltay)^2);
azi = atan2((deltay),(deltax));
profL = 0:passo:lunghezza;
profX = xclick(1) + (profL * cos(azi));
profY = yclick(1) + (profL * sin(azi));
% interpolazione delle quote lungo il profilo
profZ = interp2(X,Y,Z,profX,profY);
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
• argomenti input:
– X,Y,Z del terreno
– passo con cui campioniamo il profilo
• ovvero: ogni quanti metri un punto
• argomenti output:
– profX, profY coord. dei punti del profilo
– profL vettore della distanza lungo il profilo
• è 0 : passo : lunghezza del profilo
– profZ vettore delle quote del profilo
Profilo topografico /4
function [profX,profY,profL,profZ] = ... TracciaProfilo(X,Y,Z,passo)
% input dei punti
contourf(X,Y,Z,25);
hold on
[xclick,yclick] = ginput(2);
plot(xclick,yclick,'r','LineWidth',4)
% costruzione del segmento del profilo
deltax = xclick(2)-xclick(1);
deltay = yclick(2)-yclick(1);
lunghezza = sqrt((deltax)^2 + (deltay)^2);
azi = atan2((deltay),(deltax));
profL = 0:passo:lunghezza;
profX = xclick(1) + (profL * cos(azi));
profY = yclick(1) + (profL * sin(azi));
% interpolazione delle quote lungo il profilo
profZ = interp2(X,Y,Z,profX,profY);
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
• argomenti input:
– X,Y,Z del terreno
– passo con cui campioniamo il profilo
• ovvero: ogni quanti metri un punto
• argomenti output:
– profX, profY coord. dei punti del profilo
– profL vettore della distanza lungo il profilo
• è 0 : passo : lunghezza del profilo
– profZ vettore delle quote del profilo
• disegna una mappa con curve di livello riempite,
25 livelli, quindi usa ginput per salvare (2) punti in
xclick (coordinate x) e yclick (coordinate y)
• il tracciato del profilo viene poi disegnato sulla
mappa, in rosso ‘r’ e con spessore 'LineWidth',4
Profilo topografico /5
function [profX,profY,profL,profZ] = ... TracciaProfilo(X,Y,Z,passo)
% input dei punti
contourf(X,Y,Z,25);
hold on
[xclick,yclick] = ginput(2);
plot(xclick,yclick,'r','LineWidth',4)
% costruzione del segmento del profilo
deltax = xclick(2)-xclick(1);
deltay = yclick(2)-yclick(1);
lunghezza = sqrt((deltax)^2 + (deltay)^2);
azi = atan2((deltay),(deltax));
profL = 0:passo:lunghezza;
profX = xclick(1) + (profL * cos(azi));
profY = yclick(1) + (profL * sin(azi));
% interpolazione delle quote lungo il profilo
profZ = interp2(X,Y,Z,profX,profY);
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
• adesso costruiamo il tracciato del profilo, cioè:
–il vettore «profL» che descrive la distanza
lungo il profilo, da zero alla fine, con un
elemento ogni step
–due vettori «profX» e «profY», che sono le
coordinate di ogni punto che compone il
profilo
x1,y1 = xclick(1),yclick(1)
x2,y2 = xclick(2),yclick(2)
Δx = x2-x1
Δy =
y2-y
1
lunghezza
Δ𝑥2 + Δ𝑦2
azimuth (rispetto all’asse x)
𝑡𝑎𝑛−1Δ𝑦
Δ𝑥
Profilo topografico /6
function [profX,profY,profL,profZ] = ... TracciaProfilo(X,Y,Z,passo)
% input dei punti
contourf(X,Y,Z,25);
hold on
[xclick,yclick] = ginput(2);
plot(xclick,yclick,'r','LineWidth',4)
% costruzione del segmento del profilo
deltax = xclick(2)-xclick(1);
deltay = yclick(2)-yclick(1);
lunghezza = sqrt((deltax)^2 + (deltay)^2);
azi = atan2((deltay),(deltax));
profL = 0:passo:lunghezza;
profX = xclick(1) + (profL * cos(azi));
profY = yclick(1) + (profL * sin(azi));
% interpolazione delle quote lungo il profilo
profZ = interp2(X,Y,Z,profX,profY);
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
x1,y1
x2,y2
Δx = x2-x1
Δy =
y2-y
1
lunghezza
Δ𝑥2 + Δ𝑦2
azimuth (rispetto all’asse x)
𝑡𝑎𝑛−1Δ𝑦
Δ𝑥
profL(1) = 0
profL(end) = lunghezza
quali sono le coordinate di
questo i-esimo elemento di
profL?
𝑝𝑟𝑜𝑓𝑋𝑖 = 𝑝𝑟𝑜𝑓𝐿𝑖 ∙ cos(𝑎𝑧𝑖)𝑝𝑟𝑜𝑓𝑌𝑖 = 𝑝𝑟𝑜𝑓𝐿𝑖 ∙ sin(𝑎𝑧𝑖)
a cui poi sommiamo le
coordinate di x1, y1 (l’inizio del
profilo)profX(i)p
rofY
(i)
Profilo topografico /7
function [profX,profY,profL,profZ] = ... TracciaProfilo(X,Y,Z,passo)
% input dei punti
contourf(X,Y,Z,25);
hold on
[xclick,yclick] = ginput(2);
plot(xclick,yclick,'r','LineWidth',4)
% costruzione del segmento del profilo
deltax = xclick(2)-xclick(1);
deltay = yclick(2)-yclick(1);
lunghezza = sqrt((deltax)^2 + (deltay)^2);
azi = atan2((deltay),(deltax));
profL = 0:passo:lunghezza;
profX = xclick(1) + (profL * cos(azi));
profY = yclick(1) + (profL * sin(azi));
% interpolazione delle quote lungo il profilo
profZ = interp2(X,Y,Z,profX,profY);
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
profL(1) = 0
profL(end) = lunghezza
Osservazione:
Il prodotto * tra profL (un vettore) e il
coseno/seno dell’angolo azi (uno scalare) ha
come risultato un vettore lungo quanto profL.
Così facendo, per ogni elemento di profL
(lunghezza lungo il profilo) abbiamo la sua
coordinata X e la sua coordinata Y.
profX(i)
pro
fY(i
)
Profilo topografico /8
function [profX,profY,profL,profZ] = ... TracciaProfilo(X,Y,Z,passo)
% input dei punti
contourf(X,Y,Z,25);
hold on
[xclick,yclick] = ginput(2);
plot(xclick,yclick,'r','LineWidth',4)
% costruzione del segmento del profilo
deltax = xclick(2)-xclick(1);
deltay = yclick(2)-yclick(1);
lunghezza = sqrt((deltax)^2 + (deltay)^2);
azi = atan2((deltay),(deltax));
profL = 0:passo:lunghezza;
profX = xclick(1) + (profL * cos(azi));
profY = yclick(1) + (profL * sin(azi));
% interpolazione delle quote lungo il profilo
profZ = interp2(X,Y,Z,profX,profY);
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
• Usiamo la funzione interp2, che interpola valori
su griglie meshgrid (ad ogni elemento della
matrice Z corrisponde un elemento nelle matrici X
e Y, con rispettivamente le sue coordinate x ed y)
interp2(X,Y,Z,profX,profY)
meshgrid
coordinate
(m x n)
coordinate X
dei punti su cui
interpolare
coordinate Y
dei punti su cui
interpolare
matrice F(x,y)
(m x n)
nel nostro caso
la quota
Profilo topografico /9
% chiudi finestre aperte da vecchie figure
% ed elimina eventuali variabili già esistenti
close all
clear variables
% carica la topografia (X,Y,Z)
load('DTM_esercizio3');
% chiamata alla funzione TracciaProfilo
[profiloX,profiloY,profiloDist,profiloQuota] = ...
TracciaProfilo(X,Y,Z,5);
% figura: mappa
AssiMappa = subplot(3,1,[1 2]);
contourf(AssiMappa,X,Y,Z,25);
hold on;
plot(AssiMappa,profiloX,profiloY,'r','LineWidth',4);
% figura: profilo
AssiProfilo = subplot(3,1,3);
plot(AssiProfilo,profiloDist,profiloQuota,'r');
• Con uno script, come quello qui lato:
1. Carichiamo il modello del terreno
2. Chiamiamo la funzione TracciaProfilo
3. La funzione ci restituisce:
– il tracciato del profilo in coordinate
– i punti lungo il profilo
– la quota in ciascuno dei punti lungo il
profilo
4. Creiamo una figura con due subplot su tre
righe:
– sopra: la mappa con i contour (occupa
due caselle subplot) e il tracciato del
profilo
– sotto: il profilo (in x la distanza, in y la
quota)
Profilo topografico /10
% chiudi finestre aperte da vecchie figure
% ed elimina eventuali variabili già esistenti
close all
clear variables
% carica la topografia (X,Y,Z)
load('DTM_esercizio3');
% chiamata alla funzione TracciaProfilo
[profiloX,profiloY,profiloDist,profiloQuota] = ...
TracciaProfilo(X,Y,Z,5);
% figura: mappa
AssiMappa = subplot(3,1,[1 2]);
contourf(AssiMappa,X,Y,Z,25);
hold on;
plot(AssiMappa,profiloX,profiloY,'r','LineWidth',4);
% figura: profilo
AssiProfilo = subplot(3,1,3);
plot(AssiProfilo,profiloDist,profiloQuota,'r');
Ricerca dei minimi locali /1
Vogliamo individuare i minimi locali su una superficie.
Nello specifico, le doline in un modello digitale del terreno
(DTM) in zona carsica.
Le condizioni sono le seguenti:
1. La superficie è molto estesa e i minimi sono numerosi
2. La superficie è campionata regolarmente, in punti discreti
(non è una funzione analitica)
3. È presente del rumore, ovvero dei minimi locali che non
sono il nostro obiettivo. Esempio: piccole asperità nel
terreno.
Ricerca dei minimi locali /2
Vogliamo individuare i minimi locali su una superficie.
Nello specifico, le doline in un modello digitale del terreno
(DTM) in zona carsica.
Le condizioni sono le seguenti:
1. La superficie è molto estesa e i minimi sono numerosi
2. La superficie è campionata regolarmente, in punti discreti
(non è una funzione analitica)
3. È presente del rumore, ovvero dei minimi locali che non
sono il nostro obiettivo. Esempio: piccole asperità nel
terreno.
Dobbiamo pensare a una strategia adatta:
• Non è possibile individuarle una ad una, a mano.
• È necessario scegliere un criterio per discriminare tra
doline e rumore.
Ricerca dei minimi locali /3Vediamo velocemente una prova con la stessa strategia usata
per il livello del pozzo Trebiciano, ora però siamo in 2 dimensioni.
Quindi le due condizioni per un minimo locale sono le seguenti:
• Determinante della matrice hessiana > 0
• Derivata seconda > 0 (è sufficiente che 𝑓𝑥𝑥 > 0)
load('DTM_esercizio3.mat')
[gx, gy] = gradient(Z);
[gxx, ~] = gradient(gx);
[gxy, gyy] = gradient(gy);
detHess = gxx.*gyy - gxy.^2;
find(and(detHess>0,fxx>0));
minimiX = X(minimi);
minimiY = Y(minimi);
con detHess>0 : molto rumore
con detHess>2 : meno rumore
𝐻𝑓 𝑥, 𝑦 =𝑓𝑥𝑥 𝑓𝑥𝑦𝑓𝑥𝑦 𝑓𝑦𝑦
Per la dimostrazione, vedere:
http://calvino.polito.it/~taise/Esercizi
%202006/2006-05-25%20-
%20Appunti%20-%20Hessiana.pdf
matrice Hessiana
Ricerca dei minimi locali /4
contourf(X,Y,Z,50);
hold on;
scatter(minimiTEST_X,minimiTEST_Y,6,'r');
% «6» indica la dimensione dei punti, ‘r’ il colore rosso
Disegniamo i punti trovati su una mappa contourf:
Problemi:
• Non sempre i punti trovati
corrispondono al nostro obiettivo
(doline)
• Spesso sono presenti più punti per
ciascuna dolina (fondo piatto)
P non è una dolina:
entro la finestra c’è un valore
inferiore alla quota di P
Ricerca dei minimi locali /5Pensiamo a una strategia differente!
Un punto è una dolina se si verificano entrambe queste condizioni:
1. è il più basso tra tutti i punti entro una finestra rettangolare attorno a sé
2. la differenza tra la media della quota di tutti i punti nella finestra e quella del punto è
superiore a una soglia (da noi impostata)
Abbiamo quindi due parametri, la cui scelta è soggettiva:
• dimensione della finestra attorno al punto
• valore della soglia
P
Q
Q è una dolina:
la quota di Q coincide col
minimo entro la finestra
topografia
R
R non è una dolina:
la quota di R coincide col
minimo entro la finestra,
ma la differenza rispetto alla
quota media entro la
finestra è troppo piccola,
inferiore a «soglia»
topografia
Ricerca dei minimi locali /6
function [U,V] = CercaDoline(A,finestra,soglia)
D = zeros(size(A));
for u=1+finestra:size(A,1)-finestra
for v=1+finestra:size(A,2)-finestra
fmin = min(min(A(u-finestra:u+finestra,v-finestra:v+finestra)));
fmed = mean(mean(A(u-finestra:u+finestra,v-finestra:v+finestra)));
if A(u,v)==fmin && fmed-fmin>=soglia
D(u,v) = 1;
end
end
end
[U,V] = find(D==1);
end
Scriviamo quanto appena descritto come una funzione.
Argomenti in input: A matrice delle quote, finestra dimensione della finestra, soglia valore della soglia
Argomenti in output: U, V indici degli elementi che sono doline (grazie ad X e Y poi li tradurremo in coordinate)
finestra =
numero di elementi di cui ci allontaniamo
dall’elemento (u,v), in ciascuna direzione
Osservazione: il ciclo for evita i bordi della
nostra matrice, inizia a una finestra di
distanza dal bordo.
Vedi: le due righe del ciclo for.
Ricerca dei minimi locali /7
load('DTM_esercizio3');
[U,V] = CercaDoline(Z,5,0.5);
dolineX = X(1,V);
dolineY = Y(U,1);
contour(X,Y,Z,50);
hold on;
scatter(dolineX,dolineY,6,'r');
Chiamiamo «CercaDoline» in uno script e disegniamo i risultati su una mappa.
finestra = 5, c’è un elemento ogni 10 metri, quindi 5x10x2 = 100 metri
soglia = 0.5 m
estraiamo dalla prima riga di X e dalla prima colonna di Y le coordinate che
corrispondono a ciascun punto definito da U e V
• Sembra funzionare meglio.
• Cosa accade variando i due parametri?
Curva ipsometrica
e istogramma quota doline
for i=1:length(U)
dolineZ(i)=Z(U(i),V(i));
end
nb = 50; % numero intervalli
intervalli = linspace(min(Z(:)),max(Z(:)),nb);
subplot(2,1,1);
histogram(Z,intervalli,'Normalization','probability');
subplot(2,1,2);
histogram(dolineZ,intervalli,'Normalization','probability');