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: berg@units.it 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
Grafico della topografia in 3D %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');
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 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]);
Proiezione utilizzata: RDN2008 fuso 33 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?
Profilo topografico /1 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 load('DTM_esercizio3'); contourf(X,Y,Z,25); 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 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 x2,y2 = xclick(2),yclick(2) lunghezza Δ𝑥 2 + Δ𝑦 2 azimuth (rispetto all’asse x) 𝑡𝑎𝑛 −1 Δ𝑦 Δ𝑥 lunghezza Δy = y2-y1 azi x1,y1 = xclick(1),yclick(1) Δx = x2-x1
Profilo topografico /6 x2,y2 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 lunghezza Δ𝑥 2 + Δ𝑦 2 azimuth (rispetto all’asse x) 𝑡𝑎𝑛 −1 Δ𝑦 Δ𝑥 lunghezza Δy = y2-y1 azi x1,y1 Δx = x2-x1 profL(end) = lunghezza profL(i) passo passo 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) passo profY(i) passo profL(1) = 0 profX(i)
Profilo topografico /7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 profL(end) = lunghezza profL(i) passo passo passo profY(i) passo profL(1) = 0 profX(i) 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.
dei punti su cui interpolare dei punti su cui interpolare Profilo topografico /8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 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) matrice F(x,y) (m x n) nel nostro caso la quota coordinate Y dei punti su cui interpolare coordinate X dei punti su cui interpolare
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: Carichiamo il modello del terreno Chiamiamo la funzione TracciaProfilo La funzione ci restituisce: il tracciato del profilo in coordinate i punti lungo il profilo la quota in ciascuno dei punti lungo il profilo 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: La superficie è molto estesa e i minimi sono numerosi La superficie è campionata regolarmente, in punti discreti (non è una funzione analitica) È 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: La superficie è molto estesa e i minimi sono numerosi La superficie è campionata regolarmente, in punti discreti (non è una funzione analitica) È 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 /3 Vediamo 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) con detHess>0 : molto rumore matrice Hessiana 𝐻𝑓 𝑥,𝑦 = 𝑓 𝑥𝑥 𝑓 𝑥𝑦 𝑓 𝑥𝑦 𝑓 𝑦𝑦 Per la dimostrazione, vedere: http://calvino.polito.it/~taise/Esercizi%202006/2006-05-25%20-%20Appunti%20-%20Hessiana.pdf 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>2 : meno rumore
Ricerca dei minimi locali /4 Disegniamo i punti trovati su una mappa contourf: contourf(X,Y,Z,50); hold on; scatter(minimiTEST_X,minimiTEST_Y,6,'r'); % «6» indica la dimensione dei punti, ‘r’ il colore rosso Problemi: Non sempre i punti trovati corrispondono al nostro obiettivo (doline) Spesso sono presenti più punti per ciascuna dolina (fondo piatto)
Ricerca dei minimi locali /5 Pensiamo a una strategia differente! Un punto è una dolina se si verificano entrambe queste condizioni: è il più basso tra tutti i punti entro una finestra rettangolare attorno a sé 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 topografia topografia P R P non è una dolina: entro la finestra c’è un valore inferiore alla quota di P 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» Q Q è una dolina: la quota di Q coincide col minimo entro la finestra
Ricerca dei minimi locali /6 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) 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 [U,V] = find(D==1); 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 Chiamiamo «CercaDoline» in uno script e disegniamo i risultati su una mappa. 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'); 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');