-
Notifications
You must be signed in to change notification settings - Fork 0
Visualization & Export
PlanetScope-py provides enhanced visualization and export capabilities with coordinate system fixes, increased scene footprint limits, and one-line functions for rapid visualization generation.
Fixed coordinate system display - No more mirrored/flipped maps
Increased scene footprint limits - 150+ default (up to 1000+)
One-line visualization functions - Individual plot generation
Enhanced ROI clipping - Proper polygon-shaped outputs
Dynamic histogram bins - Automatic bin calculation
Robust GeoTIFF export - With QGIS styling and coordinate fixes
from planetscope_py import quick_planet_analysis
# Complete analysis with enhanced visualization
result = quick_planet_analysis(milan_roi, "last_month")
# Automatically creates 4-panel summary plot with coordinate fixesfrom planetscope_py import plot_density_map_only, plot_footprints_only, export_geotiff_only
# Just density map (coordinate-corrected)
fig = plot_density_map_only(milan_roi, "last_month", "density.png")
# Just scene footprints (enhanced limits)
fig = plot_footprints_only(milan_roi, "last_month", max_scenes=500)
# Just GeoTIFF export (with QML styling)
success = export_geotiff_only(milan_roi, "last_month", "output.tif")The enhanced create_summary_plot() generates a comprehensive visualization with coordinate system fixes:
- Density Map: Spatial distribution with corrected orientation
- Density Distribution: Histogram with dynamic bins
- Statistics Summary: Enhanced metrics table
- Scene Footprints: Scene boundaries with increased limits (150+)
from planetscope_py.visualization import DensityVisualizer
result = quick_planet_analysis(milan_roi, "last_month")
visualizer = DensityVisualizer()
fig = visualizer.create_summary_plot(
density_result=result['density_result'],
roi_polygon=milan_roi,
save_path="enhanced_summary.png",
max_scenes_footprint=300, # Enhanced: increased from 50
show_plot=True # Fixed: proper notebook display
)# Advanced options with coordinate fixes
fig = visualizer.create_summary_plot(
density_result=result['density_result'],
roi_polygon=roi,
scene_polygons=result['scene_polygons'],
save_path="custom_analysis.png",
clip_to_roi=True, # Enhanced: proper polygon clipping
max_scenes_footprint=500, # Enhanced: up to 1000+
show_plot=True
)from planetscope_py import plot_density_map_only
# One-line density map with coordinate fixes
fig = plot_density_map_only(
milan_roi, "last_month",
save_path="density.png",
resolution=30,
clip_to_roi=True
)from planetscope_py import plot_footprints_only
# Enhanced footprint plot with increased limits
fig = plot_footprints_only(
milan_roi, "last_month",
save_path="footprints.png",
max_scenes=500 # Enhanced: up to 1000+
)from planetscope_py import plot_histogram_only
# Dynamic histogram with proper bins
fig = plot_histogram_only(
milan_roi, "last_month",
save_path="histogram.png",
clip_to_roi=True
)from planetscope_py import export_geotiff_only
# Enhanced export with coordinate fixes
success = export_geotiff_only(
milan_roi, "last_month",
output_path="density.tif",
clip_to_roi=True
)
# Automatically creates:
# - density.tif (GeoTIFF with coordinate fixes)
# - density.qml (QGIS style file)The exported GeoTIFF includes:
- Coordinate System: Fixed orientation and proper CRS handling
- Spatial Reference: WGS84 (EPSG:4326) with PROJ error handling
- Data Type: 32-bit floating point
- NoData Value: -9999 for areas outside ROI
- Compression: LZW compression for smaller files
- Enhanced Metadata: Method, resolution, coordinate fixes applied
# Advanced export with custom styling
from planetscope_py.visualization import DensityVisualizer
result = quick_planet_analysis(milan_roi, "last_month")
visualizer = DensityVisualizer()
visualizer.export_density_geotiff_with_style(
density_result=result['density_result'],
output_path="enhanced_density.tif",
roi_polygon=milan_roi,
clip_to_roi=True, # Enhanced: proper polygon clipping
colormap="viridis"
)# Use enhanced visualization functions with results
result = quick_planet_analysis(milan_roi, "last_month")
from planetscope_py.visualization import plot_density_only, plot_footprints_only
# Individual plots from results (coordinate-corrected)
plot_density_only(result['density_result'], milan_roi, "density.png")
plot_footprints_only(result['scene_polygons'], milan_roi, "footprints.png", max_scenes=300)# Enhanced histogram with dynamic bins
from planetscope_py.visualization import DensityVisualizer
visualizer = DensityVisualizer()
fig = visualizer.plot_density_histogram(
density_result=result['density_result'],
roi_polygon=milan_roi,
clip_to_roi=True, # Enhanced: ROI clipping
bins=None # Enhanced: automatic bin calculation
)# Enhanced method comparison
methods = ['rasterization', 'vector_overlay']
results = {}
for method in methods:
results[method] = quick_planet_analysis(
milan_roi, "last_month",
method=method,
max_scenes_footprint=200
)
# Compare with coordinate fixes
fig, axes = plt.subplots(1, len(methods), figsize=(15, 6))
for i, (method, result) in enumerate(results.items()):
# Enhanced visualization with coordinate fixes
plot_density_only(result['density_result'], milan_roi, show_plot=False)# Enhanced export with error handling
def robust_export(density_result, output_path, roi_polygon=None):
"""Enhanced export with coordinate fixes and error handling."""
from planetscope_py.workflows import export_density_geotiff_robust
success = export_density_geotiff_robust(
density_result, output_path,
roi_polygon=roi_polygon,
clip_to_roi=True
)
if success:
print(f"Enhanced GeoTIFF exported: {output_path}")
print(f"QML style file: {output_path.replace('.tif', '.qml')}")
return success# Export enhanced statistics
import pandas as pd
result = quick_planet_analysis(milan_roi, "last_month")
# Enhanced statistics DataFrame
stats_df = pd.DataFrame([{
'method': 'enhanced_rasterization',
'coordinate_fixes_applied': True,
'resolution_m': result['summary']['analysis_resolution_m'],
'scenes_found': result['scenes_found'],
'mean_density': result['summary']['mean_density'],
'max_density': result['summary']['max_density'],
'computation_time_s': result['summary']['computation_time_s'],
'max_scenes_displayed': result['summary']['max_scenes_displayed']
}])
stats_df.to_csv('enhanced_analysis_stats.csv', index=False)from planetscope_py.visualization import batch_plot_generation
# Enhanced batch visualization with increased limits
results_list = [result1, result2, result3]
roi_list = [roi1, roi2, roi3]
plot_paths = batch_plot_generation(
results_list, roi_list,
output_dir="./enhanced_batch_plots",
max_scenes_per_plot=300, # Enhanced: increased from 50
clip_to_roi=True,
coordinate_fixes=True
)# Enhanced validation with coordinate system checks
def validate_enhanced_results(result, milan_roi):
"""Validate results with coordinate system checks."""
# Check coordinate system fixes
if hasattr(result['density_result'], 'coordinate_fixes_applied'):
print("✓ Coordinate system fixes applied")
# Check scene footprint limits
scenes_displayed = result['summary'].get('max_scenes_displayed', 0)
if scenes_displayed >= 150:
print(f"✓ Enhanced scene limits: {scenes_displayed} scenes")
# Check ROI clipping
if result['summary'].get('coordinate_system_corrected', False):
print("✓ Enhanced ROI clipping applied")
return True
# Validate results
validate_enhanced_results(result, milan_roi)| Visualization Type | Enhanced Method | Performance |
|---|---|---|
| Quick summary | quick_planet_analysis() |
1-line execution |
| Individual plots | One-line functions | Optimized rendering |
| Large scene counts | max_scenes=1000 |
Enhanced limits |
| High resolution | Coordinate fixes | Corrected display |
| Batch processing | Enhanced batch functions | Parallel processing |
# Enhanced memory-efficient visualization
result = quick_planet_analysis(
large_roi, "last_month",
resolution=100.0, # Coarser resolution for large areas
max_scenes_footprint=300, # Reasonable scene limit
clip_to_roi=True # Enhanced: reduce memory usage
)# Issue: Coordinate system display problems
# Solution: Enhanced coordinate fixes are automatic
# Issue: Too many scenes to display
# Solution: Enhanced scene limits (up to 1000+)
fig = plot_footprints_only(roi, "last_month", max_scenes=1000)
# Issue: PROJ database errors
# Solution: Enhanced error handling in GeoTIFF export
success = export_geotiff_only(roi, "last_month", "output.tif")
# Automatically handles PROJ compatibility issues
# Issue: Histogram showing fixed ranges
# Solution: Enhanced dynamic bin calculation (automatic)from planetscope_py.visualization import DensityVisualizer
# Initialize with custom settings
visualizer = DensityVisualizer(
figsize=(12, 8) # Figure size in inches (default: (12, 8))
)
# Matplotlib style configuration (automatic)
# plt.rcParams["figure.dpi"] = 100 # Display DPI (default: 100)
# plt.rcParams["savefig.dpi"] = 300 # Save DPI (default: 300)
# plt.rcParams["font.size"] = 10 # Font size (default: 10)# Density map configuration
density_options = {
'roi_polygon': roi, # ROI polygon (optional)
'title': 'Scene Density Map', # Plot title (default: auto-generated)
'colormap': 'viridis', # Colormap (default: 'viridis')
'save_path': 'density.png', # Save path (optional)
'show_stats': True, # Show statistics (default: True)
'clip_to_roi': True, # Clip to ROI (default: True)
'show_plot': True # Display plot (default: True)
}
# Histogram configuration
histogram_options = {
'bins': None, # Number of bins (default: auto-calculated)
'title': 'Density Distribution', # Plot title
'save_path': 'histogram.png', # Save path (optional)
'clip_to_roi': True, # Clip data to ROI (default: True)
'show_plot': True # Display plot (default: True)
}
# Scene footprints configuration
footprints_options = {
'title': 'Scene Footprints', # Plot title
'max_scenes': 300, # Max scenes to display (default: 150)
'save_path': 'footprints.png', # Save path (optional)
'show_intersecting_only': True, # Only ROI-intersecting scenes (default: True)
'show_all_if_requested': False, # Show all if reasonable (default: False)
'show_plot': True # Display plot (default: True)
}
# Summary plot configuration
summary_options = {
'save_path': 'summary.png', # Save path (optional)
'clip_to_roi': True, # Clip outputs to ROI (default: True)
'max_scenes_footprint': 300, # Max scenes in footprint panel (default: 150)
'show_plot': True # Display plot (default: True)
}# plot_density_map_only parameters
density_params = {
'time_period': "last_month", # Time period (default: "last_month")
'save_path': None, # Save path (optional)
'resolution': 30.0, # Grid resolution (default: 30.0)
'cloud_cover_max': 0.2, # Max cloud cover (default: 0.2)
'clip_to_roi': True, # Clip to ROI (default: True)
'colormap': 'viridis' # Colormap (default: 'viridis')
}
# plot_footprints_only parameters
footprints_params = {
'time_period': "last_month", # Time period (default: "last_month")
'save_path': None, # Save path (optional)
'max_scenes': 300, # Max scenes (default: 300)
'show_intersecting_only': True # Only intersecting scenes (default: True)
}
# export_geotiff_only parameters
export_params = {
'time_period': "last_month", # Time period (default: "last_month")
'output_path': "density.tif", # Output path (default: "density.tif")
'clip_to_roi': True, # Clip to ROI (default: True)
'resolution': 30.0, # Grid resolution (default: 30.0)
'colormap': 'viridis' # QML colormap (default: 'viridis')
}# Enhanced GeoTIFF export options
export_config = {
'output_path': 'density.tif', # Output file path
'roi_polygon': roi, # ROI for clipping (optional)
'clip_to_roi': True, # Clip to ROI shape (default: True)
'colormap': 'viridis', # QGIS style colormap (default: 'viridis')
'compress': 'lzw', # Compression method (default: 'lzw')
'no_data_value': -9999.0, # NoData value (default: -9999.0)
'create_qml': True # Create QML style file (default: True)
}
# File properties (automatic)
file_properties = {
'driver': 'GTiff', # File format
'dtype': 'float32', # Data type
'crs': 'EPSG:4326', # Coordinate system (with fallbacks)
'tiled': True, # Tiled format for large files
'blocksize': 512 # Tile size in pixels
}# batch_plot_generation parameters
batch_config = {
'output_dir': "./batch_plots", # Output directory (default: "./batch_plots")
'max_scenes_per_plot': 300, # Max scenes per plot (default: 200)
'clip_to_roi': True, # Clip all outputs (default: True)
'coordinate_fixes': True, # Apply coordinate fixes (default: True)
'parallel_processing': True # Parallel generation (default: True)
}| Parameter | Type | Default | Options | Description |
|---|---|---|---|---|
figsize |
tuple | (12, 8) | Any tuple | Figure size in inches |
colormap |
str | "viridis" | matplotlib colormaps | Color scheme |
title |
str | Auto | Any string | Plot title |
save_path |
str | None | File path | Save location |
show_stats |
bool | True | True/False | Display statistics |
clip_to_roi |
bool | True | True/False | Clip to ROI shape |
show_plot |
bool | True | True/False | Display in notebook |
max_scenes |
int | 150-300 | 1-1000+ | Max scenes in footprint plots |
| Parameter | Type | Default | Options | Description |
|---|---|---|---|---|
output_path |
str | Required | File path | Output file location |
clip_to_roi |
bool | True | True/False | Clip to ROI polygon |
colormap |
str | "viridis" | matplotlib colormaps | QML style colormap |
compress |
str | "lzw" | lzw/deflate/none | Compression method |
no_data_value |
float | -9999.0 | Any float | NoData value |
create_qml |
bool | True | True/False | Create QGIS style file |
| Function | Default Limit | Maximum | Enhanced Feature |
|---|---|---|---|
plot_footprints_only |
300 | 1000+ | Increased from 50 |
create_summary_plot |
150 | 1000+ | Configurable limits |
batch_plot_generation |
200 | 1000+ | Per-plot limits |
| Scene discovery | No limit | API limits | All available scenes |
| Format | Example | Description |
|---|---|---|
| Shortcuts | "last_month" | Previous 30 days |
| Shortcuts | "last_3_months" | Previous 90 days |
| Date range | "2025-01-01/2025-01-31" | Custom date range |
| Tuple | ("2025-01-01", "2025-01-31") | Date tuple |
# Error handling options (automatic)
error_config = {
'proj_fallback': True, # Handle PROJ errors (default: True)
'coordinate_validation': True, # Validate coordinates (default: True)
'memory_monitoring': True, # Monitor memory usage (default: True)
'geometry_validation': True, # Validate geometries (default: True)
'graceful_degradation': True # Fallback options (default: True)
}- Spatial Density Analysis: Return to main analysis guide
- Computational Methods: Understanding enhanced methods
- High Resolution Analysis: Advanced techniques with coordinate fixes
- Performance Optimization: Enhanced optimization strategies
Getting Started
Core Features
- Scene Discovery
- Metadata Analysis
- Spatial Density Analysis and Visualization
- Rate Limiting & Performance
Advanced Analysis
Integration Workflows
Examples & Tutorials
API Reference
Support