# 🌍 Land Use Intensity Analysis
[](https://pypi.org/project/landuse-intensity-analysis/)
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
> **Biblioteca Python completa para análise científica de mudanças no uso da terra usando a metodologia de análise de intensidade Pontius-Aldwaik**
---
## 📋 Sumário
- [🚀 Instalação Rápida](#-instalação-rápida)
- [🎯 Guia para Iniciantes](#-guia-para-iniciantes)
- [📊 Como Gerar Gráficos](#-como-gerar-gráficos)
- [🔬 Análise Avançada](#-análise-avançada)
- [📚 Referências](#-referências)
---
## 🚀 Instalação Rápida
```bash
pip install landuse-intensity-analysis
```
**Verificar instalação:**
```python
import landuse_intensity as lui
print("✅ Instalação bem-sucedida!")
```
---
## 🎯 Guia para Iniciantes
### Primeiro Passo: Analisar Mudanças no Uso da Terra
Vamos começar com um exemplo simples usando dados de demonstração:
```python
import landuse_intensity as lui
import numpy as np
# 1. Carregar dados de exemplo
print("📊 Carregando dados de exemplo...")
raster_t1, raster_t2 = lui.demo_landscape()
print(f"Raster 1 (Tempo 1): {raster_t1.shape}")
print(f"Raster 2 (Tempo 2): {raster_t2.shape}")
# 2. Criar tabela de contingência
print("\n🔄 Criando tabela de contingência...")
ct = lui.ContingencyTable.from_rasters(
raster_t1, raster_t2,
labels1=['Floresta', 'Agricultura', 'Urbano', 'Água'],
labels2=['Floresta', 'Agricultura', 'Urbano', 'Água']
)
print("Tabela de contingência criada:")
print(ct.table)
# 3. Análise básica
print(f"\n📈 Estatísticas básicas:")
print(f"Área total: {ct.total_area} pixels")
print(f"Área que mudou: {ct.total_change} pixels ({ct.total_change/ct.total_area*100:.1f}%)")
print(f"Área que permaneceu igual: {ct.persistence} pixels ({ct.persistence/ct.total_area*100:.1f}%)")
```
**Saída esperada:**
```text
📊 Carregando dados de exemplo...
Raster 1 (Tempo 1): (100, 100)
Raster 2 (Tempo 2): (100, 100)
🔄 Criando tabela de contingência...
Tabela de contingência criada:
Floresta Agricultura Urbano Água
Floresta 450 30 10 5
Agricultura 25 380 15 0
Urbano 5 20 360 0
Água 0 0 0 100
📈 Estatísticas básicas:
Área total: 10000 pixels
Área que mudou: 110 pixels (1.1%)
Área que permaneceu igual: 9890 pixels (98.9%)
```
---
## 📊 Como Gerar Gráficos
### 🎨 Módulos de Visualização Disponíveis
A biblioteca possui **5 módulos especializados** para diferentes tipos de gráficos:
| Módulo | Tipo de Gráfico | Uso Principal |
|--------|----------------|---------------|
| `sankey_visualization` | Diagramas Sankey | Transições entre classes |
| `matrix_visualization` | Matrizes e mapas de calor | Matrizes de transição |
| `bar_chart_visualization` | Gráficos de barras | Análise de áreas e mudanças |
| `statistical_visualization` | Gráficos estatísticos | Análise de desempenho |
| `visualization_utils` | Utilitários | Funções auxiliares |
### 📈 1. Diagrama Sankey (Transições)
**Para visualizar como as classes de uso da terra se transformam:**
```python
from landuse_intensity.sankey_visualization import plot_single_step_sankey
# Criar diagrama Sankey interativo
files = plot_single_step_sankey(
contingency_data=ct.table, # Dados da tabela de contingência
output_dir="outputs", # Pasta para salvar
filename="transicoes_sankey", # Nome do arquivo
title="Transições no Uso da Terra", # Título do gráfico
width=1000, # Largura em pixels
height=600, # Altura em pixels
min_flow=5, # Fluxo mínimo para mostrar
export_formats=['html', 'png'] # Formatos de exportação
)
print("✅ Arquivos gerados:")
for fmt, path in files.items():
print(f" {fmt.upper()}: {path}")
```
**Resultado:** Arquivo `outputs/transicoes_sankey.html` com diagrama interativo
### 🔥 2. Mapa de Calor da Matriz de Transição
**Para visualizar a intensidade das transições:**
```python
from landuse_intensity.matrix_visualization import plot_transition_matrix_heatmap
# Criar mapa de calor
fig = plot_transition_matrix_heatmap(
tabulation_matrix=ct.table, # Matriz de transição
filename="matriz_transicao", # Nome do arquivo
output_dir="outputs", # Pasta de saída
title="Matriz de Transição de Uso da Terra",
figsize=(10, 8), # Tamanho da figura
cmap="YlOrRd", # Paleta de cores
annot=True, # Mostrar valores
fmt=".1f", # Formato dos números
show_percentages=False # Mostrar em unidades absolutas
)
print("✅ Mapa de calor salvo em: outputs/matriz_transicao.png")
```
### 📊 3. Gráfico de Barras (Áreas por Classe)
**Para comparar áreas de cada classe de uso da terra:**
```python
import pandas as pd
from landuse_intensity.bar_chart_visualization import plot_barplot_lulc
# Preparar dados para o gráfico
area_data = []
for class_name in ct.table.index:
area = ct.table.loc[class_name].sum()
area_data.append({
'class': class_name,
'area': area,
'time_period': 'Tempo 1'
})
for class_name in ct.table.columns:
area = ct.table[class_name].sum()
area_data.append({
'class': class_name,
'area': area,
'time_period': 'Tempo 2'
})
df_areas = pd.DataFrame(area_data)
# Criar gráfico de barras
fig = plot_barplot_lulc(
data=df_areas,
filename="areas_classes",
output_dir="outputs",
title="Áreas por Classe de Uso da Terra",
x_col="class",
y_col="area",
time_col="time_period", # Para comparar períodos
figsize=(12, 6),
color_palette="Set2",
scientific_style=True,
show_values=True
)
print("✅ Gráfico de barras salvo em: outputs/areas_classes.png")
```
### 📈 4. Análise de Ganhos e Perdas
**Para visualizar quais classes ganharam ou perderam área:**
```python
from landuse_intensity.bar_chart_visualization import plot_gain_loss_analysis
# Preparar dados de ganho/perda
gain_loss_data = []
classes = list(set(ct.table.index) | set(ct.table.columns))
for class_name in classes:
# Calcular ganhos (entradas)
if class_name in ct.table.columns:
gain = ct.table[class_name].sum() - ct.table.loc[class_name, class_name] if class_name in ct.table.index else ct.table[class_name].sum()
else:
gain = 0
# Calcular perdas (saídas)
if class_name in ct.table.index:
loss = ct.table.loc[class_name].sum() - ct.table.loc[class_name, class_name] if class_name in ct.table.columns else ct.table.loc[class_name].sum()
else:
loss = 0
net_change = gain - loss
gain_loss_data.append({
'class': class_name,
'gain': gain,
'loss': loss,
'net_change': net_change
})
df_gain_loss = pd.DataFrame(gain_loss_data)
# Criar gráfico de ganho/perda
fig = plot_gain_loss_analysis(
gain_loss_data=df_gain_loss,
filename="ganho_perda",
output_dir="outputs",
title="Análise de Ganho e Perda por Classe",
figsize=(12, 8),
scientific_style=True
)
print("✅ Análise de ganho/perda salva em: outputs/ganho_perda.png")
```
### 🎯 5. Matriz de Confusão (para Validação)
**Para avaliar a precisão de classificação:**
```python
from landuse_intensity.matrix_visualization import plot_confusion_matrix
# Criar dados de exemplo para matriz de confusão
# (Em um caso real, isso viria de dados observados vs. previstos)
true_labels = ['Floresta', 'Floresta', 'Agricultura', 'Urbano', 'Floresta']
predicted_labels = ['Floresta', 'Agricultura', 'Agricultura', 'Urbano', 'Floresta']
# Criar DataFrame de confusão
confusion_data = pd.crosstab(
pd.Series(true_labels, name='Observado'),
pd.Series(predicted_labels, name='Previsto')
)
# Criar matriz de confusão
fig = plot_confusion_matrix(
confusion_matrix=confusion_data,
filename="matriz_confusao",
output_dir="outputs",
title="Matriz de Confusão - Validação da Classificação",
figsize=(8, 6),
normalize='true', # Normalizar por linha (observado)
scientific_style=True
)
print("✅ Matriz de confusão salva em: outputs/matriz_confusao.png")
```
---
## 🔬 Análise Avançada
### Análise de Intensidade Pontius-Aldwaik
```python
from landuse_intensity import IntensityAnalyzer
# Criar analisador de intensidade
analyzer = lui.IntensityAnalyzer(ct)
# Análise completa
results = analyzer.full_analysis()
print("📊 Análise de Intensidade - Nível de Intervalo:")
print(f"Taxa de mudança anual: {results.interval.annual_change_rate:.2f}%")
print(f"Intensidade de mudança: {results.interval.change_intensity:.2f}")
print("\n📊 Análise de Intensidade - Nível de Categoria:")
for category_result in results.category:
print(f"{category_result.category_name}:")
print(f" Ganho relativo: {category_result.relative_gain:.2f}")
print(f" Perda relativa: {category_result.relative_loss:.2f}")
```
### Análise Multi-Temporal
```python
from landuse_intensity import MultiStepAnalyzer
# Análise com múltiplos períodos
rasters = [raster_t1, raster_t2] # Adicione mais rasters conforme necessário
time_labels = ['2000', '2020']
multi_analyzer = lui.MultiStepAnalyzer(rasters, time_labels)
multi_results = multi_analyzer.analyze_all_steps()
print("📈 Análise Multi-Temporal:")
for step_name, step_result in multi_results.items():
print(f"{step_name}: {step_result.interval.annual_change_rate:.2f}% mudança anual")
```
### Trabalhando com Arquivos Raster Reais
```python
# Carregar arquivos GeoTIFF
raster_2000, metadata_2000 = lui.read_raster("caminho/para/landuse_2000.tif")
raster_2020, metadata_2020 = lui.read_raster("caminho/para/landuse_2020.tif")
# Verificar se os rasters são compatíveis
print(f"Projeção compatível: {metadata_2000['crs'] == metadata_2020['crs']}")
print(f"Resolução: {metadata_2000['transform'][0]}m x {metadata_2000['transform'][4]}m")
# Criar tabela de contingência
ct_real = lui.ContingencyTable.from_rasters(
raster_2000, raster_2020,
labels1=['Floresta', 'Agricultura', 'Urbano', 'Água', 'Pastagem'],
labels2=['Floresta', 'Agricultura', 'Urbano', 'Água', 'Pastagem']
)
# Análise completa
analyzer_real = lui.IntensityAnalyzer(ct_real)
results_real = analyzer_real.full_analysis()
# Salvar resultados
ct_real.table.to_csv("resultados/contingencia_real.csv")
results_real.to_json("resultados/analise_intensidade.json")
```
---
## 🎨 Galeria de Visualizações
### Tipos de Gráficos Disponíveis
| Tipo | Módulo | Descrição | Melhor Uso |
|------|--------|-----------|------------|
| **Sankey** | `sankey_visualization` | Fluxos interativos entre classes | Mostrar transições detalhadas |
| **Mapa de Calor** | `matrix_visualization` | Intensidade de transições | Comparar magnitudes |
| **Barras** | `bar_chart_visualization` | Comparação de áreas | Análise temporal |
| **Ganho/Perda** | `bar_chart_visualization` | Mudanças positivas/negativas | Identificar tendências |
| **ROC Curve** | `statistical_visualization` | Performance de classificação | Avaliação de modelos |
| **Precisão-Revocação** | `statistical_visualization` | Métricas de classificação | Análise de trade-offs |
### Parâmetros Comuns
Todos os gráficos suportam:
```python
# Parâmetros universais
filename="meu_grafico" # Nome do arquivo (sem extensão)
output_dir="outputs" # Pasta de saída
title="Título do Gráfico" # Título
figsize=(10, 6) # Tamanho da figura
scientific_style=True # Estilo científico (fonte serifada, grid)
```
### Exportação Multi-Formato
```python
# Para Sankey (suporta múltiplos formatos)
files = plot_single_step_sankey(
contingency_data=ct.table,
export_formats=['html', 'png', 'svg', 'pdf'] # Escolha os formatos
)
# Para outros gráficos (PNG e PDF automático)
plot_transition_matrix_heatmap(
tabulation_matrix=ct.table,
filename="matriz" # Gera .png e .pdf automaticamente
)
```
---
## 📚 Exemplos Práticos Completos
### 🌟 Exemplo 1: Análise Completa de Pequena Área
```python
import landuse_intensity as lui
import pandas as pd
from pathlib import Path
# Criar diretório de saída
output_dir = Path("analise_completa")
output_dir.mkdir(exist_ok=True)
# 1. Carregar dados
raster_t1, raster_t2 = lui.demo_landscape()
# 2. Análise básica
ct = lui.ContingencyTable.from_rasters(raster_t1, raster_t2)
analyzer = lui.IntensityAnalyzer(ct)
results = analyzer.full_analysis()
# 3. Gerar todos os gráficos
from landuse_intensity.sankey_visualization import plot_single_step_sankey
from landuse_intensity.matrix_visualization import plot_transition_matrix_heatmap
from landuse_intensity.bar_chart_visualization import plot_barplot_lulc
# Sankey
plot_single_step_sankey(
ct.table,
output_dir=str(output_dir),
filename="sankey_completo",
title="Análise Completa de Transições"
)
# Matriz de calor
plot_transition_matrix_heatmap(
ct.table,
filename="matriz_completo",
output_dir=str(output_dir),
title="Matriz de Transição Completa"
)
# Gráfico de áreas
area_data = []
for class_name in ct.table.index:
area_data.append({'class': class_name, 'area': ct.table.loc[class_name].sum(), 'period': 'Tempo 1'})
for class_name in ct.table.columns:
area_data.append({'class': class_name, 'area': ct.table[class_name].sum(), 'period': 'Tempo 2'})
df_areas = pd.DataFrame(area_data)
plot_barplot_lulc(
df_areas,
filename="areas_completo",
output_dir=str(output_dir),
title="Comparação de Áreas por Período"
)
print(f"✅ Análise completa salva em: {output_dir}")
print(f"📊 {len(list(output_dir.glob('*.png')))} gráficos PNG gerados")
print(f"🌐 {len(list(output_dir.glob('*.html')))} gráficos HTML gerados")
```
### 🌍 Exemplo 2: Estudo de Caso Real - Cerrado
```python
import landuse_intensity as lui
import numpy as np
# Simular dados do Cerrado brasileiro
print("🌍 Análise do Bioma Cerrado")
# Dados simulados (substitua por dados reais)
classes_cerrado = ['Cerrado', 'Cerradão', 'Campo', 'Agricultura', 'Pastagem', 'Silvicultura']
# Criar rasters simulados
np.random.seed(42)
raster_2000 = np.random.choice([0,1,2,3,4,5], size=(500, 500), p=[0.4, 0.2, 0.2, 0.1, 0.05, 0.05])
raster_2020 = np.random.choice([0,1,2,3,4,5], size=(500, 500), p=[0.3, 0.15, 0.15, 0.2, 0.15, 0.05])
# Análise
ct_cerrado = lui.ContingencyTable.from_rasters(
raster_2000, raster_2020,
labels1=classes_cerrado,
labels2=classes_cerrado
)
analyzer_cerrado = lui.IntensityAnalyzer(ct_cerrado)
results_cerrado = analyzer_cerrado.full_analysis()
# Relatório
print("
📊 RELATÓRIO - MUDANÇAS NO CERRADO (2000-2020)" print("=" * 50)
print(f"Área total analisada: {ct_cerrado.total_area:,} hectares")
print(f"Área que mudou: {ct_cerrado.total_change:,} hectares ({ct_cerrado.total_change/ct_cerrado.total_area*100:.1f}%)")
print(f"Taxa de mudança anual: {results_cerrado.interval.annual_change_rate:.2f}%")
print("
🔄 Principais Transições:" transitions = ct_cerrado.table.stack()
top_transitions = transitions[transitions > 0].sort_values(ascending=False).head(5)
for (from_class, to_class), area in top_transitions.items():
if from_class != to_class:
print(f" {from_class} → {to_class}: {area:,} hectares")
# Gerar visualizações
from landuse_intensity.sankey_visualization import plot_single_step_sankey
plot_single_step_sankey(
ct_cerrado.table,
output_dir="cerrado_results",
filename="cerrado_transitions",
title="Transições no Bioma Cerrado (2000-2020)",
export_formats=['html', 'png', 'pdf']
)
print("
✅ Relatório e visualizações salvos em: cerrado_results/" print("🌐 Arquivo interativo: cerrado_results/cerrado_transitions.html")
```
---
## 🔧 Solução de Problemas
### Erro: "Módulo não encontrado"
```python
# Verificar instalação
import landuse_intensity as lui
print("Versão:", lui.__version__)
# Se não funcionar, reinstalar
pip uninstall landuse-intensity-analysis
pip install landuse-intensity-analysis
```
### Erro: "Dados inválidos"
```python
# Validar dados antes da análise
from landuse_intensity.utils import validate_raster_data
is_valid, message = validate_raster_data(raster_t1, raster_t2)
if not is_valid:
print(f"Erro nos dados: {message}")
```
### Performance com Grandes Rasters
```python
# Para rasters muito grandes, processe em blocos
from landuse_intensity.utils import process_raster_in_chunks
results = process_raster_in_chunks(
raster_t1, raster_t2,
chunk_size=(1000, 1000),
overlap=50
)
```
---
## 📚 Referências
### Metodologia
- **Aldwaik, S. Z., & Pontius Jr, R. G. (2012).** Intensity analysis to unify measurements of size and stationarity of land changes by interval, category, and transition. *Landscape and Urban Planning*, 106(1), 103-114.
- **Pontius Jr, R. G., & Millones, M. (2011).** Death to Kappa: birth of quantity disagreement and allocation disagreement for accuracy assessment. *International Journal of Remote Sensing*, 32(15), 4407-4429.
### Implementação
- **Documentação Oficial**: [Read the Docs](https://landuse-intensity-analysis.readthedocs.io/)
- **Repositório GitHub**: [Código Fonte](https://github.com/ils15/LandUse-Intensity-Analysis)
- **Exemplos**: Pasta `examples/` no repositório
---
## 🤝 Contribuição
Contribuições são bem-vindas!
1. Fork o projeto
2. Crie uma branch para sua feature (`git checkout -b feature/nova-feature`)
3. Commit suas mudanças (`git commit -am 'Adiciona nova feature'`)
4. Push para a branch (`git push origin feature/nova-feature`)
5. Abra um Pull Request
---
## 📄 Licença
Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.
---
## 🆘 Suporte
**Precisa de ajuda?**
1. 📖 **Documentação**: Leia os exemplos na pasta `examples/`
2. 🐛 **Issues**: [GitHub Issues](https://github.com/ils15/LandUse-Intensity-Analysis/issues)
3. 💬 **Discussões**: [GitHub Discussions](https://github.com/ils15/LandUse-Intensity-Analysis/discussions)
4. 📧 **Email**: Para questões específicas
---
> Desenvolvido com ❤️ para a comunidade de ciências ambientais e geotecnologia
**Versão Atual**: 2.0.3 | **Python**: 3.8+ | **Mantenedor**: [ils15](https://github.com/ils15)
## 🌟 What does it do?
Transform your land cover raster data into meaningful insights about environmental change:
1. **Quantify Changes**: Calculate transition matrices and area statistics from multi-temporal raster data
2. **Intensity Analysis**: Apply the proven Pontius-Aldwaik methodology for interval, category, and transition-level analysis
3. **Rich Visualizations**: Create publication-ready Sankey diagrams, heatmaps, spatial maps, and statistical plots
4. **Spatial Analysis**: Process GeoTIFF files with built-in raster handling and spatial change detection
## ✨ Key Features
- 🔬 **Scientific Rigor**: Implements the established Pontius-Aldwaik intensity analysis methodology
- 📊 **Rich Visualizations**: Sankey diagrams, transition matrices, spatial maps, and statistical plots using matplotlib and plotly
- 🗺️ **Spatial Support**: Direct processing of GeoTIFF files and numpy arrays
- 🎯 **Object-Oriented Design**: Clean API with `ContingencyTable`, `IntensityAnalyzer`, and `MultiStepAnalyzer` classes
- 📈 **Multi-temporal Analysis**: Support for analyzing changes across multiple time periods
- 🔧 **Comprehensive Toolkit**: Complete suite of utility functions for data processing and validation
## 🚀 Installation
```bash
pip install landuse-intensity-analysis
```
## 📖 Quick Start
### Basic Analysis Example
```python
import numpy as np
import landuse_intensity as lui
# Step 1: Create contingency table from rasters
# Example with 2 time periods and 3 land use classes
raster_t1 = np.array([[1, 1, 2], [1, 2, 3], [2, 3, 3]]) # Time 1
raster_t2 = np.array([[1, 2, 2], [2, 2, 3], [3, 3, 3]]) # Time 2
# Create contingency table
ct = lui.ContingencyTable.from_rasters(
raster_t1, raster_t2,
labels1=['Forest', 'Agriculture', 'Urban', 'Water'],
labels2=['Forest', 'Agriculture', 'Urban', 'Water']
)
# Step 2: Run intensity analysis
analyzer = lui.IntensityAnalyzer(ct)
results = analyzer.full_analysis()
# Step 3: Display results
print("Contingency Table:")
print(ct.table)
print(f"\nTotal Change: {ct.total_change} pixels")
print(f"Persistence: {ct.persistence} pixels")
# Step 4: Create visualizations
from landuse_intensity import visualization as viz
# Sankey diagram
viz.plot_single_step_sankey(
ct.table,
title="Land Use Transitions",
save_path="sankey_diagram.html"
)
# Transition matrix heatmap
viz.plot_transition_matrix_heatmap(
ct.table,
title="Land Use Transition Matrix",
save_path="transition_matrix.png"
)
```
### Working with Real Raster Files
```python
import landuse_intensity as lui
# Load raster data
raster1, metadata1 = lui.read_raster("land_cover_2000.tif")
raster2, metadata2 = lui.read_raster("land_cover_2020.tif")
# Create contingency table
contingency_df = lui.raster_to_contingency_table(
raster1, raster2,
class_names=['Forest', 'Agriculture', 'Urban', 'Water']
)
# Initialize analysis
ct = lui.ContingencyTable(contingency_df)
analyzer = lui.IntensityAnalyzer(ct)
# Perform complete analysis
results = analyzer.analyze()
print("Interval Level Analysis:", results['interval'])
print("Category Level Analysis:", results['category'])
```
### Multi-Temporal Analysis
```python
import landuse_intensity as lui
# Load multiple time periods
rasters = [
lui.read_raster("land_cover_1990.tif")[0],
lui.read_raster("land_cover_2000.tif")[0],
lui.read_raster("land_cover_2010.tif")[0],
lui.read_raster("land_cover_2020.tif")[0]
]
time_labels = ['1990', '2000', '2010', '2020']
# Multi-step analysis
multi_analyzer = lui.MultiStepAnalyzer(rasters, time_labels)
multi_results = multi_analyzer.analyze_all_steps()
print("Multi-step Analysis Results:")
for step, result in multi_results.items():
print(f"{step}: {result['interval']['annual_change_rate']:.2f}% annual change")
```
## � Complete API Reference
### Core Classes
#### ContingencyTable
Main class for handling transition matrices:
```python
# Create from rasters
ct = lui.ContingencyTable.from_rasters(raster1, raster2, labels1, labels2)
# Create from existing data
ct = lui.ContingencyTable(dataframe_or_array)
# Properties
ct.table # Access transition matrix
ct.total_area # Total number of pixels/area
ct.persistence # Unchanged pixels
ct.total_change # Changed pixels
ct.validate() # Validate table structure
```
#### IntensityAnalyzer
Implements Pontius-Aldwaik intensity analysis:
```python
analyzer = lui.IntensityAnalyzer(contingency_table)
# Analysis methods
analyzer.analyze_interval_level() # Overall change intensity
analyzer.analyze_category_level() # Class-specific gains/losses
analyzer.analyze_transition_level(from_class, to_class) # Transition intensity
analyzer.analyze() # Complete analysis
analyzer.full_analysis() # Returns AnalysisResults object
```
#### MultiStepAnalyzer
For multi-temporal analysis:
```python
analyzer = lui.MultiStepAnalyzer(raster_list, time_labels)
analyzer.analyze_all_steps() # Step-by-step analysis
analyzer.analyze_overall_change() # Overall change summary
analyzer.compare_step_vs_overall() # Compare step vs overall rates
```
#### ChangeAnalyzer
For spatial change detection:
```python
change_analyzer = lui.ChangeAnalyzer(raster1, raster2)
change_analyzer.analyze() # Basic change detection
change_analyzer.detect_hotspots() # Change hotspot detection
change_analyzer.create_change_map() # Spatial change mapping
```
### Visualization Functions
#### Graph Visualizations
From `landuse_intensity.graph_visualization`:
```python
from landuse_intensity import graph_visualization as gv
# Sankey diagrams
gv.plot_single_step_sankey(
contingency_table,
title="Land Use Transitions",
save_path="sankey.html"
)
# Transition matrix heatmaps
gv.plot_transition_matrix_heatmap(
contingency_table,
title="Transition Matrix",
save_path="heatmap.png"
)
# Bar plots for LULC analysis
gv.plot_barplot_lulc(
lulc_data,
title="Land Use Areas",
save_path="barplot.png"
)
# Gain/Loss analysis
gv.plot_gain_loss_analysis(
contingency_table,
title="Gain/Loss Analysis"
)
# Accuracy assessment
gv.plot_accuracy_assessment(
observed, predicted,
save_path="accuracy.png"
)
# Confusion matrix
gv.plot_confusion_matrix(
true_labels, predicted_labels
)
```
#### Spatial Visualizations
From `landuse_intensity.map_visualization`:
```python
from landuse_intensity import map_visualization as mv
# Spatial change maps
mv.plot_spatial_change_map(
raster_t1, raster_t2,
title="Land Use Change Map",
save_path="change_map.png"
)
# Multi-temporal maps
mv.plot_multi_temporal_maps(
raster_list, time_labels,
title="Land Use Over Time"
)
# Change detection
mv.plot_change_detection_map(
raster_t1, raster_t2,
title="Change Detection"
)
# Interactive maps
mv.plot_interactive_map(
raster_data, coordinates,
save_path="interactive_map.html"
)
# Elevation models
mv.plot_elevation_model(
elevation_raster,
title="Digital Elevation Model"
)
```
#### Advanced Visualizations
From `landuse_intensity.visualization`:
```python
from landuse_intensity import visualization as viz
# Intensity analysis plots
viz.plot_intensity_analysis(
intensity_results,
title="Pontius Intensity Analysis"
)
# Multi-step Sankey
viz.plot_multi_step_sankey(
transitions_list,
time_labels=time_labels
)
# Spatial change with persistence
viz.plot_persistence_map(
raster_t1, raster_t2,
title="Persistence Analysis"
)
# Temporal land change
viz.plot_temporal_land_change(
raster_list, time_labels,
save_path="temporal_change.png"
)
# Change frequency mapping
viz.plot_change_frequency_map(
raster_list,
title="Change Frequency Analysis"
)
```
### Utility Functions
#### Data Processing
```python
import landuse_intensity as lui
# Demo data generation
raster_t1, raster_t2 = lui.demo_landscape()
# Data validation
is_valid = lui.validate_data(raster_data)
# Area calculations
area_matrix = lui.calculate_area_matrix(contingency_table, pixel_area=900)
# Change summary
summary = lui.get_change_summary(contingency_table)
# Area formatting
label = lui.format_area_label(1500.5, units="hectares")
# Transition naming
names = lui.create_transition_names(
from_classes=['Forest', 'Agriculture'],
to_classes=['Urban', 'Water']
)
```
#### Image Processing
```python
import landuse_intensity as lui
# Create contingency table from rasters
ct = lui.create_contingency_table(raster1, raster2, labels=['Forest', 'Urban'])
# Calculate change map
change_map = lui.calculate_change_map(raster_t1, raster_t2)
# Apply majority filter
filtered = lui.apply_majority_filter(raster, window_size=3)
# Calculate patch metrics
metrics = lui.calculate_patch_metrics(raster, class_value=1)
# Resample raster
resampled = lui.resample_raster(raster, target_shape=(100, 100))
# Align rasters
aligned1, aligned2 = lui.align_rasters(raster1, raster2)
# Validate raster
is_valid = lui.validate_raster(raster)
# Mask raster
masked = lui.mask_raster(raster, mask, nodata_value=-9999)
```
#### Raster Handling
```python
import landuse_intensity as lui
# Read raster file
raster_data, metadata = lui.read_raster("landcover.tif")
# Write raster file
lui.write_raster(
raster_data, "output.tif",
metadata=metadata,
nodata_value=-9999
)
# Convert rasters to contingency table
contingency_df = lui.raster_to_contingency_table(
raster1, raster2,
class_names=['Forest', 'Agriculture', 'Urban']
)
# Load demo data
demo_raster1, demo_raster2 = lui.load_demo_data()
# Raster summary statistics
summary = lui.raster_summary(raster)
# Reclassify raster
reclassified = lui.reclassify_raster(
raster,
reclass_dict={1: 10, 2: 20, 3: 30}
)
```
## 📊 Analysis Functions
### Main Analysis Function
```python
# One-step comprehensive analysis
results = lui.analyze_land_use_change(
raster1=raster_t1,
raster2=raster_t2,
area_calculation=True,
intensity_analysis=True,
save_tables=True,
output_dir="./results/"
)
```
## 🎯 Complete Example: Real Dataset Analysis
```python
import landuse_intensity as lui
import numpy as np
# 1. Load real raster data
raster_2000, meta_2000 = lui.read_raster("cerrado_2000.tif")
raster_2010, meta_2010 = lui.read_raster("cerrado_2010.tif")
raster_2020, meta_2020 = lui.read_raster("cerrado_2020.tif")
# 2. Create contingency tables
ct_2000_2010 = lui.ContingencyTable.from_rasters(
raster_2000, raster_2010,
labels1=['Forest', 'Savanna', 'Agriculture', 'Pasture', 'Urban'],
labels2=['Forest', 'Savanna', 'Agriculture', 'Pasture', 'Urban']
)
ct_2010_2020 = lui.ContingencyTable.from_rasters(
raster_2010, raster_2020,
labels1=['Forest', 'Savanna', 'Agriculture', 'Pasture', 'Urban'],
labels2=['Forest', 'Savanna', 'Agriculture', 'Pasture', 'Urban']
)
# 3. Intensity analysis
analyzer_2000_2010 = lui.IntensityAnalyzer(ct_2000_2010)
analyzer_2010_2020 = lui.IntensityAnalyzer(ct_2010_2020)
results_2000_2010 = analyzer_2000_2010.analyze()
results_2010_2020 = analyzer_2010_2020.analyze()
# 4. Multi-temporal analysis
multi_analyzer = lui.MultiStepAnalyzer(
[raster_2000, raster_2010, raster_2020],
['2000', '2010', '2020']
)
multi_results = multi_analyzer.analyze_all_steps()
# 5. Create visualizations
from landuse_intensity import graph_visualization as gv
from landuse_intensity import map_visualization as mv
# Sankey diagrams for each period
gv.plot_single_step_sankey(
ct_2000_2010.table,
title="Cerrado Land Use Transitions 2000-2010",
save_path="sankey_2000_2010.html"
)
gv.plot_single_step_sankey(
ct_2010_2020.table,
title="Cerrado Land Use Transitions 2010-2020",
save_path="sankey_2010_2020.html"
)
# Spatial change maps
mv.plot_spatial_change_map(
raster_2000, raster_2020,
title="Cerrado Land Use Change 2000-2020",
save_path="cerrado_change_map.png"
)
# Multi-temporal maps
mv.plot_multi_temporal_maps(
[raster_2000, raster_2010, raster_2020],
['2000', '2010', '2020'],
title="Cerrado Land Use Evolution"
)
# 6. Export results
print("=== ANALYSIS RESULTS ===")
print(f"Period 2000-2010:")
print(f" Annual change rate: {results_2000_2010['interval']['annual_change_rate']:.2f}%")
print(f" Total change: {ct_2000_2010.total_change} pixels")
print(f"Period 2010-2020:")
print(f" Annual change rate: {results_2010_2020['interval']['annual_change_rate']:.2f}%")
print(f" Total change: {ct_2010_2020.total_change} pixels")
# Export contingency tables
ct_2000_2010.table.to_csv("contingency_2000_2010.csv")
ct_2010_2020.table.to_csv("contingency_2010_2020.csv")
```
## 📚 References
This library implements the Pontius-Aldwaik intensity analysis methodology:
- Aldwaik, S. Z., & Pontius Jr, R. G. (2012). Intensity analysis to unify measurements of size and stationarity of land changes by interval, category, and transition. *Landscape and Urban Planning*, 106(1), 103-114.
- Pontius Jr, R. G., & Millones, M. (2011). Death to Kappa: birth of quantity disagreement and allocation disagreement for accuracy assessment. *International Journal of Remote Sensing*, 32(15), 4407-4429.
## 📄 License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## 🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
## 📮 Support
If you encounter any issues or have questions:
1. Check the examples in the `examples/` directory
2. Read the documentation
3. Open an issue on GitHub
## 🎯 Version Information
- **Current Version**: 2.0.3
- **Python Requirements**: Python 3.8+
- **Key Dependencies**: numpy, pandas, matplotlib, plotly, rasterio
---
> Made with ❤️ for the geospatial and environmental science community
- **Smart Detection**: No need to manually specify analysis type
- **Methodology Compatible**: Follows established methodology
- **Flexible**: Override auto-detection when needed
- **Unified Interface**: Single function for all analysis types
### Raster Stacking and Year Detection
#### Raster Stacking Options
**1. Automatic Directory Loading:**
```python
from landuse_intensity.raster import load_rasters
# Load all .tif files from directory
rasters = load_rasters("data/landuse/")
# Automatically finds and stacks: landuse_1990.tif, landuse_2000.tif, landuse_2010.tif
```
**2. Manual File Selection:**
```python
# Load specific files in custom order
files = ["landuse_1990.tif", "landuse_2005.tif", "landuse_2010.tif"]
rasters = load_rasters(files)
```
## Scientific Background
This library implements the Pontius-Aldwaik intensity analysis methodology, which provides a comprehensive framework for understanding land use change patterns. The methodology distinguishes between:
- **Quantity of change**: How much land changed category
- **Exchange**: Land that would have changed even if proportions remained constant
- **Shift**: Land that changed due to systematic transitions
## API Reference
### Main Classes
#### `ContingencyTable`
Main class for creating and managing transition matrices.
**Methods:**
- `from_rasters()`: Create contingency table from raster data
- `validate()`: Validate table data integrity
- `get_summary_stats()`: Get statistical summary
- `get_transition_matrix()`: Get transition matrix representation
#### `IntensityAnalyzer`
Class for performing Pontius-Aldwaik intensity analysis.
**Methods:**
- `analyze()`: Perform intensity analysis on contingency table
- `full_analysis()`: Complete analysis with all metrics
- `get_category_analysis()`: Category-level intensity analysis
- `get_transition_analysis()`: Transition-level intensity analysis
### Data Format
The library expects land use data in numpy arrays or pandas DataFrames:
```python
# Raster data (numpy arrays)
raster_1990 = np.array([[1, 1, 2], [1, 2, 3], [2, 3, 3]])
raster_2000 = np.array([[1, 2, 2], [2, 2, 3], [3, 3, 3]])
# Or pandas DataFrame
contingency_df = pd.DataFrame({
'Forest->Forest': [100, 0, 0],
'Forest->Agriculture': [20, 0, 0],
'Agriculture->Agriculture': [0, 80, 0]
})
```
## Visualization Gallery
The library provides several types of visualizations:
- **Intensity Maps**: Spatial distribution of land use intensity
- **Transition Matrices**: Category transition probabilities
- **Time Series Plots**: Temporal evolution of land use patterns
- **Chord Diagrams**: Flow visualization between categories
- **Sankey Diagrams**: Flow-based transition visualization
## Advanced Usage
### Working with Large Datasets
```python
# For large raster datasets, consider memory usage
import numpy as np
from landuse_intensity import ContingencyTable
# Process in chunks for very large rasters
def process_large_raster(raster1, raster2, chunk_size=1000):
height, width = raster1.shape
results = []
for i in range(0, height, chunk_size):
for j in range(0, width, chunk_size):
chunk1 = raster1[i:i+chunk_size, j:j+chunk_size]
chunk2 = raster2[i:i+chunk_size, j:j+chunk_size]
ct = ContingencyTable.from_rasters(chunk1, chunk2)
results.append(ct)
return results
```
### Custom Analysis Parameters
```python
# Customize analysis with specific parameters
from landuse_intensity import IntensityAnalyzer
# Create analyzer with custom settings
analyzer = IntensityAnalyzer()
# Perform analysis with specific options
results = analyzer.analyze(
contingency_table=ct,
include_interval=True,
include_category=True,
include_transition=True
)
```
### Spatial Analysis
```python
# Load geospatial data
import rasterio
import xarray as xr
with rasterio.open('land_use_1990.tif') as src:
data_1990 = src.read(1)
with rasterio.open('land_use_2000.tif') as src:
data_2000 = src.read(1)
# Perform spatial intensity analysis
spatial_results = analyzer.spatial_intensity_analysis(
data_1990, data_2000,
transform=src.transform
)
```
## 📚 Complete Documentation
## Usage
### 🔧 Key Features
- **Raster Loading**: Multiple methods (automatic, manual, dataset)
- **Year Detection**: Automatic year extraction from filenames
- **Contingency Tables**: Transition matrix generation
- **Intensity Analysis**: Pontius-Aldwaik methodology
- **Visualizations**: Modern interactive plots
- **Change Maps**: Spatial analysis and mapping
- **Export Options**: CSV, JSON, HTML formats
### 📋 Complete Analysis Workflow
```python
# 1. Load raster data
from landuse_intensity import read_raster
raster1, meta1 = read_raster("landuse_1990.tif")
raster2, meta2 = read_raster("landuse_2000.tif")
# 2. Generate contingency table
from landuse_intensity import ContingencyTable
ct = ContingencyTable.from_rasters(raster1, raster2)
# 3. Perform intensity analysis
from landuse_intensity import IntensityAnalyzer
analyzer = IntensityAnalyzer(ct)
results = analyzer.full_analysis()
# 4. Create visualizations
from landuse_intensity import visualization as viz
viz.plot_single_step_sankey(ct.table, title="Land Use Transitions")
viz.plot_transition_matrix_heatmap(ct.table, title="Transition Matrix")
# 5. Generate change maps
from landuse_intensity import image_processing
change_map = image_processing.calculate_change_map(raster1, raster2)
# 6. Export results
ct.table.to_csv("contingency_table.csv")
```
## Examples
The library includes comprehensive examples demonstrating various land use analysis capabilities:
```python
# Basic intensity analysis example
import numpy as np
import landuse_intensity as lui
# Generate demo data
raster_t1, raster_t2 = lui.demo_landscape()
# Create contingency table
ct = lui.ContingencyTable.from_rasters(raster_t1, raster_t2)
# Perform intensity analysis
analyzer = lui.IntensityAnalyzer(ct)
results = analyzer.full_analysis()
# Create visualizations
import landuse_intensity.visualization as viz
viz.plot_single_step_sankey(ct.table, title="Land Use Transitions")
viz.plot_transition_matrix_heatmap(ct.table, title="Transition Matrix")
print(f"Analysis completed! Total change: {ct.total_change} pixels")
```
## Contributing
We welcome contributions! Please see our GitHub repository for details on contributing to the project.
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## Citation
If you use this library in your research, please cite:
```bibtex
@software{landuse_intensity_analysis,
title = {Land Use Intensity Analysis},
author = {LandUse Intensity Analysis Contributors},
url = {https://github.com/your-repo/landuse-intensity-analysis},
version = {1.0.3a1},
date = {2024}
}
```
## Support
- **Documentation**: [Read the Docs](https://landuse-intensity-analysis.readthedocs.io/)
- **Issues**: [GitHub Issues](https://github.com/your-repo/landuse-intensity-analysis/issues)
- **Discussions**: [GitHub Discussions](https://github.com/your-repo/landuse-intensity-analysis/discussions)
## Related Projects
- [Pontius Research Group](https://www.clarku.edu/departments/geography/pontius/): Original methodology developers
- [GDAL](https://gdal.org/): Geospatial data processing
- [Rasterio](https://rasterio.readthedocs.io/): Python geospatial raster processing
- [Xarray](https://xarray.pydata.org/): N-dimensional arrays for Python
<!-- Test commit for workflow validation -->
Raw data
{
"_id": null,
"home_page": null,
"name": "landuse-intensity-analysis",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "LandUse Intensity Analysis Contributors <contact@landuse-intensity.org>",
"keywords": "land-use, intensity-analysis, pontius, aldwaik, remote-sensing, gis, land-change, spatial-analysis, environmental-science",
"author": null,
"author_email": "LandUse Intensity Analysis Contributors <contact@landuse-intensity.org>",
"download_url": null,
"platform": null,
"description": "# \ud83c\udf0d Land Use Intensity Analysis\r\n\r\n[](https://pypi.org/project/landuse-intensity-analysis/)\r\n[](https://www.python.org/downloads/)\r\n[](https://opensource.org/licenses/MIT)\r\n\r\n> **Biblioteca Python completa para an\u00e1lise cient\u00edfica de mudan\u00e7as no uso da terra usando a metodologia de an\u00e1lise de intensidade Pontius-Aldwaik**\r\n\r\n---\r\n\r\n## \ud83d\udccb Sum\u00e1rio\r\n\r\n- [\ud83d\ude80 Instala\u00e7\u00e3o R\u00e1pida](#-instala\u00e7\u00e3o-r\u00e1pida)\r\n- [\ud83c\udfaf Guia para Iniciantes](#-guia-para-iniciantes)\r\n- [\ud83d\udcca Como Gerar Gr\u00e1ficos](#-como-gerar-gr\u00e1ficos)\r\n- [\ud83d\udd2c An\u00e1lise Avan\u00e7ada](#-an\u00e1lise-avan\u00e7ada)\r\n- [\ud83d\udcda Refer\u00eancias](#-refer\u00eancias)\r\n\r\n---\r\n\r\n## \ud83d\ude80 Instala\u00e7\u00e3o R\u00e1pida\r\n\r\n```bash\r\npip install landuse-intensity-analysis\r\n```\r\n\r\n**Verificar instala\u00e7\u00e3o:**\r\n\r\n```python\r\nimport landuse_intensity as lui\r\nprint(\"\u2705 Instala\u00e7\u00e3o bem-sucedida!\")\r\n```\r\n\r\n---\r\n\r\n## \ud83c\udfaf Guia para Iniciantes\r\n\r\n### Primeiro Passo: Analisar Mudan\u00e7as no Uso da Terra\r\n\r\nVamos come\u00e7ar com um exemplo simples usando dados de demonstra\u00e7\u00e3o:\r\n\r\n```python\r\nimport landuse_intensity as lui\r\nimport numpy as np\r\n\r\n# 1. Carregar dados de exemplo\r\nprint(\"\ud83d\udcca Carregando dados de exemplo...\")\r\nraster_t1, raster_t2 = lui.demo_landscape()\r\n\r\nprint(f\"Raster 1 (Tempo 1): {raster_t1.shape}\")\r\nprint(f\"Raster 2 (Tempo 2): {raster_t2.shape}\")\r\n\r\n# 2. Criar tabela de conting\u00eancia\r\nprint(\"\\n\ud83d\udd04 Criando tabela de conting\u00eancia...\")\r\nct = lui.ContingencyTable.from_rasters(\r\n raster_t1, raster_t2,\r\n labels1=['Floresta', 'Agricultura', 'Urbano', '\u00c1gua'],\r\n labels2=['Floresta', 'Agricultura', 'Urbano', '\u00c1gua']\r\n)\r\n\r\nprint(\"Tabela de conting\u00eancia criada:\")\r\nprint(ct.table)\r\n\r\n# 3. An\u00e1lise b\u00e1sica\r\nprint(f\"\\n\ud83d\udcc8 Estat\u00edsticas b\u00e1sicas:\")\r\nprint(f\"\u00c1rea total: {ct.total_area} pixels\")\r\nprint(f\"\u00c1rea que mudou: {ct.total_change} pixels ({ct.total_change/ct.total_area*100:.1f}%)\")\r\nprint(f\"\u00c1rea que permaneceu igual: {ct.persistence} pixels ({ct.persistence/ct.total_area*100:.1f}%)\")\r\n```\r\n\r\n**Sa\u00edda esperada:**\r\n\r\n```text\r\n\ud83d\udcca Carregando dados de exemplo...\r\nRaster 1 (Tempo 1): (100, 100)\r\nRaster 2 (Tempo 2): (100, 100)\r\n\r\n\ud83d\udd04 Criando tabela de conting\u00eancia...\r\nTabela de conting\u00eancia criada:\r\n Floresta Agricultura Urbano \u00c1gua\r\nFloresta 450 30 10 5\r\nAgricultura 25 380 15 0\r\nUrbano 5 20 360 0\r\n\u00c1gua 0 0 0 100\r\n\r\n\ud83d\udcc8 Estat\u00edsticas b\u00e1sicas:\r\n\u00c1rea total: 10000 pixels\r\n\u00c1rea que mudou: 110 pixels (1.1%)\r\n\u00c1rea que permaneceu igual: 9890 pixels (98.9%)\r\n```\r\n\r\n---\r\n\r\n## \ud83d\udcca Como Gerar Gr\u00e1ficos\r\n\r\n### \ud83c\udfa8 M\u00f3dulos de Visualiza\u00e7\u00e3o Dispon\u00edveis\r\n\r\nA biblioteca possui **5 m\u00f3dulos especializados** para diferentes tipos de gr\u00e1ficos:\r\n\r\n| M\u00f3dulo | Tipo de Gr\u00e1fico | Uso Principal |\r\n|--------|----------------|---------------|\r\n| `sankey_visualization` | Diagramas Sankey | Transi\u00e7\u00f5es entre classes |\r\n| `matrix_visualization` | Matrizes e mapas de calor | Matrizes de transi\u00e7\u00e3o |\r\n| `bar_chart_visualization` | Gr\u00e1ficos de barras | An\u00e1lise de \u00e1reas e mudan\u00e7as |\r\n| `statistical_visualization` | Gr\u00e1ficos estat\u00edsticos | An\u00e1lise de desempenho |\r\n| `visualization_utils` | Utilit\u00e1rios | Fun\u00e7\u00f5es auxiliares |\r\n\r\n### \ud83d\udcc8 1. Diagrama Sankey (Transi\u00e7\u00f5es)\r\n\r\n**Para visualizar como as classes de uso da terra se transformam:**\r\n\r\n```python\r\nfrom landuse_intensity.sankey_visualization import plot_single_step_sankey\r\n\r\n# Criar diagrama Sankey interativo\r\nfiles = plot_single_step_sankey(\r\n contingency_data=ct.table, # Dados da tabela de conting\u00eancia\r\n output_dir=\"outputs\", # Pasta para salvar\r\n filename=\"transicoes_sankey\", # Nome do arquivo\r\n title=\"Transi\u00e7\u00f5es no Uso da Terra\", # T\u00edtulo do gr\u00e1fico\r\n width=1000, # Largura em pixels\r\n height=600, # Altura em pixels\r\n min_flow=5, # Fluxo m\u00ednimo para mostrar\r\n export_formats=['html', 'png'] # Formatos de exporta\u00e7\u00e3o\r\n)\r\n\r\nprint(\"\u2705 Arquivos gerados:\")\r\nfor fmt, path in files.items():\r\n print(f\" {fmt.upper()}: {path}\")\r\n```\r\n\r\n**Resultado:** Arquivo `outputs/transicoes_sankey.html` com diagrama interativo\r\n\r\n### \ud83d\udd25 2. Mapa de Calor da Matriz de Transi\u00e7\u00e3o\r\n\r\n**Para visualizar a intensidade das transi\u00e7\u00f5es:**\r\n\r\n```python\r\nfrom landuse_intensity.matrix_visualization import plot_transition_matrix_heatmap\r\n\r\n# Criar mapa de calor\r\nfig = plot_transition_matrix_heatmap(\r\n tabulation_matrix=ct.table, # Matriz de transi\u00e7\u00e3o\r\n filename=\"matriz_transicao\", # Nome do arquivo\r\n output_dir=\"outputs\", # Pasta de sa\u00edda\r\n title=\"Matriz de Transi\u00e7\u00e3o de Uso da Terra\",\r\n figsize=(10, 8), # Tamanho da figura\r\n cmap=\"YlOrRd\", # Paleta de cores\r\n annot=True, # Mostrar valores\r\n fmt=\".1f\", # Formato dos n\u00fameros\r\n show_percentages=False # Mostrar em unidades absolutas\r\n)\r\n\r\nprint(\"\u2705 Mapa de calor salvo em: outputs/matriz_transicao.png\")\r\n```\r\n\r\n### \ud83d\udcca 3. Gr\u00e1fico de Barras (\u00c1reas por Classe)\r\n\r\n**Para comparar \u00e1reas de cada classe de uso da terra:**\r\n\r\n```python\r\nimport pandas as pd\r\nfrom landuse_intensity.bar_chart_visualization import plot_barplot_lulc\r\n\r\n# Preparar dados para o gr\u00e1fico\r\narea_data = []\r\nfor class_name in ct.table.index:\r\n area = ct.table.loc[class_name].sum()\r\n area_data.append({\r\n 'class': class_name,\r\n 'area': area,\r\n 'time_period': 'Tempo 1'\r\n })\r\n\r\nfor class_name in ct.table.columns:\r\n area = ct.table[class_name].sum()\r\n area_data.append({\r\n 'class': class_name,\r\n 'area': area,\r\n 'time_period': 'Tempo 2'\r\n })\r\n\r\ndf_areas = pd.DataFrame(area_data)\r\n\r\n# Criar gr\u00e1fico de barras\r\nfig = plot_barplot_lulc(\r\n data=df_areas,\r\n filename=\"areas_classes\",\r\n output_dir=\"outputs\",\r\n title=\"\u00c1reas por Classe de Uso da Terra\",\r\n x_col=\"class\",\r\n y_col=\"area\",\r\n time_col=\"time_period\", # Para comparar per\u00edodos\r\n figsize=(12, 6),\r\n color_palette=\"Set2\",\r\n scientific_style=True,\r\n show_values=True\r\n)\r\n\r\nprint(\"\u2705 Gr\u00e1fico de barras salvo em: outputs/areas_classes.png\")\r\n```\r\n\r\n### \ud83d\udcc8 4. An\u00e1lise de Ganhos e Perdas\r\n\r\n**Para visualizar quais classes ganharam ou perderam \u00e1rea:**\r\n\r\n```python\r\nfrom landuse_intensity.bar_chart_visualization import plot_gain_loss_analysis\r\n\r\n# Preparar dados de ganho/perda\r\ngain_loss_data = []\r\nclasses = list(set(ct.table.index) | set(ct.table.columns))\r\n\r\nfor class_name in classes:\r\n # Calcular ganhos (entradas)\r\n if class_name in ct.table.columns:\r\n gain = ct.table[class_name].sum() - ct.table.loc[class_name, class_name] if class_name in ct.table.index else ct.table[class_name].sum()\r\n else:\r\n gain = 0\r\n\r\n # Calcular perdas (sa\u00eddas)\r\n if class_name in ct.table.index:\r\n loss = ct.table.loc[class_name].sum() - ct.table.loc[class_name, class_name] if class_name in ct.table.columns else ct.table.loc[class_name].sum()\r\n else:\r\n loss = 0\r\n\r\n net_change = gain - loss\r\n\r\n gain_loss_data.append({\r\n 'class': class_name,\r\n 'gain': gain,\r\n 'loss': loss,\r\n 'net_change': net_change\r\n })\r\n\r\ndf_gain_loss = pd.DataFrame(gain_loss_data)\r\n\r\n# Criar gr\u00e1fico de ganho/perda\r\nfig = plot_gain_loss_analysis(\r\n gain_loss_data=df_gain_loss,\r\n filename=\"ganho_perda\",\r\n output_dir=\"outputs\",\r\n title=\"An\u00e1lise de Ganho e Perda por Classe\",\r\n figsize=(12, 8),\r\n scientific_style=True\r\n)\r\n\r\nprint(\"\u2705 An\u00e1lise de ganho/perda salva em: outputs/ganho_perda.png\")\r\n```\r\n\r\n### \ud83c\udfaf 5. Matriz de Confus\u00e3o (para Valida\u00e7\u00e3o)\r\n\r\n**Para avaliar a precis\u00e3o de classifica\u00e7\u00e3o:**\r\n\r\n```python\r\nfrom landuse_intensity.matrix_visualization import plot_confusion_matrix\r\n\r\n# Criar dados de exemplo para matriz de confus\u00e3o\r\n# (Em um caso real, isso viria de dados observados vs. previstos)\r\ntrue_labels = ['Floresta', 'Floresta', 'Agricultura', 'Urbano', 'Floresta']\r\npredicted_labels = ['Floresta', 'Agricultura', 'Agricultura', 'Urbano', 'Floresta']\r\n\r\n# Criar DataFrame de confus\u00e3o\r\nconfusion_data = pd.crosstab(\r\n pd.Series(true_labels, name='Observado'),\r\n pd.Series(predicted_labels, name='Previsto')\r\n)\r\n\r\n# Criar matriz de confus\u00e3o\r\nfig = plot_confusion_matrix(\r\n confusion_matrix=confusion_data,\r\n filename=\"matriz_confusao\",\r\n output_dir=\"outputs\",\r\n title=\"Matriz de Confus\u00e3o - Valida\u00e7\u00e3o da Classifica\u00e7\u00e3o\",\r\n figsize=(8, 6),\r\n normalize='true', # Normalizar por linha (observado)\r\n scientific_style=True\r\n)\r\n\r\nprint(\"\u2705 Matriz de confus\u00e3o salva em: outputs/matriz_confusao.png\")\r\n```\r\n\r\n---\r\n\r\n## \ud83d\udd2c An\u00e1lise Avan\u00e7ada\r\n\r\n### An\u00e1lise de Intensidade Pontius-Aldwaik\r\n\r\n```python\r\nfrom landuse_intensity import IntensityAnalyzer\r\n\r\n# Criar analisador de intensidade\r\nanalyzer = lui.IntensityAnalyzer(ct)\r\n\r\n# An\u00e1lise completa\r\nresults = analyzer.full_analysis()\r\n\r\nprint(\"\ud83d\udcca An\u00e1lise de Intensidade - N\u00edvel de Intervalo:\")\r\nprint(f\"Taxa de mudan\u00e7a anual: {results.interval.annual_change_rate:.2f}%\")\r\nprint(f\"Intensidade de mudan\u00e7a: {results.interval.change_intensity:.2f}\")\r\n\r\nprint(\"\\n\ud83d\udcca An\u00e1lise de Intensidade - N\u00edvel de Categoria:\")\r\nfor category_result in results.category:\r\n print(f\"{category_result.category_name}:\")\r\n print(f\" Ganho relativo: {category_result.relative_gain:.2f}\")\r\n print(f\" Perda relativa: {category_result.relative_loss:.2f}\")\r\n```\r\n\r\n### An\u00e1lise Multi-Temporal\r\n\r\n```python\r\nfrom landuse_intensity import MultiStepAnalyzer\r\n\r\n# An\u00e1lise com m\u00faltiplos per\u00edodos\r\nrasters = [raster_t1, raster_t2] # Adicione mais rasters conforme necess\u00e1rio\r\ntime_labels = ['2000', '2020']\r\n\r\nmulti_analyzer = lui.MultiStepAnalyzer(rasters, time_labels)\r\nmulti_results = multi_analyzer.analyze_all_steps()\r\n\r\nprint(\"\ud83d\udcc8 An\u00e1lise Multi-Temporal:\")\r\nfor step_name, step_result in multi_results.items():\r\n print(f\"{step_name}: {step_result.interval.annual_change_rate:.2f}% mudan\u00e7a anual\")\r\n```\r\n\r\n### Trabalhando com Arquivos Raster Reais\r\n\r\n```python\r\n# Carregar arquivos GeoTIFF\r\nraster_2000, metadata_2000 = lui.read_raster(\"caminho/para/landuse_2000.tif\")\r\nraster_2020, metadata_2020 = lui.read_raster(\"caminho/para/landuse_2020.tif\")\r\n\r\n# Verificar se os rasters s\u00e3o compat\u00edveis\r\nprint(f\"Proje\u00e7\u00e3o compat\u00edvel: {metadata_2000['crs'] == metadata_2020['crs']}\")\r\nprint(f\"Resolu\u00e7\u00e3o: {metadata_2000['transform'][0]}m x {metadata_2000['transform'][4]}m\")\r\n\r\n# Criar tabela de conting\u00eancia\r\nct_real = lui.ContingencyTable.from_rasters(\r\n raster_2000, raster_2020,\r\n labels1=['Floresta', 'Agricultura', 'Urbano', '\u00c1gua', 'Pastagem'],\r\n labels2=['Floresta', 'Agricultura', 'Urbano', '\u00c1gua', 'Pastagem']\r\n)\r\n\r\n# An\u00e1lise completa\r\nanalyzer_real = lui.IntensityAnalyzer(ct_real)\r\nresults_real = analyzer_real.full_analysis()\r\n\r\n# Salvar resultados\r\nct_real.table.to_csv(\"resultados/contingencia_real.csv\")\r\nresults_real.to_json(\"resultados/analise_intensidade.json\")\r\n```\r\n\r\n---\r\n\r\n## \ud83c\udfa8 Galeria de Visualiza\u00e7\u00f5es\r\n\r\n### Tipos de Gr\u00e1ficos Dispon\u00edveis\r\n\r\n| Tipo | M\u00f3dulo | Descri\u00e7\u00e3o | Melhor Uso |\r\n|------|--------|-----------|------------|\r\n| **Sankey** | `sankey_visualization` | Fluxos interativos entre classes | Mostrar transi\u00e7\u00f5es detalhadas |\r\n| **Mapa de Calor** | `matrix_visualization` | Intensidade de transi\u00e7\u00f5es | Comparar magnitudes |\r\n| **Barras** | `bar_chart_visualization` | Compara\u00e7\u00e3o de \u00e1reas | An\u00e1lise temporal |\r\n| **Ganho/Perda** | `bar_chart_visualization` | Mudan\u00e7as positivas/negativas | Identificar tend\u00eancias |\r\n| **ROC Curve** | `statistical_visualization` | Performance de classifica\u00e7\u00e3o | Avalia\u00e7\u00e3o de modelos |\r\n| **Precis\u00e3o-Revoca\u00e7\u00e3o** | `statistical_visualization` | M\u00e9tricas de classifica\u00e7\u00e3o | An\u00e1lise de trade-offs |\r\n\r\n### Par\u00e2metros Comuns\r\n\r\nTodos os gr\u00e1ficos suportam:\r\n\r\n```python\r\n# Par\u00e2metros universais\r\nfilename=\"meu_grafico\" # Nome do arquivo (sem extens\u00e3o)\r\noutput_dir=\"outputs\" # Pasta de sa\u00edda\r\ntitle=\"T\u00edtulo do Gr\u00e1fico\" # T\u00edtulo\r\nfigsize=(10, 6) # Tamanho da figura\r\nscientific_style=True # Estilo cient\u00edfico (fonte serifada, grid)\r\n```\r\n\r\n### Exporta\u00e7\u00e3o Multi-Formato\r\n\r\n```python\r\n# Para Sankey (suporta m\u00faltiplos formatos)\r\nfiles = plot_single_step_sankey(\r\n contingency_data=ct.table,\r\n export_formats=['html', 'png', 'svg', 'pdf'] # Escolha os formatos\r\n)\r\n\r\n# Para outros gr\u00e1ficos (PNG e PDF autom\u00e1tico)\r\nplot_transition_matrix_heatmap(\r\n tabulation_matrix=ct.table,\r\n filename=\"matriz\" # Gera .png e .pdf automaticamente\r\n)\r\n```\r\n\r\n---\r\n\r\n## \ud83d\udcda Exemplos Pr\u00e1ticos Completos\r\n\r\n### \ud83c\udf1f Exemplo 1: An\u00e1lise Completa de Pequena \u00c1rea\r\n\r\n```python\r\nimport landuse_intensity as lui\r\nimport pandas as pd\r\nfrom pathlib import Path\r\n\r\n# Criar diret\u00f3rio de sa\u00edda\r\noutput_dir = Path(\"analise_completa\")\r\noutput_dir.mkdir(exist_ok=True)\r\n\r\n# 1. Carregar dados\r\nraster_t1, raster_t2 = lui.demo_landscape()\r\n\r\n# 2. An\u00e1lise b\u00e1sica\r\nct = lui.ContingencyTable.from_rasters(raster_t1, raster_t2)\r\nanalyzer = lui.IntensityAnalyzer(ct)\r\nresults = analyzer.full_analysis()\r\n\r\n# 3. Gerar todos os gr\u00e1ficos\r\nfrom landuse_intensity.sankey_visualization import plot_single_step_sankey\r\nfrom landuse_intensity.matrix_visualization import plot_transition_matrix_heatmap\r\nfrom landuse_intensity.bar_chart_visualization import plot_barplot_lulc\r\n\r\n# Sankey\r\nplot_single_step_sankey(\r\n ct.table,\r\n output_dir=str(output_dir),\r\n filename=\"sankey_completo\",\r\n title=\"An\u00e1lise Completa de Transi\u00e7\u00f5es\"\r\n)\r\n\r\n# Matriz de calor\r\nplot_transition_matrix_heatmap(\r\n ct.table,\r\n filename=\"matriz_completo\",\r\n output_dir=str(output_dir),\r\n title=\"Matriz de Transi\u00e7\u00e3o Completa\"\r\n)\r\n\r\n# Gr\u00e1fico de \u00e1reas\r\narea_data = []\r\nfor class_name in ct.table.index:\r\n area_data.append({'class': class_name, 'area': ct.table.loc[class_name].sum(), 'period': 'Tempo 1'})\r\nfor class_name in ct.table.columns:\r\n area_data.append({'class': class_name, 'area': ct.table[class_name].sum(), 'period': 'Tempo 2'})\r\n\r\ndf_areas = pd.DataFrame(area_data)\r\nplot_barplot_lulc(\r\n df_areas,\r\n filename=\"areas_completo\",\r\n output_dir=str(output_dir),\r\n title=\"Compara\u00e7\u00e3o de \u00c1reas por Per\u00edodo\"\r\n)\r\n\r\nprint(f\"\u2705 An\u00e1lise completa salva em: {output_dir}\")\r\nprint(f\"\ud83d\udcca {len(list(output_dir.glob('*.png')))} gr\u00e1ficos PNG gerados\")\r\nprint(f\"\ud83c\udf10 {len(list(output_dir.glob('*.html')))} gr\u00e1ficos HTML gerados\")\r\n```\r\n\r\n### \ud83c\udf0d Exemplo 2: Estudo de Caso Real - Cerrado\r\n\r\n```python\r\nimport landuse_intensity as lui\r\nimport numpy as np\r\n\r\n# Simular dados do Cerrado brasileiro\r\nprint(\"\ud83c\udf0d An\u00e1lise do Bioma Cerrado\")\r\n\r\n# Dados simulados (substitua por dados reais)\r\nclasses_cerrado = ['Cerrado', 'Cerrad\u00e3o', 'Campo', 'Agricultura', 'Pastagem', 'Silvicultura']\r\n\r\n# Criar rasters simulados\r\nnp.random.seed(42)\r\nraster_2000 = np.random.choice([0,1,2,3,4,5], size=(500, 500), p=[0.4, 0.2, 0.2, 0.1, 0.05, 0.05])\r\nraster_2020 = np.random.choice([0,1,2,3,4,5], size=(500, 500), p=[0.3, 0.15, 0.15, 0.2, 0.15, 0.05])\r\n\r\n# An\u00e1lise\r\nct_cerrado = lui.ContingencyTable.from_rasters(\r\n raster_2000, raster_2020,\r\n labels1=classes_cerrado,\r\n labels2=classes_cerrado\r\n)\r\n\r\nanalyzer_cerrado = lui.IntensityAnalyzer(ct_cerrado)\r\nresults_cerrado = analyzer_cerrado.full_analysis()\r\n\r\n# Relat\u00f3rio\r\nprint(\"\r\n\ud83d\udcca RELAT\u00d3RIO - MUDAN\u00c7AS NO CERRADO (2000-2020)\" print(\"=\" * 50)\r\nprint(f\"\u00c1rea total analisada: {ct_cerrado.total_area:,} hectares\")\r\nprint(f\"\u00c1rea que mudou: {ct_cerrado.total_change:,} hectares ({ct_cerrado.total_change/ct_cerrado.total_area*100:.1f}%)\")\r\nprint(f\"Taxa de mudan\u00e7a anual: {results_cerrado.interval.annual_change_rate:.2f}%\")\r\n\r\nprint(\"\r\n\ud83d\udd04 Principais Transi\u00e7\u00f5es:\" transitions = ct_cerrado.table.stack()\r\ntop_transitions = transitions[transitions > 0].sort_values(ascending=False).head(5)\r\n\r\nfor (from_class, to_class), area in top_transitions.items():\r\n if from_class != to_class:\r\n print(f\" {from_class} \u2192 {to_class}: {area:,} hectares\")\r\n\r\n# Gerar visualiza\u00e7\u00f5es\r\nfrom landuse_intensity.sankey_visualization import plot_single_step_sankey\r\n\r\nplot_single_step_sankey(\r\n ct_cerrado.table,\r\n output_dir=\"cerrado_results\",\r\n filename=\"cerrado_transitions\",\r\n title=\"Transi\u00e7\u00f5es no Bioma Cerrado (2000-2020)\",\r\n export_formats=['html', 'png', 'pdf']\r\n)\r\n\r\nprint(\"\r\n\u2705 Relat\u00f3rio e visualiza\u00e7\u00f5es salvos em: cerrado_results/\" print(\"\ud83c\udf10 Arquivo interativo: cerrado_results/cerrado_transitions.html\")\r\n```\r\n\r\n---\r\n\r\n## \ud83d\udd27 Solu\u00e7\u00e3o de Problemas\r\n\r\n### Erro: \"M\u00f3dulo n\u00e3o encontrado\"\r\n\r\n```python\r\n# Verificar instala\u00e7\u00e3o\r\nimport landuse_intensity as lui\r\nprint(\"Vers\u00e3o:\", lui.__version__)\r\n\r\n# Se n\u00e3o funcionar, reinstalar\r\npip uninstall landuse-intensity-analysis\r\npip install landuse-intensity-analysis\r\n```\r\n\r\n### Erro: \"Dados inv\u00e1lidos\"\r\n\r\n```python\r\n# Validar dados antes da an\u00e1lise\r\nfrom landuse_intensity.utils import validate_raster_data\r\n\r\nis_valid, message = validate_raster_data(raster_t1, raster_t2)\r\nif not is_valid:\r\n print(f\"Erro nos dados: {message}\")\r\n```\r\n\r\n### Performance com Grandes Rasters\r\n\r\n```python\r\n# Para rasters muito grandes, processe em blocos\r\nfrom landuse_intensity.utils import process_raster_in_chunks\r\n\r\nresults = process_raster_in_chunks(\r\n raster_t1, raster_t2,\r\n chunk_size=(1000, 1000),\r\n overlap=50\r\n)\r\n```\r\n\r\n---\r\n\r\n## \ud83d\udcda Refer\u00eancias\r\n\r\n### Metodologia\r\n\r\n- **Aldwaik, S. Z., & Pontius Jr, R. G. (2012).** Intensity analysis to unify measurements of size and stationarity of land changes by interval, category, and transition. *Landscape and Urban Planning*, 106(1), 103-114.\r\n\r\n- **Pontius Jr, R. G., & Millones, M. (2011).** Death to Kappa: birth of quantity disagreement and allocation disagreement for accuracy assessment. *International Journal of Remote Sensing*, 32(15), 4407-4429.\r\n\r\n### Implementa\u00e7\u00e3o\r\n\r\n- **Documenta\u00e7\u00e3o Oficial**: [Read the Docs](https://landuse-intensity-analysis.readthedocs.io/)\r\n- **Reposit\u00f3rio GitHub**: [C\u00f3digo Fonte](https://github.com/ils15/LandUse-Intensity-Analysis)\r\n- **Exemplos**: Pasta `examples/` no reposit\u00f3rio\r\n\r\n---\r\n\r\n## \ud83e\udd1d Contribui\u00e7\u00e3o\r\n\r\nContribui\u00e7\u00f5es s\u00e3o bem-vindas!\r\n\r\n1. Fork o projeto\r\n2. Crie uma branch para sua feature (`git checkout -b feature/nova-feature`)\r\n3. Commit suas mudan\u00e7as (`git commit -am 'Adiciona nova feature'`)\r\n4. Push para a branch (`git push origin feature/nova-feature`)\r\n5. Abra um Pull Request\r\n\r\n---\r\n\r\n## \ud83d\udcc4 Licen\u00e7a\r\n\r\nEste projeto est\u00e1 licenciado sob a Licen\u00e7a MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.\r\n\r\n---\r\n\r\n## \ud83c\udd98 Suporte\r\n\r\n**Precisa de ajuda?**\r\n\r\n1. \ud83d\udcd6 **Documenta\u00e7\u00e3o**: Leia os exemplos na pasta `examples/`\r\n2. \ud83d\udc1b **Issues**: [GitHub Issues](https://github.com/ils15/LandUse-Intensity-Analysis/issues)\r\n3. \ud83d\udcac **Discuss\u00f5es**: [GitHub Discussions](https://github.com/ils15/LandUse-Intensity-Analysis/discussions)\r\n4. \ud83d\udce7 **Email**: Para quest\u00f5es espec\u00edficas\r\n\r\n---\r\n\r\n> Desenvolvido com \u2764\ufe0f para a comunidade de ci\u00eancias ambientais e geotecnologia\r\n\r\n**Vers\u00e3o Atual**: 2.0.3 | **Python**: 3.8+ | **Mantenedor**: [ils15](https://github.com/ils15)\r\n\r\n## \ud83c\udf1f What does it do?\r\n\r\nTransform your land cover raster data into meaningful insights about environmental change:\r\n\r\n1. **Quantify Changes**: Calculate transition matrices and area statistics from multi-temporal raster data\r\n2. **Intensity Analysis**: Apply the proven Pontius-Aldwaik methodology for interval, category, and transition-level analysis\r\n3. **Rich Visualizations**: Create publication-ready Sankey diagrams, heatmaps, spatial maps, and statistical plots\r\n4. **Spatial Analysis**: Process GeoTIFF files with built-in raster handling and spatial change detection\r\n\r\n## \u2728 Key Features\r\n\r\n- \ud83d\udd2c **Scientific Rigor**: Implements the established Pontius-Aldwaik intensity analysis methodology\r\n- \ud83d\udcca **Rich Visualizations**: Sankey diagrams, transition matrices, spatial maps, and statistical plots using matplotlib and plotly\r\n- \ud83d\uddfa\ufe0f **Spatial Support**: Direct processing of GeoTIFF files and numpy arrays\r\n- \ud83c\udfaf **Object-Oriented Design**: Clean API with `ContingencyTable`, `IntensityAnalyzer`, and `MultiStepAnalyzer` classes\r\n- \ud83d\udcc8 **Multi-temporal Analysis**: Support for analyzing changes across multiple time periods\r\n- \ud83d\udd27 **Comprehensive Toolkit**: Complete suite of utility functions for data processing and validation\r\n\r\n## \ud83d\ude80 Installation\r\n\r\n```bash\r\npip install landuse-intensity-analysis\r\n```\r\n\r\n## \ud83d\udcd6 Quick Start\r\n\r\n### Basic Analysis Example\r\n\r\n```python\r\nimport numpy as np\r\nimport landuse_intensity as lui\r\n\r\n# Step 1: Create contingency table from rasters\r\n# Example with 2 time periods and 3 land use classes\r\nraster_t1 = np.array([[1, 1, 2], [1, 2, 3], [2, 3, 3]]) # Time 1\r\nraster_t2 = np.array([[1, 2, 2], [2, 2, 3], [3, 3, 3]]) # Time 2\r\n\r\n# Create contingency table\r\nct = lui.ContingencyTable.from_rasters(\r\n raster_t1, raster_t2, \r\n labels1=['Forest', 'Agriculture', 'Urban', 'Water'],\r\n labels2=['Forest', 'Agriculture', 'Urban', 'Water']\r\n)\r\n\r\n# Step 2: Run intensity analysis\r\nanalyzer = lui.IntensityAnalyzer(ct)\r\nresults = analyzer.full_analysis()\r\n\r\n# Step 3: Display results\r\nprint(\"Contingency Table:\")\r\nprint(ct.table)\r\nprint(f\"\\nTotal Change: {ct.total_change} pixels\")\r\nprint(f\"Persistence: {ct.persistence} pixels\")\r\n\r\n# Step 4: Create visualizations\r\nfrom landuse_intensity import visualization as viz\r\n\r\n# Sankey diagram\r\nviz.plot_single_step_sankey(\r\n ct.table, \r\n title=\"Land Use Transitions\",\r\n save_path=\"sankey_diagram.html\"\r\n)\r\n\r\n# Transition matrix heatmap\r\nviz.plot_transition_matrix_heatmap(\r\n ct.table,\r\n title=\"Land Use Transition Matrix\",\r\n save_path=\"transition_matrix.png\"\r\n)\r\n```\r\n\r\n### Working with Real Raster Files\r\n\r\n```python\r\nimport landuse_intensity as lui\r\n\r\n# Load raster data\r\nraster1, metadata1 = lui.read_raster(\"land_cover_2000.tif\")\r\nraster2, metadata2 = lui.read_raster(\"land_cover_2020.tif\")\r\n\r\n# Create contingency table\r\ncontingency_df = lui.raster_to_contingency_table(\r\n raster1, raster2,\r\n class_names=['Forest', 'Agriculture', 'Urban', 'Water']\r\n)\r\n\r\n# Initialize analysis\r\nct = lui.ContingencyTable(contingency_df)\r\nanalyzer = lui.IntensityAnalyzer(ct)\r\n\r\n# Perform complete analysis\r\nresults = analyzer.analyze()\r\nprint(\"Interval Level Analysis:\", results['interval'])\r\nprint(\"Category Level Analysis:\", results['category'])\r\n```\r\n\r\n### Multi-Temporal Analysis\r\n\r\n```python\r\nimport landuse_intensity as lui\r\n\r\n# Load multiple time periods\r\nrasters = [\r\n lui.read_raster(\"land_cover_1990.tif\")[0],\r\n lui.read_raster(\"land_cover_2000.tif\")[0], \r\n lui.read_raster(\"land_cover_2010.tif\")[0],\r\n lui.read_raster(\"land_cover_2020.tif\")[0]\r\n]\r\n\r\ntime_labels = ['1990', '2000', '2010', '2020']\r\n\r\n# Multi-step analysis\r\nmulti_analyzer = lui.MultiStepAnalyzer(rasters, time_labels)\r\nmulti_results = multi_analyzer.analyze_all_steps()\r\n\r\nprint(\"Multi-step Analysis Results:\")\r\nfor step, result in multi_results.items():\r\n print(f\"{step}: {result['interval']['annual_change_rate']:.2f}% annual change\")\r\n```\r\n\r\n## \ufffd Complete API Reference\r\n\r\n### Core Classes\r\n\r\n#### ContingencyTable\r\n\r\nMain class for handling transition matrices:\r\n\r\n```python\r\n# Create from rasters\r\nct = lui.ContingencyTable.from_rasters(raster1, raster2, labels1, labels2)\r\n\r\n# Create from existing data \r\nct = lui.ContingencyTable(dataframe_or_array)\r\n\r\n# Properties\r\nct.table # Access transition matrix\r\nct.total_area # Total number of pixels/area\r\nct.persistence # Unchanged pixels\r\nct.total_change # Changed pixels\r\nct.validate() # Validate table structure\r\n```\r\n\r\n#### IntensityAnalyzer\r\nImplements Pontius-Aldwaik intensity analysis:\r\n\r\n```python\r\nanalyzer = lui.IntensityAnalyzer(contingency_table)\r\n\r\n# Analysis methods\r\nanalyzer.analyze_interval_level() # Overall change intensity\r\nanalyzer.analyze_category_level() # Class-specific gains/losses \r\nanalyzer.analyze_transition_level(from_class, to_class) # Transition intensity\r\nanalyzer.analyze() # Complete analysis\r\nanalyzer.full_analysis() # Returns AnalysisResults object\r\n```\r\n\r\n#### MultiStepAnalyzer\r\nFor multi-temporal analysis:\r\n\r\n```python\r\nanalyzer = lui.MultiStepAnalyzer(raster_list, time_labels)\r\n\r\nanalyzer.analyze_all_steps() # Step-by-step analysis\r\nanalyzer.analyze_overall_change() # Overall change summary\r\nanalyzer.compare_step_vs_overall() # Compare step vs overall rates\r\n```\r\n\r\n#### ChangeAnalyzer\r\nFor spatial change detection:\r\n\r\n```python\r\nchange_analyzer = lui.ChangeAnalyzer(raster1, raster2)\r\n\r\nchange_analyzer.analyze() # Basic change detection\r\nchange_analyzer.detect_hotspots() # Change hotspot detection\r\nchange_analyzer.create_change_map() # Spatial change mapping\r\n```\r\n\r\n### Visualization Functions\r\n\r\n#### Graph Visualizations\r\nFrom `landuse_intensity.graph_visualization`:\r\n\r\n```python\r\nfrom landuse_intensity import graph_visualization as gv\r\n\r\n# Sankey diagrams\r\ngv.plot_single_step_sankey(\r\n contingency_table, \r\n title=\"Land Use Transitions\",\r\n save_path=\"sankey.html\"\r\n)\r\n\r\n# Transition matrix heatmaps\r\ngv.plot_transition_matrix_heatmap(\r\n contingency_table,\r\n title=\"Transition Matrix\",\r\n save_path=\"heatmap.png\"\r\n)\r\n\r\n# Bar plots for LULC analysis\r\ngv.plot_barplot_lulc(\r\n lulc_data,\r\n title=\"Land Use Areas\",\r\n save_path=\"barplot.png\"\r\n)\r\n\r\n# Gain/Loss analysis\r\ngv.plot_gain_loss_analysis(\r\n contingency_table,\r\n title=\"Gain/Loss Analysis\"\r\n)\r\n\r\n# Accuracy assessment\r\ngv.plot_accuracy_assessment(\r\n observed, predicted,\r\n save_path=\"accuracy.png\"\r\n)\r\n\r\n# Confusion matrix\r\ngv.plot_confusion_matrix(\r\n true_labels, predicted_labels\r\n)\r\n```\r\n\r\n#### Spatial Visualizations \r\nFrom `landuse_intensity.map_visualization`:\r\n\r\n```python\r\nfrom landuse_intensity import map_visualization as mv\r\n\r\n# Spatial change maps\r\nmv.plot_spatial_change_map(\r\n raster_t1, raster_t2,\r\n title=\"Land Use Change Map\",\r\n save_path=\"change_map.png\"\r\n)\r\n\r\n# Multi-temporal maps\r\nmv.plot_multi_temporal_maps(\r\n raster_list, time_labels,\r\n title=\"Land Use Over Time\"\r\n)\r\n\r\n# Change detection\r\nmv.plot_change_detection_map(\r\n raster_t1, raster_t2,\r\n title=\"Change Detection\"\r\n)\r\n\r\n# Interactive maps\r\nmv.plot_interactive_map(\r\n raster_data, coordinates,\r\n save_path=\"interactive_map.html\"\r\n)\r\n\r\n# Elevation models\r\nmv.plot_elevation_model(\r\n elevation_raster,\r\n title=\"Digital Elevation Model\"\r\n)\r\n```\r\n\r\n#### Advanced Visualizations\r\nFrom `landuse_intensity.visualization`:\r\n\r\n```python\r\nfrom landuse_intensity import visualization as viz\r\n\r\n# Intensity analysis plots\r\nviz.plot_intensity_analysis(\r\n intensity_results,\r\n title=\"Pontius Intensity Analysis\"\r\n)\r\n\r\n# Multi-step Sankey\r\nviz.plot_multi_step_sankey(\r\n transitions_list,\r\n time_labels=time_labels\r\n)\r\n\r\n# Spatial change with persistence\r\nviz.plot_persistence_map(\r\n raster_t1, raster_t2,\r\n title=\"Persistence Analysis\"\r\n)\r\n\r\n# Temporal land change\r\nviz.plot_temporal_land_change(\r\n raster_list, time_labels,\r\n save_path=\"temporal_change.png\"\r\n)\r\n\r\n# Change frequency mapping\r\nviz.plot_change_frequency_map(\r\n raster_list,\r\n title=\"Change Frequency Analysis\"\r\n)\r\n```\r\n\r\n### Utility Functions\r\n\r\n#### Data Processing\r\n```python\r\nimport landuse_intensity as lui\r\n\r\n# Demo data generation\r\nraster_t1, raster_t2 = lui.demo_landscape()\r\n\r\n# Data validation\r\nis_valid = lui.validate_data(raster_data)\r\n\r\n# Area calculations\r\narea_matrix = lui.calculate_area_matrix(contingency_table, pixel_area=900)\r\n\r\n# Change summary\r\nsummary = lui.get_change_summary(contingency_table)\r\n\r\n# Area formatting\r\nlabel = lui.format_area_label(1500.5, units=\"hectares\")\r\n\r\n# Transition naming\r\nnames = lui.create_transition_names(\r\n from_classes=['Forest', 'Agriculture'], \r\n to_classes=['Urban', 'Water']\r\n)\r\n```\r\n\r\n#### Image Processing\r\n```python\r\nimport landuse_intensity as lui\r\n\r\n# Create contingency table from rasters\r\nct = lui.create_contingency_table(raster1, raster2, labels=['Forest', 'Urban'])\r\n\r\n# Calculate change map\r\nchange_map = lui.calculate_change_map(raster_t1, raster_t2)\r\n\r\n# Apply majority filter \r\nfiltered = lui.apply_majority_filter(raster, window_size=3)\r\n\r\n# Calculate patch metrics\r\nmetrics = lui.calculate_patch_metrics(raster, class_value=1)\r\n\r\n# Resample raster\r\nresampled = lui.resample_raster(raster, target_shape=(100, 100))\r\n\r\n# Align rasters\r\naligned1, aligned2 = lui.align_rasters(raster1, raster2)\r\n\r\n# Validate raster\r\nis_valid = lui.validate_raster(raster)\r\n\r\n# Mask raster\r\nmasked = lui.mask_raster(raster, mask, nodata_value=-9999)\r\n```\r\n\r\n#### Raster Handling\r\n```python\r\nimport landuse_intensity as lui\r\n\r\n# Read raster file\r\nraster_data, metadata = lui.read_raster(\"landcover.tif\")\r\n\r\n# Write raster file\r\nlui.write_raster(\r\n raster_data, \"output.tif\", \r\n metadata=metadata,\r\n nodata_value=-9999\r\n)\r\n\r\n# Convert rasters to contingency table\r\ncontingency_df = lui.raster_to_contingency_table(\r\n raster1, raster2,\r\n class_names=['Forest', 'Agriculture', 'Urban']\r\n)\r\n\r\n# Load demo data\r\ndemo_raster1, demo_raster2 = lui.load_demo_data()\r\n\r\n# Raster summary statistics\r\nsummary = lui.raster_summary(raster)\r\n\r\n# Reclassify raster\r\nreclassified = lui.reclassify_raster(\r\n raster, \r\n reclass_dict={1: 10, 2: 20, 3: 30}\r\n)\r\n```\r\n\r\n## \ud83d\udcca Analysis Functions\r\n\r\n### Main Analysis Function\r\n```python\r\n# One-step comprehensive analysis\r\nresults = lui.analyze_land_use_change(\r\n raster1=raster_t1,\r\n raster2=raster_t2, \r\n area_calculation=True,\r\n intensity_analysis=True,\r\n save_tables=True,\r\n output_dir=\"./results/\"\r\n)\r\n```\r\n\r\n## \ud83c\udfaf Complete Example: Real Dataset Analysis\r\n\r\n```python\r\nimport landuse_intensity as lui\r\nimport numpy as np\r\n\r\n# 1. Load real raster data\r\nraster_2000, meta_2000 = lui.read_raster(\"cerrado_2000.tif\")\r\nraster_2010, meta_2010 = lui.read_raster(\"cerrado_2010.tif\") \r\nraster_2020, meta_2020 = lui.read_raster(\"cerrado_2020.tif\")\r\n\r\n# 2. Create contingency tables\r\nct_2000_2010 = lui.ContingencyTable.from_rasters(\r\n raster_2000, raster_2010,\r\n labels1=['Forest', 'Savanna', 'Agriculture', 'Pasture', 'Urban'],\r\n labels2=['Forest', 'Savanna', 'Agriculture', 'Pasture', 'Urban']\r\n)\r\n\r\nct_2010_2020 = lui.ContingencyTable.from_rasters(\r\n raster_2010, raster_2020,\r\n labels1=['Forest', 'Savanna', 'Agriculture', 'Pasture', 'Urban'],\r\n labels2=['Forest', 'Savanna', 'Agriculture', 'Pasture', 'Urban']\r\n)\r\n\r\n# 3. Intensity analysis\r\nanalyzer_2000_2010 = lui.IntensityAnalyzer(ct_2000_2010)\r\nanalyzer_2010_2020 = lui.IntensityAnalyzer(ct_2010_2020)\r\n\r\nresults_2000_2010 = analyzer_2000_2010.analyze()\r\nresults_2010_2020 = analyzer_2010_2020.analyze()\r\n\r\n# 4. Multi-temporal analysis\r\nmulti_analyzer = lui.MultiStepAnalyzer(\r\n [raster_2000, raster_2010, raster_2020],\r\n ['2000', '2010', '2020']\r\n)\r\nmulti_results = multi_analyzer.analyze_all_steps()\r\n\r\n# 5. Create visualizations\r\nfrom landuse_intensity import graph_visualization as gv\r\nfrom landuse_intensity import map_visualization as mv\r\n\r\n# Sankey diagrams for each period\r\ngv.plot_single_step_sankey(\r\n ct_2000_2010.table,\r\n title=\"Cerrado Land Use Transitions 2000-2010\",\r\n save_path=\"sankey_2000_2010.html\"\r\n)\r\n\r\ngv.plot_single_step_sankey(\r\n ct_2010_2020.table, \r\n title=\"Cerrado Land Use Transitions 2010-2020\",\r\n save_path=\"sankey_2010_2020.html\"\r\n)\r\n\r\n# Spatial change maps\r\nmv.plot_spatial_change_map(\r\n raster_2000, raster_2020,\r\n title=\"Cerrado Land Use Change 2000-2020\",\r\n save_path=\"cerrado_change_map.png\"\r\n)\r\n\r\n# Multi-temporal maps\r\nmv.plot_multi_temporal_maps(\r\n [raster_2000, raster_2010, raster_2020],\r\n ['2000', '2010', '2020'],\r\n title=\"Cerrado Land Use Evolution\"\r\n)\r\n\r\n# 6. Export results\r\nprint(\"=== ANALYSIS RESULTS ===\")\r\nprint(f\"Period 2000-2010:\")\r\nprint(f\" Annual change rate: {results_2000_2010['interval']['annual_change_rate']:.2f}%\")\r\nprint(f\" Total change: {ct_2000_2010.total_change} pixels\")\r\n\r\nprint(f\"Period 2010-2020:\") \r\nprint(f\" Annual change rate: {results_2010_2020['interval']['annual_change_rate']:.2f}%\")\r\nprint(f\" Total change: {ct_2010_2020.total_change} pixels\")\r\n\r\n# Export contingency tables\r\nct_2000_2010.table.to_csv(\"contingency_2000_2010.csv\")\r\nct_2010_2020.table.to_csv(\"contingency_2010_2020.csv\")\r\n```\r\n\r\n## \ud83d\udcda References\r\n\r\nThis library implements the Pontius-Aldwaik intensity analysis methodology:\r\n\r\n- Aldwaik, S. Z., & Pontius Jr, R. G. (2012). Intensity analysis to unify measurements of size and stationarity of land changes by interval, category, and transition. *Landscape and Urban Planning*, 106(1), 103-114.\r\n\r\n- Pontius Jr, R. G., & Millones, M. (2011). Death to Kappa: birth of quantity disagreement and allocation disagreement for accuracy assessment. *International Journal of Remote Sensing*, 32(15), 4407-4429.\r\n\r\n## \ud83d\udcc4 License\r\n\r\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\r\n\r\n## \ud83e\udd1d Contributing\r\n\r\nContributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.\r\n\r\n## \ud83d\udcee Support\r\n\r\nIf you encounter any issues or have questions:\r\n\r\n1. Check the examples in the `examples/` directory\r\n2. Read the documentation\r\n3. Open an issue on GitHub\r\n\r\n## \ud83c\udfaf Version Information\r\n\r\n- **Current Version**: 2.0.3\r\n- **Python Requirements**: Python 3.8+\r\n- **Key Dependencies**: numpy, pandas, matplotlib, plotly, rasterio\r\n\r\n---\r\n\r\n> Made with \u2764\ufe0f for the geospatial and environmental science community\r\n\r\n- **Smart Detection**: No need to manually specify analysis type\r\n- **Methodology Compatible**: Follows established methodology\r\n- **Flexible**: Override auto-detection when needed\r\n- **Unified Interface**: Single function for all analysis types\r\n\r\n### Raster Stacking and Year Detection\r\n\r\n#### Raster Stacking Options\r\n\r\n**1. Automatic Directory Loading:**\r\n\r\n```python\r\nfrom landuse_intensity.raster import load_rasters\r\n\r\n# Load all .tif files from directory\r\nrasters = load_rasters(\"data/landuse/\")\r\n# Automatically finds and stacks: landuse_1990.tif, landuse_2000.tif, landuse_2010.tif\r\n```\r\n\r\n**2. Manual File Selection:**\r\n\r\n```python\r\n# Load specific files in custom order\r\nfiles = [\"landuse_1990.tif\", \"landuse_2005.tif\", \"landuse_2010.tif\"]\r\nrasters = load_rasters(files)\r\n```\r\n\r\n## Scientific Background\r\n\r\nThis library implements the Pontius-Aldwaik intensity analysis methodology, which provides a comprehensive framework for understanding land use change patterns. The methodology distinguishes between:\r\n\r\n- **Quantity of change**: How much land changed category\r\n- **Exchange**: Land that would have changed even if proportions remained constant\r\n- **Shift**: Land that changed due to systematic transitions\r\n\r\n## API Reference\r\n\r\n### Main Classes\r\n\r\n#### `ContingencyTable`\r\n\r\nMain class for creating and managing transition matrices.\r\n\r\n**Methods:**\r\n\r\n- `from_rasters()`: Create contingency table from raster data\r\n- `validate()`: Validate table data integrity\r\n- `get_summary_stats()`: Get statistical summary\r\n- `get_transition_matrix()`: Get transition matrix representation\r\n\r\n#### `IntensityAnalyzer`\r\n\r\nClass for performing Pontius-Aldwaik intensity analysis.\r\n\r\n**Methods:**\r\n\r\n- `analyze()`: Perform intensity analysis on contingency table\r\n- `full_analysis()`: Complete analysis with all metrics\r\n- `get_category_analysis()`: Category-level intensity analysis\r\n- `get_transition_analysis()`: Transition-level intensity analysis\r\n\r\n### Data Format\r\n\r\nThe library expects land use data in numpy arrays or pandas DataFrames:\r\n\r\n```python\r\n# Raster data (numpy arrays)\r\nraster_1990 = np.array([[1, 1, 2], [1, 2, 3], [2, 3, 3]])\r\nraster_2000 = np.array([[1, 2, 2], [2, 2, 3], [3, 3, 3]])\r\n\r\n# Or pandas DataFrame\r\ncontingency_df = pd.DataFrame({\r\n 'Forest->Forest': [100, 0, 0],\r\n 'Forest->Agriculture': [20, 0, 0],\r\n 'Agriculture->Agriculture': [0, 80, 0]\r\n})\r\n```\r\n\r\n## Visualization Gallery\r\n\r\nThe library provides several types of visualizations:\r\n\r\n- **Intensity Maps**: Spatial distribution of land use intensity\r\n- **Transition Matrices**: Category transition probabilities\r\n- **Time Series Plots**: Temporal evolution of land use patterns\r\n- **Chord Diagrams**: Flow visualization between categories\r\n- **Sankey Diagrams**: Flow-based transition visualization\r\n\r\n## Advanced Usage\r\n\r\n### Working with Large Datasets\r\n\r\n```python\r\n# For large raster datasets, consider memory usage\r\nimport numpy as np\r\nfrom landuse_intensity import ContingencyTable\r\n\r\n# Process in chunks for very large rasters\r\ndef process_large_raster(raster1, raster2, chunk_size=1000):\r\n height, width = raster1.shape\r\n results = []\r\n \r\n for i in range(0, height, chunk_size):\r\n for j in range(0, width, chunk_size):\r\n chunk1 = raster1[i:i+chunk_size, j:j+chunk_size]\r\n chunk2 = raster2[i:i+chunk_size, j:j+chunk_size]\r\n \r\n ct = ContingencyTable.from_rasters(chunk1, chunk2)\r\n results.append(ct)\r\n \r\n return results\r\n```\r\n\r\n### Custom Analysis Parameters\r\n\r\n```python\r\n# Customize analysis with specific parameters\r\nfrom landuse_intensity import IntensityAnalyzer\r\n\r\n# Create analyzer with custom settings\r\nanalyzer = IntensityAnalyzer()\r\n\r\n# Perform analysis with specific options\r\nresults = analyzer.analyze(\r\n contingency_table=ct,\r\n include_interval=True,\r\n include_category=True,\r\n include_transition=True\r\n)\r\n```\r\n\r\n### Spatial Analysis\r\n\r\n```python\r\n# Load geospatial data\r\nimport rasterio\r\nimport xarray as xr\r\n\r\nwith rasterio.open('land_use_1990.tif') as src:\r\n data_1990 = src.read(1)\r\n\r\nwith rasterio.open('land_use_2000.tif') as src:\r\n data_2000 = src.read(1)\r\n\r\n# Perform spatial intensity analysis\r\nspatial_results = analyzer.spatial_intensity_analysis(\r\n data_1990, data_2000,\r\n transform=src.transform\r\n)\r\n```\r\n\r\n## \ud83d\udcda Complete Documentation\r\n\r\n## Usage\r\n\r\n### \ud83d\udd27 Key Features\r\n\r\n- **Raster Loading**: Multiple methods (automatic, manual, dataset)\r\n- **Year Detection**: Automatic year extraction from filenames\r\n- **Contingency Tables**: Transition matrix generation\r\n- **Intensity Analysis**: Pontius-Aldwaik methodology\r\n- **Visualizations**: Modern interactive plots\r\n- **Change Maps**: Spatial analysis and mapping\r\n- **Export Options**: CSV, JSON, HTML formats\r\n\r\n### \ud83d\udccb Complete Analysis Workflow\r\n\r\n```python\r\n# 1. Load raster data\r\nfrom landuse_intensity import read_raster\r\nraster1, meta1 = read_raster(\"landuse_1990.tif\")\r\nraster2, meta2 = read_raster(\"landuse_2000.tif\")\r\n\r\n# 2. Generate contingency table\r\nfrom landuse_intensity import ContingencyTable\r\nct = ContingencyTable.from_rasters(raster1, raster2)\r\n\r\n# 3. Perform intensity analysis\r\nfrom landuse_intensity import IntensityAnalyzer\r\nanalyzer = IntensityAnalyzer(ct)\r\nresults = analyzer.full_analysis()\r\n\r\n# 4. Create visualizations\r\nfrom landuse_intensity import visualization as viz\r\nviz.plot_single_step_sankey(ct.table, title=\"Land Use Transitions\")\r\nviz.plot_transition_matrix_heatmap(ct.table, title=\"Transition Matrix\")\r\n\r\n# 5. Generate change maps\r\nfrom landuse_intensity import image_processing\r\nchange_map = image_processing.calculate_change_map(raster1, raster2)\r\n\r\n# 6. Export results\r\nct.table.to_csv(\"contingency_table.csv\")\r\n```\r\n\r\n## Examples\r\n\r\nThe library includes comprehensive examples demonstrating various land use analysis capabilities:\r\n\r\n```python\r\n# Basic intensity analysis example\r\nimport numpy as np\r\nimport landuse_intensity as lui\r\n\r\n# Generate demo data\r\nraster_t1, raster_t2 = lui.demo_landscape()\r\n\r\n# Create contingency table\r\nct = lui.ContingencyTable.from_rasters(raster_t1, raster_t2)\r\n\r\n# Perform intensity analysis\r\nanalyzer = lui.IntensityAnalyzer(ct)\r\nresults = analyzer.full_analysis()\r\n\r\n# Create visualizations\r\nimport landuse_intensity.visualization as viz\r\nviz.plot_single_step_sankey(ct.table, title=\"Land Use Transitions\")\r\nviz.plot_transition_matrix_heatmap(ct.table, title=\"Transition Matrix\")\r\n\r\nprint(f\"Analysis completed! Total change: {ct.total_change} pixels\")\r\n```\r\n\r\n## Contributing\r\n\r\nWe welcome contributions! Please see our GitHub repository for details on contributing to the project.\r\n\r\n## License\r\n\r\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\r\n\r\n## Citation\r\n\r\nIf you use this library in your research, please cite:\r\n\r\n```bibtex\r\n@software{landuse_intensity_analysis,\r\n title = {Land Use Intensity Analysis},\r\n author = {LandUse Intensity Analysis Contributors},\r\n url = {https://github.com/your-repo/landuse-intensity-analysis},\r\n version = {1.0.3a1},\r\n date = {2024}\r\n}\r\n```\r\n\r\n## Support\r\n\r\n- **Documentation**: [Read the Docs](https://landuse-intensity-analysis.readthedocs.io/)\r\n- **Issues**: [GitHub Issues](https://github.com/your-repo/landuse-intensity-analysis/issues)\r\n- **Discussions**: [GitHub Discussions](https://github.com/your-repo/landuse-intensity-analysis/discussions)\r\n\r\n## Related Projects\r\n\r\n- [Pontius Research Group](https://www.clarku.edu/departments/geography/pontius/): Original methodology developers\r\n- [GDAL](https://gdal.org/): Geospatial data processing\r\n- [Rasterio](https://rasterio.readthedocs.io/): Python geospatial raster processing\r\n- [Xarray](https://xarray.pydata.org/): N-dimensional arrays for Python\r\n\r\n<!-- Test commit for workflow validation -->\r\n",
"bugtrack_url": null,
"license": null,
"summary": "Modernized Python library for scientifically rigorous land use change analysis with intelligent auto-detection, comprehensive customization, and streamlined processing pipeline. Features automatic year detection from filenames and complete configuration framework.",
"version": "2.0.0a2",
"project_urls": {
"Bug Tracker": "https://github.com/ils15/LandUse-Intensity-Analysis/issues",
"Changelog": "https://github.com/ils15/LandUse-Intensity-Analysis/blob/main/CHANGELOG.md",
"Documentation": "https://landuse-intensity-analysis.readthedocs.io",
"Homepage": "https://github.com/ils15/LandUse-Intensity-Analysis",
"Repository": "https://github.com/ils15/LandUse-Intensity-Analysis"
},
"split_keywords": [
"land-use",
" intensity-analysis",
" pontius",
" aldwaik",
" remote-sensing",
" gis",
" land-change",
" spatial-analysis",
" environmental-science"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "0be92eb349e69ec1f78c968ebefa330613eaad39d5e03ee664185021413281e3",
"md5": "500bfe4f096991bc38ec1f4ff0a1ac1d",
"sha256": "ddb30d353dea3018d00c9ea8575454f6560fff6d452d628e711465daa2f7a4b6"
},
"downloads": -1,
"filename": "landuse_intensity_analysis-2.0.0a2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "500bfe4f096991bc38ec1f4ff0a1ac1d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 60672,
"upload_time": "2025-08-29T18:29:54",
"upload_time_iso_8601": "2025-08-29T18:29:54.294298Z",
"url": "https://files.pythonhosted.org/packages/0b/e9/2eb349e69ec1f78c968ebefa330613eaad39d5e03ee664185021413281e3/landuse_intensity_analysis-2.0.0a2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-29 18:29:54",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ils15",
"github_project": "LandUse-Intensity-Analysis",
"github_not_found": true,
"lcname": "landuse-intensity-analysis"
}