Integrazioni: QGIS, Metashape, WebODM, Photo3D¶
QGIS, dal vivo¶
QGIS > Apri in QGIS (collegamento dal vivo) (o il pulsante QGIS nella barra del disegno)
scrive un progetto QGIS accanto al .ppg (<nome>_qgis/<nome>_ppg.qgs) e lo apre:
- raster: l'ortofoto, il DEM (ombreggiatura, all'inizio nascosta) e i valori del DEM;
- vettori, nel gruppo Disegni (aggiornati dal vivo): le tabelle di un GeoPackage,
disegni_ppg.gpkg:unita(poligoni delle unità, etichetta =etichetta),sezioni(tracce di sezione),curve(curve di livello, etichetta = quota),linee(altre linee),punti(quote, etichetta =z).
Il GeoPackage viene aggiornato 0,4 s dopo ogni modifica nell'interfaccia (disegno nuovo, layer tolto, attributo modificato), sul posto e con una transazione per ogni tabella cambiata, e il progetto chiede a QGIS di ridisegnare quei layer ogni secondo: QGIS rilegge un GeoPackage a ogni ridisegno, così quello che disegni qui compare in QGIS da solo, senza Aggiorna.
Fino alla 0.4.1 i disegni erano file GeoJSON impostati per ricaricare i dati ogni secondo, e i
disegni nuovi comparivano solo dopo Aggiorna: QGIS tiene il GeoJSON in memoria, e QGIS 3.34-3.42
non avvia il timer di aggiornamento di un layer letto da un progetto salvato con
autoRefreshMode (lo stile, letto per primo, imposta la modalità mentre l'intervallo è ancora 0;
poi la modalità viene impostata di nuovo, uguale), così la mappa continuava a mostrare l'immagine
che aveva in cache. Il progetto viene perciò scritto con il vecchio attributo autoRefreshEnabled,
che QGIS legge nell'ordine giusto. Un progetto salvato di nuovo da quelle versioni di QGIS prende
l'attributo nuovo e alla prossima apertura perde il ridisegno automatico: aprilo da qui (Apri in
QGIS lo riscrive). Usa Apri in QGIS una volta per portare sul GeoPackage un progetto collegato
con la 0.4.1. Un progetto che è stato aperto in QGIS resta collegato quando viene riaperto qui; i
raster fatti dopo il progetto QGIS (un DEM nuovo, un'ortofoto nuova) compaiono dopo un altro Apri
in QGIS. Il progetto è creato dal Python di QGIS stesso (/Applications/QGIS*.app,
C:\Program Files\QGIS*, /usr/bin/qgis, o PPG_QGIS), così stili ed etichette sono quelli
nativi di QGIS. Le unità pubblicate in PyArchInit (pyunitastratigrafiche) sono visibili,
naturalmente, anche nei layer PyArchInit di QGIS.
Metashape (.psx)¶
File > Importa > Progetto Metashape o ppg import-metashape progetto.psx nuovo.ppg.
Il progetto viene letto direttamente (Metashape non serve): i sensori con la loro calibrazione
(convertita nel modello COLMAP FULL_OPENCV: f, cx/cy dal centro, b1, k1..k3, p1/p2
scambiati nell'ordine di OpenCV), le camere allineate, i marker con riferimenti, accuratezze e
proiezioni, le barre di scala, i punti di legame con i colori, il modello (model.zip) e i GeoTIFF
di DEM e ortofoto esportati accanto al progetto (cartelle o nomi che contengono dem/dsm e
orto/ortho). Senza un DEM esportato utilizzabile (nessuno, o un file vuoto lasciato da
un'esportazione fallita, che viene segnalato), si usa il DEM conservato dentro il progetto:
Metashape lo tiene come tasselli GeoTIFF elencati in elevation.zip, che vengono uniti in mosaico
e riproiettati nel CRS del chunk alla risoluzione di Metashape (dem.tif nel progetto; Tell Abu
adh-Dhuhur: 8 tasselli, 10.241 x 10.545 px a 5,9 cm in 30 s, 2 cm dai punti di legame, mediana).
Il chunk viene collocato nel CRS di quei GeoTIFF, altrimenti nel CRS proiettato del progetto, o
nella zona UTM per i progetti geografici (similarità stimata passando per il sistema geocentrico di
Metashape).
Dalle pose importate viene scritto un modello COLMAP, così Nuvola densa, Modello, DEM e Ortofoto girano qui senza allineare di nuovo (le foto devono stare dove dice il progetto).
Dettagli dell'importazione:
- le barre di scala tra marker arrivano con la loro distanza, la loro accuratezza (quella della barra, altrimenti la Scale bar accuracy del chunk) e il loro tipo: una barra non spuntata nel pannello Reference di Metashape è una barra di verifica. Metashape ha già scalato il chunk con loro, così la trasformazione non viene stimata di nuovo: il pannello Riferimenti mostra ogni barra con il suo errore (su quattro progetti di oggetti di una campagna, barre da 0,5 m sono tornate a 0,5000 m). Le barre tra camere, o senza distanza, vengono segnalate e lasciate fuori. Le accuratezze dei marker vengono dai marker o dalla Marker accuracy del chunk;
- un chunk in coordinate locali scalato con le barre di scala ha una trasformazione con la sola scala (niente rotazione, niente traslazione): viene applicata (fino alla 0.5.1 la scala si perdeva e quei progetti arrivavano 3-14 volte troppo grandi);
- camere e marker dentro i gruppi (le cartelle del Workspace di Metashape) vengono letti; i chunk vuoti vengono saltati e il chunk con più camere allineate diventa quello attivo;
- i punti di legame vengono letti da ogni componente dell'allineamento, ciascuno con la propria trasformazione; i punti lasciati da componenti che non esistono più nel progetto (un frame obsoleto, centinaia di metri lontano) vengono lasciati fuori con un avviso;
- camere, punti di legame e vertici del modello vengono convertiti nel CRS punto per punto (le rotazioni delle camere seguono la rotazione locale della conversione), non con una sola similarità;
- il modello (
mesh.plyinmodel.zip, fino a decine di milioni di facce) viene estratto in streaming e una copia grossolana fatta per raggruppamento dei vertici (model_preview.ply, circa 600.000 facce) è quella che la vista 3D mostra; i colori dei vertici e la texture (untexture.tifa pagina singola, scritto comemodel_texture.jpg) arrivano con lui, e File > Importa > Modello e texture dal progetto Metashape li aggiunge ai progetti importati prima; - Metashape 2.x costruisce la mesh dalle mappe di profondità, così la maggior parte dei progetti non ha la nuvola densa: i vertici colorati della mesh diventano la nuvola densa (al massimo 8 milioni di punti). Per una vera nuvola densa lancia Nuvola densa qui (usa le pose di Metashape), oppure costruiscila in Metashape;
- i GeoTIFF di DEM e ortofoto esportati vengono cercati accanto al progetto, non dentro le cartelle di altri progetti, e collegati solo se coprono le camere.
Verificato sui progetti da drone di una campagna di rilievo (29-3.265 foto): Tell Dlamah importato
in 6 s (punti di legame +3 mm e vertici della mesh +4 mm dal DEM di Metashape, mediana), un
progetto di 425 foto con un gruppo di camere, un progetto di 3.265 foto con una componente
cancellata (+13 mm). Non letti: il formato interno dell'ortofoto di Metashape (blocchi di immagine
e linee di cucitura: esportala come GeoTIFF), le nuvole dense nel formato octree di Metashape, le
maschere, lo skew b2, k4.
WebODM / ODM¶
File > Importa > Progetto WebODM o ppg import-webodm all.zip nuovo.ppg (o la cartella del
task). Ortofoto, DSM (o DTM), nuvola di punti georeferenziata (.laz/.las/.ply) e la mesh con
texture (odm_textured_model_geo.obj, relativa all'offset in coords.txt) diventano i prodotti di
un chunk nel CRS dei raster.
Le camere arrivano con la loro calibrazione e la loro posa (cameras.json e
odm_report/shots.geojson, entrambi in all.zip), e i GCP usati da ODM diventano marker
(odm_georeferencing/ground_control_points.geojson, o gcp_list_utm.txt), con le coordinate
misurate a terra e i punti in cui sono stati misurati nelle foto. Vengono triangolati subito: il
pannello Riferimenti mostra i loro errori (gli stessi che calcola ODM; il suo valore è nel
rapporto dell'importazione), e tra loro si possono tracciare barre di scala per verificare la
scala. ODM non ha barre di scala sue: la scala di un task viene dal GPS delle foto o dai suoi GCP.
Con le foto (la cartella del task le ha, all.zip no) nuvola densa, modello e texture si possono
ricostruire qui dalle pose di ODM. Modelli di camera di OpenSfM: perspective, brown, radial,
simple_radial; le camere fisheye e sferiche vengono lasciate fuori. Le pose di un task non
georeferenziato non vengono importate.
Photo3D¶
Due modi:
- come motore di Photo3D — il server di Photo3D lancia i motori come sottoprocessi con
PHOTO3D_SESSION_DIRePHOTO3D_PRESET;ppg photo3d-jobsegue quel contratto: righePROGRESS <stage> <pct>, prodotti in<session>/metashape/(model.obj,pointcloud.ply,dem.tif,orthophoto.tif, piùppg_project.ppg) emetashape/result.json. Leggegcp_list.txt(formato ODM, pixel grezzi),target_list.json(target codificati con le coordinate misurate a terra: ArUco/AprilTag vengono riconosciuti, quelli circolari a 12 bit di Metashape no) escale.json(due tocchi e una lunghezza in mm: i tocchi vengono intersecati con un piano locale adattato alla nuvola densa; errore mediano di 0,5 mm su distanze di 50-180 mm nella prova del turntable). Preset: preview / medium / high. - come importazione — File > Importa > Sessione Photo3D o
ppg import-photo3d <session>: un.ppgcon foto, target e GCP, da elaborare nell'interfaccia.
Per aggiungere il motore a Photo3D (repository photo3d, server in mac/photo3d_server/):
config.py (ENGINE_NAMES += "ppg"), queue.py (build_command(): lancia
ppg photo3d-job con l'ambiente della sessione), engines/registry.py (disponibilità:
ppg nel PATH o l'app impacchettata), api.py (health() → ppgAvailable), e la scelta del
motore nelle app iOS (NewSessionSheet.swift) e Android (MainActivity.kt). Gli endpoint
esistenti servono già i prodotti da metashape/ con i loro nomi fissi.
Segment Anything 2.1 nell'applicazione desktop¶
PyTorch non è dentro l'applicazione. La prima volta che si usa uno strumento SAM, l'interfaccia
propone di installarlo (Strumenti > Segment Anything 2.1 > Installa / aggiorna SAM 2.1): uv
(dal PATH o scaricato dalla sua release ufficiale su GitHub) crea un ambiente Python 3.12 in
~/Library/Application Support/pyarchinit-photogrammetry/sam-env (macOS),
%LOCALAPPDATA%\pyarchinit-photogrammetry\sam-env (Windows) o ~/.local/share/... (Linux),
e installa PyTorch e sam2 (1-2 GB). SAM gira poi in un processo di lavoro di quell'ambiente
(ai/sam_worker.py), sulla GPU Apple (MPS), su CUDA o sulla CPU; i pesi del modello vengono
scaricati da Hugging Face al primo uso. Un'installazione con pip con l'extra [sam] continua a
eseguire SAM nello stesso processo.