{{ project_title }}
{% endif %} {% if jm and (jm.get('region') or jm.get('state_district')) %}Processado em: {{ jm.generated_at }}
{% endif %}Total de imagens: {{ total_images }}
{% set pc = agg.pqi_classification %} {% if pc %} {% set pqi_score = agg.pqi_mean %} {% if pqi_score is not none %} {% set star_ratio = (pqi_score / 100.0 * 5.0) %} {% set full_stars = star_ratio|int %} {% set remainder = star_ratio - full_stars %} {% set has_half = 1 if remainder >= 0.25 else 0 %} {% set empty_stars = 5 - full_stars - has_half %} {% else %} {% set full_stars = pc.level %} {% set has_half = 0 %} {% set empty_stars = 5 - full_stars %} {% endif %}PQI geral: {{ pc.score_display }} ({{ pc.label }}) {% for _ in range(full_stars) %}★{% endfor %} {% if has_half %}★{% endif %} {% for _ in range(empty_stars) %}☆{% endfor %}
{% else %}Classificacao PQI indisponivel
{% endif %}| Modelo do drone | {{ agg.general_info.equipment_models | join(', ') if agg.general_info.equipment_models else 'N/A' }} |
|---|---|
| Numero de serie do drone | {{ agg.general_info.equipment_serial_numbers | join(', ') if agg.general_info.equipment_serial_numbers else 'N/A' }} |
| Modelo da camera | {{ agg.general_info.camera_models | join(', ') if agg.general_info.camera_models else 'N/A' }} |
| Numero de serie da camera | {{ agg.general_info.camera_serial_numbers | join(', ') if agg.general_info.camera_serial_numbers else 'N/A' }} |
| Versao do firmware | {{ agg.general_info.firmware_versions | join(', ') if agg.general_info.firmware_versions else 'N/A' }} |
| GPS Datum · Status | {{ agg.general_info.gps_datum | join(', ') if agg.general_info.gps_datum else 'N/A' }} · {{ agg.general_info.gps_status | join(', ') if agg.general_info.gps_status else 'N/A' }} {% if agg.general_info.gps_status_xmp %} - {{ agg.general_info.gps_status_xmp | join(', ') }} {% endif %} |
| Tipo de voo · Qualidade | {% set alt_class = agg.general_info.altitude_classification_type %} {% set alt_label = agg.general_info.altitude_classification_label %} {% set fq = agg.general_info.flight_quality_label %} {% set fq_type = agg.general_info.flight_quality_type %} {% if alt_class and alt_class != 'unavailable' %} {{ alt_label }} {% else %} Indisponivel {% endif %} {% if fq and fq != 'Indisponivel' %} {{ fq }} {% endif %} |
| Data de inicio | {{ agg.general_info.capture_start }} |
| Data de termino | {{ agg.general_info.capture_end }} |
| Tempo total de voo | {{ agg.general_info.total_flight_time }} |
| Numero de voos | {{ agg.general_info.total_flights }} |
| Ultimo disparo por camera | {% if agg.general_info.last_shutter_per_camera %}
{% for item in agg.general_info.last_shutter_per_camera %}
{{ item.camera_serial }}: {{ item.last_shutter_count }}{% if not loop.last %} {% endif %} {% endfor %} {% else %} - {% endif %} |
| GSD médio | {% if per_indicator.get('gsd_cm') and per_indicator['gsd_cm'].get('value_mean') is not none %} {{ '%.2f'|format(per_indicator['gsd_cm']['value_mean']) }} cm {% else %}-{% endif %} {% set gsd = per_indicator.get('gsd_cm', {}) %} {% if gsd.get('value_p5') is not none and gsd.get('value_p95') is not none and gsd.get('value_percentile_range') is not none %} · p5%: {{ '%.2f'|format(gsd['value_p5']) }} cm · p95%: {{ '%.2f'|format(gsd['value_p95']) }} cm · variação: {{ '%.2f'|format(gsd['value_percentile_range']) }} cm {% endif %} {% set gsd_stab = agg.general_info.gsd_stability_label %} {% if gsd_stab and gsd_stab != 'Indisponivel' %} {{ gsd_stab }} {% endif %} |
|---|---|
| Altitude Relativa | {% if m.relative_altitude_mean is not none %} {{ '%.2f'|format(m.relative_altitude_mean) }} m {% else %}-{% endif %} {% if m.relative_altitude_p5 is not none and m.relative_altitude_p95 is not none and m.relative_altitude_range is not none %} · p5%: {{ '%.2f'|format(m.relative_altitude_p5) }} m · p95%: {{ '%.2f'|format(m.relative_altitude_p95) }} m · variação: {{ '%.2f'|format(m.relative_altitude_range) }} m {% endif %} |
| Altura do voo (LRF) | {% if m.lrf_target_mean is not none %} {{ '%.2f'|format(m.lrf_target_mean) }} m {% else %}-{% endif %} {% if m.lrf_target_p5 is not none and m.lrf_target_p95 is not none and m.lrf_target_range is not none %} · p5%: {{ '%.2f'|format(m.lrf_target_p5) }} m · p95%: {{ '%.2f'|format(m.lrf_target_p95) }} m · variação: {{ '%.2f'|format(m.lrf_target_range) }} m {% endif %} |
| Altitude do solo | {% if m.ground_elevation_mean is not none %} {{ '%.2f'|format(m.ground_elevation_mean) }} m {% else %}-{% endif %} {% if m.ground_elevation_p5 is not none and m.ground_elevation_p95 is not none and m.ground_elevation_range is not none %} · p5%: {{ '%.2f'|format(m.ground_elevation_p5) }} m · p95%: {{ '%.2f'|format(m.ground_elevation_p95) }} m · variação: {{ '%.2f'|format(m.ground_elevation_range) }} m {% endif %} {% set sc = agg.general_info.slope_classification %} {% set sp = agg.general_info.slope_pct %} {% if sc and sc != 'Indisponivel' %} {{ sc }} ({{ sp }}%) {% endif %} |
| Distância entre fotos (m) | {% if m.dist3d_prev_mean is not none %} {{ '%.2f'|format(m.dist3d_prev_mean) }} m {% else %}-{% endif %} {% if m.dist3d_prev_p5 is not none and m.dist3d_prev_p95 is not none and m.dist3d_prev_range is not none %} · p5%: {{ '%.2f'|format(m.dist3d_prev_p5) }} m · p95%: {{ '%.2f'|format(m.dist3d_prev_p95) }} m · variação: {{ '%.2f'|format(m.dist3d_prev_range) }} m {% endif %} |
| Idade do sinal RTK | {% if m.rtk_diff_age_mean is not none %} {{ '%.2f'|format(m.rtk_diff_age_mean) }}s {% else %}-{% endif %} {% if m.rtk_diff_age_p5 is not none and m.rtk_diff_age_p95 is not none and m.rtk_diff_age_range is not none %} · p5%: {{ '%.2f'|format(m.rtk_diff_age_p5) }}s · p95%: {{ '%.2f'|format(m.rtk_diff_age_p95) }}s · variação: {{ '%.2f'|format(m.rtk_diff_age_range) }}s {% endif %} {% if m.rtk_diff_age_mean is not none %} {% if m.rtk_diff_age_mean == 0 %} Voo sem RTK {% elif m.rtk_diff_age_range is not none and m.rtk_diff_age_range > 1.0 %} RTK Instavel {% elif m.rtk_diff_age_range is not none %} RTK Estavel {% endif %} {% endif %} |
| Estabilidade do sinal RTK | {{ m.rtk_stability_class if m.rtk_stability_class is not none else '-' }} {% if m.rtk_stability_mean is not none %}(media {{ '%.2f'|format(m.rtk_stability_mean) }}%){% endif %} |
| Precisão RTK efetiva | {% if m.rtk_effective_precision_raw is not none %}{{ m.rtk_effective_precision_raw }}{% elif m.rtk_effective_precision_mean is not none %}{{ '%.3f'|format(m.rtk_effective_precision_mean) }} m (max {{ '%.3f'|format(m.rtk_effective_precision_max) }} m){% else %}-{% endif %} |
| Desalinhamento do gimbal | {% if m.gimbal_offset_mean is not none %} {{ '%.2f'|format(m.gimbal_offset_mean) }}° {% else %}-{% endif %} {% if m.gimbal_offset_p5 is not none and m.gimbal_offset_p95 is not none and m.gimbal_offset_range is not none %} · p5%: {{ '%.2f'|format(m.gimbal_offset_p5) }}° · p95%: {{ '%.2f'|format(m.gimbal_offset_p95) }}° · variação: {{ '%.2f'|format(m.gimbal_offset_range) }}° {% endif %} |
| Drone Roll medio (°) | {% if m.flight_roll_mean is not none %} {{ '%.2f'|format(m.flight_roll_mean) }}° {% else %}-{% endif %} {% if m.flight_roll_p5 is not none and m.flight_roll_p95 is not none and m.flight_roll_range is not none %} · p5%: {{ '%.2f'|format(m.flight_roll_p5) }}° · p95%: {{ '%.2f'|format(m.flight_roll_p95) }}° · variação: {{ '%.2f'|format(m.flight_roll_range) }}° {% endif %} |
| Drone Yaw medio (°) | {% if m.flight_yaw_mean is not none %} {{ '%.2f'|format(m.flight_yaw_mean) }}° {% else %}-{% endif %} {% if m.flight_yaw_p5 is not none and m.flight_yaw_p95 is not none and m.flight_yaw_range is not none %} · p5%: {{ '%.2f'|format(m.flight_yaw_p5) }}° · p95%: {{ '%.2f'|format(m.flight_yaw_p95) }}° · variação: {{ '%.2f'|format(m.flight_yaw_range) }}° {% endif %} |
| Drone Pitch medio (°) | {% if m.flight_pitch_mean is not none %} {{ '%.2f'|format(m.flight_pitch_mean) }}° {% else %}-{% endif %} {% if m.flight_pitch_p5 is not none and m.flight_pitch_p95 is not none and m.flight_pitch_range is not none %} · p5%: {{ '%.2f'|format(m.flight_pitch_p5) }}° · p95%: {{ '%.2f'|format(m.flight_pitch_p95) }}° · variação: {{ '%.2f'|format(m.flight_pitch_range) }}° {% endif %} |
| Area estimada coberta (ha) | {{ m.estimated_area_ha if m.estimated_area_ha is not none else 'N/A' }} |
|---|---|
| Inconsistencia de iluminacao | {{ m.light_inconsistent_pct }}% |
| Classes de luz presentes | {% if m.light_source_classes %}
{% for c in m.light_source_classes %}{{ c.label_pt }} ({{ c.count }}) {{ c.pct }}%{% if not loop.last %} {% endif %}{% endfor %} {% else %}N/A{% endif %} |
| Sobreposicao frontal abaixo de 60% | {% if m.overlap_below_ideal_pct is not none %}{{ '%.2f'|format(m.overlap_below_ideal_pct) }}%{% else %}-{% endif %} |
| Sobreposicao frontal media | {% if m.overlap_mean is not none %} {{ '%.2f'|format(m.overlap_mean) }} % {% else %}-{% endif %} {% if m.overlap_p5 is not none and m.overlap_p95 is not none and m.overlap_range is not none %} · p5%: {{ '%.2f'|format(m.overlap_p5) }} % · p95%: {{ '%.2f'|format(m.overlap_p95) }} % · variação: {{ '%.2f'|format(m.overlap_range) }} % {% endif %} |
| Velocidade media | {% if m.speed_ms_mean is not none %} {{ '%.2f'|format(m.speed_ms_mean) }} m/s {% else %}-{% endif %} {% if m.speed_ms_p5 is not none and m.speed_ms_p95 is not none and m.speed_ms_range is not none %} · p5%: {{ '%.2f'|format(m.speed_ms_p5) }} m/s · p95%: {{ '%.2f'|format(m.speed_ms_p95) }} m/s · variação: {{ '%.2f'|format(m.speed_ms_range) }} m/s {% endif %} |
| Direcao de voo inconsistente | {{ m.yaw_inconsistent_pct if m.yaw_inconsistent_pct is not none else '-' }}% |
| Motion Blur medio | {% if m.motion_blur_mean is not none %} {{ '%.2f'|format(m.motion_blur_mean) }} ({{ mb_class }}) {% else %}-{% endif %} {% if m.motion_blur_p5 is not none and m.motion_blur_p95 is not none and m.motion_blur_range is not none %} · p5%: {{ '%.2f'|format(m.motion_blur_p5) }} · p95%: {{ '%.2f'|format(m.motion_blur_p95) }} · variação: {{ '%.2f'|format(m.motion_blur_range) }} {% endif %} |
| Indice de qualidade (PQI) | {% if m.pqi_last_quartile_mean is not none %}{{ '%.2f'|format(m.pqi_last_quartile_mean) }}{% else %}-{% endif %} |
| Tamanho medio do arquivo | {% if m.size_mb_mean is not none %}{{ '%.2f'|format(m.size_mb_mean) }} MB{% else %}-{% endif %} |
| Severidade | Categoria | Titulo | Detalhe | Impacto | Acao | Afilhados (%) |
|---|---|---|---|---|---|---|
| {{ a.severity }} | {{ a.category }} | {{ a.title }} | {{ a.detail }} | {{ a.impact }} | {{ a.action }} | {% if a.total_count > 0 %} {{ a.affected_count }}/{{ a.total_count }} ({{ a.affected_pct }}%) {% endif %} |
|
Voos afetados:
{% for fid in a.flight_ids %}
{% set flight_folder = flight_folder_map.get(fid) %}
{% if flight_folder %}
{{ fid }}{% if not loop.last %}, {% endif %}
{% elif base_folder %}
{{ fid }}{% if not loop.last %}, {% endif %}
{% else %}
{{ fid }}{% if not loop.last %}, {% endif %}
{% endif %}
{% endfor %}
{% if a.photos and a.photos|length > 0 %}
Fotos: {% for photo in a.photos %} {% if photo_path_map.get(photo) %} {{ photo }}{% if not loop.last %}, {% endif %} {% else %} {{ photo }}{% if not loop.last %}, {% endif %} {% endif %} {% endfor %} {% endif %} |
||||||
| Severidade | Titulo | Detalhe | Impacto | Acao |
|---|---|---|---|---|
| {{ 'CRITICO' if agg.general_info.dewarp_status_type == 'critical' else ('ALERTA' if agg.general_info.dewarp_status_type == 'warn' else 'INFO') }} | Dewarp | {{ agg.general_info.dewarp_status_message }} | Impacta diretamente geometrias e qualidade radiométrica da reconstrução. | Garantir dewarping habilitado em 100% da missão. |
| {{ 'ALERTA' if agg.general_info.altitude_status_type == 'warn' else 'INFO' }} | Altitude incompleta | {{ agg.general_info.altitude_status_message }} | Afeta consistência altimétrica, GSD e sobreposição prevista. | Corrigir captura de Alt (MRK) e AbsoluteAltitude antes do processamento. |
| {{ a.severity }} | {{ a.title }} | {{ a.detail }} | {{ a.impact }} | {{ a.action }} |
| Inicio | Fim | Total |
|---|---|---|
| {{ p.pipeline_start[:19] if p.pipeline_start else 'N/A' }} | {{ p.pipeline_end[:19] if p.pipeline_end else 'N/A' }} | {{ p.total_formatted }} ({{ '%.0f'|format(p.total_seconds) }}s) |
Ausentes: {{ p.missing_stages | join(', ') }}
{% endif %}| Voo | Imagens | Inicio | Fim | Tempo | km/h | m/s | Hectares | Altura Relativa | Altitude | GSD (cm) | {% if agg.show_column_lrf %}Distancia Solo | {% endif %}Temperatura Sensor | Gimbal Offset (°) | Sobreposição (%) | Estab. RTK | Motion Blur | Distancia (m) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ f['flight_id'] }} | {{ f['images'] }} | {{ f['start'] }} | {{ f['end'] }} | {{ f['flight_time'] }} | {% if f['avg_speed3d_kmh'] is not none %}{{ '%.2f'|format(f['avg_speed3d_kmh']) }}{% else %}-{% endif %} | {% if f['avg_speed3d_ms'] is not none %}{{ '%.2f'|format(f['avg_speed3d_ms']) }}{% else %}-{% endif %} | {% if f['estimated_area_ha'] is not none %}{{ '%.2f'|format(f['estimated_area_ha']) }}{% else %}-{% endif %} | {% if f['avg_relative_altitude'] is not none %}{{ '%.2f'|format(f['avg_relative_altitude']) }}{% else %}-{% endif %} | {% if f['altitude_solo'] is not none %}{{ '%.2f'|format(f['altitude_solo']) }}{% else %}-{% endif %} | {% if f['level5_means'].get('GroundSampleDistanceCm') is not none %}{{ '%.2f'|format(f['level5_means'].get('GroundSampleDistanceCm')) }}{% else %}-{% endif %} | {% if agg.show_column_lrf %}{% if f['avg_lrf_target_distance'] is not none %}{{ '%.2f'|format(f['avg_lrf_target_distance']) }}{% else %}-{% endif %} | {% endif %}{% if f['avg_sensor_temperature'] is not none %}{{ '%.2f'|format(f['avg_sensor_temperature']) }}{% else %}-{% endif %} | {% if f['level5_means'].get('GimbalOffset') is not none %}{{ '%.2f'|format(f['level5_means'].get('GimbalOffset')) }}°{% else %}-{% endif %} | {% if f['level5_means'].get('PredictedOverlap') is not none %}{{ '%.2f'|format(f['level5_means'].get('PredictedOverlap')) }}%{% else %} {%- if f['level5_means'].get('FOverlap') is not none %}{{ '%.2f'|format(f['level5_means'].get('FOverlap')) }}%{% else %}-{% endif %} {% endif %} | {% if f['level5_means'].get('RtkStabilityScore') is not none and f['level5_means'].get('RtkStabilityScore') >= 95 %}Estavel{% elif f['level5_means'].get('RtkStabilityScore') is not none and f['level5_means'].get('RtkStabilityScore') >= 85 %}Moderado{% elif f['level5_means'].get('RtkStabilityScore') is not none %}Instavel{% else %}-{% endif %} | {% if f['level5_means'].get('MotionBlurRisk') is not none %}{{ '%.3f'|format(f['level5_means'].get('MotionBlurRisk')) }}{% else %}-{% endif %} | {% if f['avg_dist3d_previous'] is not none %}{{ '%.2f'|format(f['avg_dist3d_previous']) }}{% else %}-{% endif %} |
| Voo | {% if agg.show_column_flight_roll %}Drone Roll | {% endif %} {% if agg.show_column_flight_yaw %}Drone Yaw | {% endif %} {% if agg.show_column_flight_pitch %}Drone Pitch | {% endif %} {% if agg.show_column_iso %}ISO | {% endif %} {% if agg.show_column_shutter %}Obturador | {% endif %} {% if agg.show_column_wb_cct %}Temp Cor (K) | {% endif %} {% for col in agg.flight_level5_columns %} {% if agg['show_column_level5_' ~ col.key] and col.key not in simple_level5_keys and col.key not in advanced_exclude_level5_keys %}{{ col.label }} | {% endif %} {% endfor %}
|---|---|---|---|---|---|---|---|
| {{ f['flight_id'] }} | {% if agg.show_column_flight_roll %}{% if f['avg_flight_roll'] is not none %}{{ '%.2f'|format(f['avg_flight_roll']) }}°{% else %}-{% endif %} | {% endif %} {% if agg.show_column_flight_yaw %}{% if f['avg_flight_yaw'] is not none %}{{ '%.2f'|format(f['avg_flight_yaw']) }}°{% else %}-{% endif %} | {% endif %} {% if agg.show_column_flight_pitch %}{% if f['avg_flight_pitch'] is not none %}{{ '%.2f'|format(f['avg_flight_pitch']) }}°{% else %}-{% endif %} | {% endif %} {% if agg.show_column_iso %}{% if f['avg_iso'] is not none %}{{ '%.0f'|format(f['avg_iso']) }}{% else %}-{% endif %} | {% endif %} {% if agg.show_column_shutter %}{% if f['avg_shutter_speed_text'] and f['avg_shutter_speed_text'] != 'N/A' %}{{ f['avg_shutter_speed_text'] }}{% else %}-{% endif %} | {% endif %} {% if agg.show_column_wb_cct %}{% if f['avg_white_balance_cct'] is not none %}{{ '%.0f'|format(f['avg_white_balance_cct']) }}{% else %}-{% endif %} | {% endif %} {% for col in agg.flight_level5_columns %} {% if agg['show_column_level5_' ~ col.key] and col.key not in simple_level5_keys and col.key not in advanced_exclude_level5_keys %}{% if f['level5_means'].get(col.key) is not none %}{{ '%.2f'|format(f['level5_means'].get(col.key)) }}{% else %}-{% endif %} | {% endif %} {% endfor %}
| Indicador | Media | Desvio | Max | Min | Range | Distribuicao |
|---|---|---|---|---|---|---|
| {{ stat.label }}{{ stat.threshold_type }} | {{ stat.value_mean if stat.value_mean is not none else '-' }} | {{ stat.value_std if stat.value_std is not none else '-' }} | {{ stat.value_max if stat.value_max is not none else '-' }} | {{ stat.value_min if stat.value_min is not none else '-' }} | {{ stat.value_range if stat.value_range is not none else '-' }} |
{% set d1 = stat.dist.get(1, 0) %}
{% set d2 = stat.dist.get(2, 0) %}
{% set d3 = stat.dist.get(3, 0) %}
{% set d4 = stat.dist.get(4, 0) %}
{% set d5 = stat.dist.get(5, 0) %}
{% set total = d1 + d2 + d3 + d4 + d5 %}
{% if d1 > 0 and total > 0 %}{% endif %}
{% if d2 > 0 and total > 0 %}{% endif %}
{% if d3 > 0 and total > 0 %}{% endif %}
{% if d4 > 0 and total > 0 %}{% endif %}
{% if d5 > 0 and total > 0 %}{% endif %}
Ranges
N1: {{ stat.level_ranges.get('1', '-') }}
N2: {{ stat.level_ranges.get('2', '-') }}
N3: {{ stat.level_ranges.get('3', '-') }}
N4: {{ stat.level_ranges.get('4', '-') }}
N5: {{ stat.level_ranges.get('5', '-') }}
|
| Arquivo | PQI | GSD | Motion Blur | RTK Eff. Prec. | Gimbal Offset | Yaw Error | Overlap | Speed Variac. | Inc. Angle |
|---|---|---|---|---|---|---|---|---|---|
| {{ r.filename }} | {{ r.level5_values.get('PhotogrammetryQualityIndex', r.values.get('photogrammetry_quality_index', '-')) }} | {{ r.values.get('gsd_cm', '-') }} | {{ r.messages.get('motion_blur_risk', '-') }} | {{ r.level5_values.get('RtkEffectivePrecision', '-') }} | {% set gim = r.level5_values.get('GimbalOffset') %}{% if gim is not none %}{{ '%.1f°'|format(gim|float) }}{% else %}-{% endif %} | {% set yaw = r.level5_values.get('YawAlignmentError') %}{% if yaw is not none %}{{ '%.1f°'|format(yaw|float) }}{% else %}-{% endif %} | {% set ov = r.level5_values.get('FOverlap') or r.level5_values.get('PredictedOverlap') %}{% if ov is not none %}{{ '%.0f%%'|format(ov|float) }}{% else %}-{% endif %} | {% set sv = r.level5_values.get('SpeedVariationIndex') %}{% if sv is not none %}{{ '%.3f'|format(sv|float) }}{% else %}-{% endif %} | {% set ia = r.level5_values.get('IncidenceAngle') %}{% if ia is not none %}{{ '%.1f°'|format(ia|float) }}{% else %}-{% endif %} |