commit
|
|
@ -0,0 +1,17 @@
|
||||||
|
version: "2"
|
||||||
|
|
||||||
|
build:
|
||||||
|
os: "ubuntu-22.04"
|
||||||
|
tools:
|
||||||
|
python: "3.10"
|
||||||
|
|
||||||
|
python:
|
||||||
|
install:
|
||||||
|
- requirements: docs/requirements.txt
|
||||||
|
|
||||||
|
sphinx:
|
||||||
|
configuration: docs/conf.py
|
||||||
|
|
||||||
|
formats:
|
||||||
|
- epub
|
||||||
|
- pdf
|
||||||
|
|
@ -0,0 +1,241 @@
|
||||||
|
# Accordion Stories
|
||||||
|
|
||||||
|
Create narrative content with expandable sections that can include maps, datasets, and rich text.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Accordion Stories provide a storytelling interface with expandable sections. Each section can contain rich HTML content, embedded maps, and linked datasets, making them ideal for creating interactive narratives and guided explorations.
|
||||||
|
|
||||||
|
## Creating Accordion Stories
|
||||||
|
|
||||||
|
### Access
|
||||||
|
|
||||||
|
- Navigate to Accordion Stories (`accordion_stories.php`)
|
||||||
|
- Publishers and admins can create stories
|
||||||
|
- Users can view stories they have access to
|
||||||
|
|
||||||
|
### Story Structure
|
||||||
|
|
||||||
|
Stories consist of:
|
||||||
|
- **Title**: Story title
|
||||||
|
- **Description**: Story description
|
||||||
|
- **Sections**: Multiple expandable sections
|
||||||
|
- **Category**: Optional categorization
|
||||||
|
- **Permissions**: Access control settings
|
||||||
|
|
||||||
|
## Sections
|
||||||
|
|
||||||
|
### Section Content
|
||||||
|
|
||||||
|
Each section can contain:
|
||||||
|
|
||||||
|
- **Title**: Section heading
|
||||||
|
- **HTML Content**: Rich text with formatting
|
||||||
|
- **Dataset Link**: Optional dataset association
|
||||||
|
- **Maps**: Embedded map displays
|
||||||
|
- **Media**: Images and other media
|
||||||
|
|
||||||
|
### Section Features
|
||||||
|
|
||||||
|
- **Expandable**: Click to expand/collapse
|
||||||
|
- **Rich Text**: HTML formatting support
|
||||||
|
- **Dataset Integration**: Link to datasets
|
||||||
|
- **Map Integration**: Display maps in sections
|
||||||
|
- **Ordering**: Custom section order
|
||||||
|
|
||||||
|
## Building Stories
|
||||||
|
|
||||||
|
### Step 1: Create Story
|
||||||
|
|
||||||
|
1. Navigate to Accordion Stories
|
||||||
|
2. Click "New Story"
|
||||||
|
3. Enter title and description
|
||||||
|
4. Select category (optional)
|
||||||
|
5. Set permissions
|
||||||
|
|
||||||
|
### Step 2: Add Sections
|
||||||
|
|
||||||
|
1. Open story builder
|
||||||
|
2. Add new section
|
||||||
|
3. Enter section title
|
||||||
|
4. Add HTML content
|
||||||
|
5. Optionally link dataset
|
||||||
|
6. Save section
|
||||||
|
|
||||||
|
### Step 3: Configure Content
|
||||||
|
|
||||||
|
1. Use rich text editor for content
|
||||||
|
2. Format text with HTML
|
||||||
|
3. Add images and media
|
||||||
|
4. Link to datasets
|
||||||
|
5. Embed maps if needed
|
||||||
|
|
||||||
|
### Step 4: Arrange Sections
|
||||||
|
|
||||||
|
1. Reorder sections by dragging
|
||||||
|
2. Set default expanded section
|
||||||
|
3. Organize narrative flow
|
||||||
|
4. Save story
|
||||||
|
|
||||||
|
## Content Editor
|
||||||
|
|
||||||
|
### Rich Text Editing
|
||||||
|
|
||||||
|
- **Formatting**: Bold, italic, underline
|
||||||
|
- **Headings**: Multiple heading levels
|
||||||
|
- **Lists**: Ordered and unordered lists
|
||||||
|
- **Links**: Hyperlinks to external content
|
||||||
|
- **Images**: Image embedding
|
||||||
|
- **Tables**: Table creation
|
||||||
|
|
||||||
|
### HTML Support
|
||||||
|
|
||||||
|
- Direct HTML editing
|
||||||
|
- Custom styling
|
||||||
|
- Embedded content
|
||||||
|
- Script integration (if allowed)
|
||||||
|
|
||||||
|
## Dataset Integration
|
||||||
|
|
||||||
|
### Linking Datasets
|
||||||
|
|
||||||
|
- **Dataset Selection**: Choose dataset to link
|
||||||
|
- **Automatic Display**: Map automatically displays linked dataset
|
||||||
|
- **Synchronization**: Section expansion shows linked data
|
||||||
|
- **Filtering**: Apply filters to linked datasets
|
||||||
|
|
||||||
|
### Map Display
|
||||||
|
|
||||||
|
When a section has a linked dataset:
|
||||||
|
- Map automatically displays dataset
|
||||||
|
- Section expansion shows map
|
||||||
|
- Map updates with section changes
|
||||||
|
- Interactive map features available
|
||||||
|
|
||||||
|
## Viewing Stories
|
||||||
|
|
||||||
|
### Story Viewer
|
||||||
|
|
||||||
|
- **Left Panel**: Accordion sections
|
||||||
|
- **Right Panel**: Map display (if dataset linked)
|
||||||
|
- **Navigation**: Expand/collapse sections
|
||||||
|
- **Responsive**: Mobile-friendly layout
|
||||||
|
|
||||||
|
### Interaction
|
||||||
|
|
||||||
|
- **Expand Sections**: Click to expand
|
||||||
|
- **Collapse Sections**: Click to collapse
|
||||||
|
- **Map Interaction**: Pan, zoom, query
|
||||||
|
- **Content Scrolling**: Scroll through content
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
### Guided Tours
|
||||||
|
|
||||||
|
- Location-based tours
|
||||||
|
- Historical narratives
|
||||||
|
- Educational content
|
||||||
|
- Story maps
|
||||||
|
|
||||||
|
### Data Narratives
|
||||||
|
|
||||||
|
- Data exploration guides
|
||||||
|
- Analysis walkthroughs
|
||||||
|
- Results presentations
|
||||||
|
- Research stories
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
- Feature documentation
|
||||||
|
- User guides
|
||||||
|
- Tutorial content
|
||||||
|
- Help systems
|
||||||
|
|
||||||
|
### Presentations
|
||||||
|
|
||||||
|
- Interactive presentations
|
||||||
|
- Conference materials
|
||||||
|
- Public engagement
|
||||||
|
- Stakeholder reports
|
||||||
|
|
||||||
|
## Permissions
|
||||||
|
|
||||||
|
### Access Control
|
||||||
|
|
||||||
|
- **Public**: Accessible to all users
|
||||||
|
- **Private**: Creator only
|
||||||
|
- **Group-based**: Shared with user groups
|
||||||
|
- **Custom**: Specific user permissions
|
||||||
|
|
||||||
|
### Editing Permissions
|
||||||
|
|
||||||
|
- **Creator**: Can edit their stories
|
||||||
|
- **Admins**: Can edit all stories
|
||||||
|
- **Publishers**: Can create and edit stories
|
||||||
|
- **Users**: Can view accessible stories
|
||||||
|
|
||||||
|
## Story Management
|
||||||
|
|
||||||
|
### Editing
|
||||||
|
|
||||||
|
- Edit story metadata
|
||||||
|
- Modify sections
|
||||||
|
- Update content
|
||||||
|
- Reorder sections
|
||||||
|
- Change permissions
|
||||||
|
|
||||||
|
### Sharing
|
||||||
|
|
||||||
|
- Share via URL
|
||||||
|
- Set public/private status
|
||||||
|
- Configure group access
|
||||||
|
- Embed in other pages
|
||||||
|
|
||||||
|
### Organization
|
||||||
|
|
||||||
|
- Categorize stories
|
||||||
|
- Tag stories
|
||||||
|
- Search stories
|
||||||
|
- Filter by category
|
||||||
|
|
||||||
|
## Example Story
|
||||||
|
|
||||||
|
A typical accordion story might include:
|
||||||
|
|
||||||
|
1. **Introduction Section**: Overview and context
|
||||||
|
2. **Data Section**: Dataset description with linked map
|
||||||
|
3. **Analysis Section**: Analysis results and findings
|
||||||
|
4. **Conclusion Section**: Summary and next steps
|
||||||
|
|
||||||
|
Each section expands to reveal content and updates the map display.
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### Content
|
||||||
|
|
||||||
|
- Write clear, engaging content
|
||||||
|
- Use appropriate section titles
|
||||||
|
- Organize content logically
|
||||||
|
- Include visual elements
|
||||||
|
|
||||||
|
### Maps
|
||||||
|
|
||||||
|
- Link relevant datasets
|
||||||
|
- Use appropriate basemaps
|
||||||
|
- Configure map styling
|
||||||
|
- Test map interactions
|
||||||
|
|
||||||
|
### Navigation
|
||||||
|
|
||||||
|
- Set logical section order
|
||||||
|
- Use descriptive titles
|
||||||
|
- Provide clear navigation
|
||||||
|
- Test user experience
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Dashboard](dashboard.md)
|
||||||
|
- [Web Apps](web-apps.md)
|
||||||
|
- [Dataset Viewer](../ui/dataset-viewer.md)
|
||||||
|
- [Map Viewer](../ui/map-viewer.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
# Buffer Analysis
|
||||||
|
|
||||||
|
Create buffer zones around features at specified distances.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Buffer analysis creates zones around features at specified distances, useful for proximity analysis and impact assessment.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Dataset**: Any vector dataset
|
||||||
|
- **Distance**: Buffer distance in dataset units
|
||||||
|
- **End Cap Style**: Round or flat
|
||||||
|
- **Dissolve**: Merge overlapping buffers
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New polygon dataset containing:
|
||||||
|
|
||||||
|
- Buffer zones around input features
|
||||||
|
- Original feature attributes
|
||||||
|
- Buffer distance information
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"distance": 1000,
|
||||||
|
"dissolve": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Service area analysis
|
||||||
|
- Impact zone identification
|
||||||
|
- Proximity analysis
|
||||||
|
- Safety zone mapping
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Distance units match dataset SRID
|
||||||
|
- Dissolving reduces output complexity
|
||||||
|
- Multiple distances can be applied
|
||||||
|
- Buffers around lines create polygons
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
# Clip Analysis
|
||||||
|
|
||||||
|
Extract features from a dataset that intersect with a clipping boundary.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Clip analysis extracts features that intersect with a clipping boundary, creating a subset of the input dataset.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Dataset**: Dataset to clip
|
||||||
|
- **Clip Geometry**: GeoJSON geometry for clipping boundary
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New dataset containing:
|
||||||
|
|
||||||
|
- Features that intersect the boundary
|
||||||
|
- Geometry clipped to boundary
|
||||||
|
- Original attributes preserved
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"clip_geometry": {
|
||||||
|
"type": "Polygon",
|
||||||
|
"coordinates": [ ... ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. See [Clip Worker](../workers/clip.md) for details.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Study area extraction
|
||||||
|
- Boundary-based filtering
|
||||||
|
- Area of interest analysis
|
||||||
|
- Data subset creation
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Only intersecting features included
|
||||||
|
- Geometry clipped to boundary
|
||||||
|
- Attributes preserved
|
||||||
|
- Processing time depends on dataset size
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Clip Worker](../workers/clip.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,69 @@
|
||||||
|
# Clustering
|
||||||
|
|
||||||
|
Group features based on spatial proximity using clustering algorithms.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Clustering groups nearby features into clusters, identifying spatial patterns and groupings in point data.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Dataset**: Point dataset
|
||||||
|
- **Method**: Clustering algorithm
|
||||||
|
- **Parameters**: Algorithm-specific parameters
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New dataset containing:
|
||||||
|
|
||||||
|
- Original features
|
||||||
|
- **Cluster ID**: Assigned cluster identifier
|
||||||
|
- **Cluster Size**: Number of features in cluster
|
||||||
|
- Original attributes
|
||||||
|
|
||||||
|
## Algorithms
|
||||||
|
|
||||||
|
### K-Means Clustering
|
||||||
|
|
||||||
|
Groups points into k clusters by minimizing within-cluster variance.
|
||||||
|
|
||||||
|
### DBSCAN
|
||||||
|
|
||||||
|
Density-based clustering that identifies clusters of varying shapes.
|
||||||
|
|
||||||
|
### Hierarchical Clustering
|
||||||
|
|
||||||
|
Builds cluster hierarchy using distance measures.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"method": "kmeans",
|
||||||
|
"k": 5
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Market segmentation
|
||||||
|
- Service area identification
|
||||||
|
- Pattern recognition
|
||||||
|
- Data exploration
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Algorithm selection depends on data characteristics
|
||||||
|
- Parameter tuning affects results
|
||||||
|
- Results may vary with different random seeds
|
||||||
|
- Consider spatial scale when interpreting clusters
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
# Dissolve Analysis
|
||||||
|
|
||||||
|
Merge features based on attribute values, optionally aggregating numeric fields.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Dissolve analysis merges adjacent or overlapping features that share the same attribute value, creating simplified datasets.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Source Dataset**: Dataset to dissolve
|
||||||
|
- **Dissolve Field**: Field to dissolve on (or merge all)
|
||||||
|
- **Aggregation Fields** (optional): Fields to aggregate with functions
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New dataset containing:
|
||||||
|
|
||||||
|
- Merged geometries for each group
|
||||||
|
- Aggregated attribute values
|
||||||
|
- Group identifiers
|
||||||
|
|
||||||
|
## Aggregation Functions
|
||||||
|
|
||||||
|
- **Sum**: Sum of numeric values
|
||||||
|
- **Average**: Average of numeric values
|
||||||
|
- **Min/Max**: Minimum/maximum values
|
||||||
|
- **Count**: Count of features
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"source_dataset_id": 123,
|
||||||
|
"dissolve_field": "category",
|
||||||
|
"aggregation_fields": {
|
||||||
|
"population": "sum",
|
||||||
|
"area": "sum"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. See [Dissolve Worker](../workers/dissolve.md) for details.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Administrative boundary simplification
|
||||||
|
- Aggregated statistics
|
||||||
|
- Data generalization
|
||||||
|
- Map simplification
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Adjacent features are merged
|
||||||
|
- Aggregation required for numeric fields
|
||||||
|
- Complex geometries may slow processing
|
||||||
|
- Results depend on dissolve field values
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Dissolve Worker](../workers/dissolve.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
# Erase Analysis
|
||||||
|
|
||||||
|
Remove portions of features from an input dataset that overlap with an erase dataset.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Erase analysis removes portions of input features that overlap with erase features, creating new geometries.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Input Dataset**: Dataset to erase from
|
||||||
|
- **Erase Dataset**: Dataset to erase with
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New dataset containing:
|
||||||
|
|
||||||
|
- Features with erased portions removed
|
||||||
|
- Remaining geometry after erase
|
||||||
|
- Original attributes preserved
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"input_dataset_id": 123,
|
||||||
|
"erase_dataset_id": 124
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. See [Erase Analysis Worker](../workers/erase_analysis.md) for details.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Exclusion zone mapping
|
||||||
|
- Feature subtraction
|
||||||
|
- Boundary modification
|
||||||
|
- Area calculations
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Overlapping portions are removed
|
||||||
|
- Non-overlapping features preserved
|
||||||
|
- Complex geometries may slow processing
|
||||||
|
- Results depend on overlap extent
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Erase Analysis Worker](../workers/erase_analysis.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
# Hot Spot Analysis
|
||||||
|
|
||||||
|
Identify statistically significant clusters of high and low values using Getis-Ord Gi* statistics.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Hot spot analysis uses the Getis-Ord Gi* statistic to identify statistically significant spatial clusters. Features are classified as:
|
||||||
|
|
||||||
|
- **99% Hot Spot**: Very high values, 99% confidence
|
||||||
|
- **95% Hot Spot**: High values, 95% confidence
|
||||||
|
- **90% Hot Spot**: High values, 90% confidence
|
||||||
|
- **Not Significant**: No significant clustering
|
||||||
|
- **90% Cold Spot**: Low values, 90% confidence
|
||||||
|
- **95% Cold Spot**: Low values, 95% confidence
|
||||||
|
- **99% Cold Spot**: Very low values, 99% confidence
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Dataset**: Point or polygon dataset
|
||||||
|
- **Value Field**: Numeric field to analyze
|
||||||
|
- **Neighbor Type**: Distance-based or K-nearest neighbors
|
||||||
|
- **Distance** (if distance-based): Maximum neighbor distance
|
||||||
|
- **K Neighbors** (if KNN): Number of nearest neighbors
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New dataset containing:
|
||||||
|
|
||||||
|
- Original geometry
|
||||||
|
- **Gi* Z-Score**: Standardized z-score
|
||||||
|
- **P-Value**: Statistical significance
|
||||||
|
- **Hot Spot Class**: Categorized class
|
||||||
|
- Original attributes
|
||||||
|
|
||||||
|
## Algorithm
|
||||||
|
|
||||||
|
1. Calculate spatial weights matrix based on neighbor configuration
|
||||||
|
2. Compute Getis-Ord Gi* statistic for each feature
|
||||||
|
3. Calculate z-scores and p-values
|
||||||
|
4. Categorize into hot spot classes
|
||||||
|
5. Store results in output dataset
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"value_field": "population",
|
||||||
|
"neighbor_type": "distance",
|
||||||
|
"distance": 1000
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. See [Hot Spot Analysis Worker](../workers/hotspot_analysis.md) for details.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Crime analysis
|
||||||
|
- Disease clustering
|
||||||
|
- Economic activity patterns
|
||||||
|
- Environmental monitoring
|
||||||
|
- Social phenomena analysis
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Requires numeric field with sufficient variation
|
||||||
|
- Distance should be appropriate for data scale
|
||||||
|
- KNN method is generally faster for large datasets
|
||||||
|
- Results depend on neighbor configuration
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Hot Spot Analysis Worker](../workers/hotspot_analysis.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Live Hot Spot Analysis](hotspot-live.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
# Analysis Tools
|
||||||
|
|
||||||
|
Aurora GIS provides a comprehensive suite of spatial analysis tools for vector and raster data.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Analysis tools are organized into categories:
|
||||||
|
|
||||||
|
- **Proximity Analysis**: Buffer, nearest neighbor, distance calculations
|
||||||
|
- **Overlay Operations**: Intersect, union, erase, join operations
|
||||||
|
- **Spatial Analysis**: Hot spots, outliers, KDE, clustering
|
||||||
|
- **Raster Analysis**: Zonal statistics, raster operations
|
||||||
|
- **Feature Analysis**: Summarization and aggregation
|
||||||
|
|
||||||
|
## Vector Analysis Tools
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
hotspot
|
||||||
|
outliers
|
||||||
|
kde
|
||||||
|
clustering
|
||||||
|
buffer
|
||||||
|
nearest
|
||||||
|
intersect
|
||||||
|
join
|
||||||
|
dissolve
|
||||||
|
erase
|
||||||
|
clip
|
||||||
|
summarize
|
||||||
|
```
|
||||||
|
|
||||||
|
## Raster Analysis Tools
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
zonal-stats
|
||||||
|
raster-histogram
|
||||||
|
raster-summary
|
||||||
|
raster-profile
|
||||||
|
raster-conversion
|
||||||
|
raster-comparison
|
||||||
|
```
|
||||||
|
|
||||||
|
## Running Analysis
|
||||||
|
|
||||||
|
Analysis tools can be run via:
|
||||||
|
|
||||||
|
1. **Web Interface**: Use the analysis panels in the map viewer
|
||||||
|
2. **API**: Make POST requests to analysis endpoints
|
||||||
|
3. **Batch Tools**: Use the batch analysis interface
|
||||||
|
|
||||||
|
## Background Processing
|
||||||
|
|
||||||
|
Most analysis operations run as background jobs:
|
||||||
|
|
||||||
|
1. Analysis request creates a job in the queue
|
||||||
|
2. Worker processes the job asynchronously
|
||||||
|
3. Results are stored in a new dataset
|
||||||
|
4. User is notified when complete
|
||||||
|
|
||||||
|
## Output Formats
|
||||||
|
|
||||||
|
Analysis results can be stored as:
|
||||||
|
|
||||||
|
- **Static Table**: Permanent table with results
|
||||||
|
- **View**: Database view that updates with source data
|
||||||
|
- **Materialized View**: Materialized view requiring refresh
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Workers](../workers/index.md)
|
||||||
|
- [API Documentation](../api/index.md)
|
||||||
|
- [Architecture Overview](../architecture.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
# Intersect Analysis
|
||||||
|
|
||||||
|
Find features that intersect between two datasets.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Intersect analysis identifies features that spatially overlap between two datasets, creating new features at intersection locations.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Input Dataset**: Primary dataset
|
||||||
|
- **Intersect Dataset**: Dataset to intersect with
|
||||||
|
- **Output Type**: Intersection geometry type
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New dataset containing:
|
||||||
|
|
||||||
|
- Intersecting features
|
||||||
|
- Attributes from both datasets
|
||||||
|
- Intersection geometry
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"input_dataset_id": 123,
|
||||||
|
"intersect_dataset_id": 124
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Overlay analysis
|
||||||
|
- Spatial filtering
|
||||||
|
- Feature extraction
|
||||||
|
- Area calculations
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Output geometry type depends on input types
|
||||||
|
- Attributes from both datasets are included
|
||||||
|
- Empty intersections are excluded
|
||||||
|
- Processing time depends on dataset sizes
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
# Join Features
|
||||||
|
|
||||||
|
Attach attributes from a target dataset to a source dataset based on spatial relationships.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Join features attaches attributes from a target dataset to features in a source dataset based on spatial relationships (intersect, within, contains, etc.).
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Source Dataset**: Dataset to join to
|
||||||
|
- **Target Dataset**: Dataset to join from
|
||||||
|
- **Spatial Relationship**: Intersect, within, contains, etc.
|
||||||
|
- **Aggregation** (optional): Aggregation functions for multiple matches
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New dataset containing:
|
||||||
|
|
||||||
|
- Source feature geometry
|
||||||
|
- Attributes from both datasets
|
||||||
|
- Aggregated values (if aggregation specified)
|
||||||
|
|
||||||
|
## Aggregation Functions
|
||||||
|
|
||||||
|
- **Sum**: Sum of numeric values
|
||||||
|
- **Average**: Average of numeric values
|
||||||
|
- **Count**: Count of matching features
|
||||||
|
- **Min/Max**: Minimum/maximum values
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"source_dataset_id": 123,
|
||||||
|
"target_dataset_id": 124,
|
||||||
|
"relationship": "intersect",
|
||||||
|
"aggregation": {
|
||||||
|
"population": "sum"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Attribute enrichment
|
||||||
|
- Spatial data integration
|
||||||
|
- Aggregated statistics
|
||||||
|
- Data combination
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Multiple target features can match one source feature
|
||||||
|
- Aggregation required for multiple matches
|
||||||
|
- Spatial relationship affects results
|
||||||
|
- Processing time depends on dataset sizes
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
# Kernel Density Estimation (KDE)
|
||||||
|
|
||||||
|
Generate density surfaces from point data using kernel density estimation.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
KDE creates a continuous density surface from point data, showing where points are concentrated. Higher values indicate greater point density.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Dataset**: Point dataset
|
||||||
|
- **Bandwidth**: Smoothing parameter (default: auto-calculated)
|
||||||
|
- **Cell Size**: Output raster cell size (default: auto-calculated)
|
||||||
|
- **Weight Field** (optional): Field to weight points
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
Raster dataset containing:
|
||||||
|
|
||||||
|
- Density values for each cell
|
||||||
|
- Higher values indicate greater point density
|
||||||
|
- Proper spatial reference
|
||||||
|
|
||||||
|
## Algorithm
|
||||||
|
|
||||||
|
1. Calculate optimal bandwidth (if not specified)
|
||||||
|
2. Create output raster grid
|
||||||
|
3. For each cell, calculate kernel-weighted sum of nearby points
|
||||||
|
4. Store density values in raster
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"bandwidth": 1000,
|
||||||
|
"cell_size": 100
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Population density mapping
|
||||||
|
- Crime hotspot visualization
|
||||||
|
- Species distribution modeling
|
||||||
|
- Event density analysis
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Bandwidth controls smoothing (larger = smoother)
|
||||||
|
- Cell size controls output resolution
|
||||||
|
- Weight field allows importance weighting
|
||||||
|
- Results are sensitive to bandwidth selection
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Raster Tools](raster.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
# Nearest Neighbor Analysis
|
||||||
|
|
||||||
|
Find nearest features from a target dataset for each feature in a source dataset.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Nearest neighbor analysis identifies the closest features between two datasets, calculating distances and joining attributes.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Source Dataset**: Dataset to find nearest neighbors for
|
||||||
|
- **Target Dataset**: Dataset to search for neighbors
|
||||||
|
- **Max Distance**: Maximum search distance (optional)
|
||||||
|
- **Limit**: Maximum neighbors per feature (default: 1)
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New dataset containing:
|
||||||
|
|
||||||
|
- Source feature geometry
|
||||||
|
- Nearest target feature information
|
||||||
|
- **Distance**: Distance to nearest neighbor
|
||||||
|
- Attributes from both datasets
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"source_dataset_id": 123,
|
||||||
|
"target_dataset_id": 124,
|
||||||
|
"max_distance": 5000,
|
||||||
|
"limit": 1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. See [Nearest Analysis Worker](../workers/nearest_analysis.md) for details.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Service accessibility analysis
|
||||||
|
- Nearest facility identification
|
||||||
|
- Distance calculations
|
||||||
|
- Spatial joins
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Spatial indexes critical for performance
|
||||||
|
- Large max_distance values may slow processing
|
||||||
|
- Multiple neighbors can be found per feature
|
||||||
|
- Results include distance in dataset units
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Nearest Analysis Worker](../workers/nearest_analysis.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
# Outlier Detection
|
||||||
|
|
||||||
|
Identify statistical outliers in numeric fields using z-score or MAD methods.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Outlier detection identifies features with values that are statistically unusual compared to the dataset distribution.
|
||||||
|
|
||||||
|
## Methods
|
||||||
|
|
||||||
|
### Z-Score Method
|
||||||
|
|
||||||
|
Uses mean and standard deviation:
|
||||||
|
- Z-score = (value - mean) / standard_deviation
|
||||||
|
- Features with |z-score| > threshold are outliers
|
||||||
|
- Sensitive to outliers in calculation
|
||||||
|
|
||||||
|
### MAD Method
|
||||||
|
|
||||||
|
Uses median and median absolute deviation:
|
||||||
|
- Modified z-score = 0.6745 * (value - median) / MAD
|
||||||
|
- Features with |modified z-score| > threshold are outliers
|
||||||
|
- More robust to outliers in calculation
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Dataset**: Any dataset with numeric field
|
||||||
|
- **Value Field**: Numeric field to analyze
|
||||||
|
- **Method**: "zscore" or "mad" (default: "zscore")
|
||||||
|
- **Threshold**: Z-score threshold or MAD multiplier (default: 2.0)
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New dataset containing:
|
||||||
|
|
||||||
|
- Original features
|
||||||
|
- **Outlier Score**: Z-score or MAD score
|
||||||
|
- **Is Outlier**: Boolean flag
|
||||||
|
- Original attributes
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"value_field": "income",
|
||||||
|
"method": "zscore",
|
||||||
|
"threshold": 2.0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. See [Outlier Analysis Worker](../workers/outlier_analysis.md) for details.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Data quality assessment
|
||||||
|
- Anomaly detection
|
||||||
|
- Error identification
|
||||||
|
- Extreme value analysis
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Null values are excluded from calculations
|
||||||
|
- Threshold of 2.0 identifies ~5% of data as outliers (normal distribution)
|
||||||
|
- MAD method recommended for skewed distributions
|
||||||
|
- Consider spatial context when interpreting results
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Outlier Analysis Worker](../workers/outlier_analysis.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
# Raster Comparison
|
||||||
|
|
||||||
|
Compare two raster datasets to identify differences.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Raster comparison analyzes differences between two raster datasets, calculating change statistics and generating difference rasters.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Raster Dataset 1**: First raster dataset
|
||||||
|
- **Raster Dataset 2**: Second raster dataset
|
||||||
|
- **Comparison Method**: Difference calculation method
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
Comparison results containing:
|
||||||
|
|
||||||
|
- Difference raster
|
||||||
|
- Change statistics
|
||||||
|
- Summary report
|
||||||
|
|
||||||
|
## Comparison Methods
|
||||||
|
|
||||||
|
- **Difference**: Pixel value differences
|
||||||
|
- **Percent Change**: Percentage change
|
||||||
|
- **Ratio**: Ratio of values
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"raster_dataset_id_1": 125,
|
||||||
|
"raster_dataset_id_2": 126,
|
||||||
|
"method": "difference"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Change detection
|
||||||
|
- Time series analysis
|
||||||
|
- Quality comparison
|
||||||
|
- Validation
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Rasters must have compatible extents
|
||||||
|
- Resampling may be required
|
||||||
|
- Results depend on comparison method
|
||||||
|
- Processing time depends on raster sizes
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Raster Tools](raster.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
# Raster Conversion
|
||||||
|
|
||||||
|
Convert raster datasets between formats and data types.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Raster conversion transforms raster datasets between different formats, data types, and projections.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Raster Dataset**: Raster dataset to convert
|
||||||
|
- **Output Format**: Target format
|
||||||
|
- **Data Type**: Target data type
|
||||||
|
- **Projection** (optional): Target projection
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New raster dataset with:
|
||||||
|
|
||||||
|
- Converted format
|
||||||
|
- Specified data type
|
||||||
|
- Projected coordinates (if specified)
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"raster_dataset_id": 125,
|
||||||
|
"output_format": "GeoTIFF",
|
||||||
|
"data_type": "Float32"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Format conversion
|
||||||
|
- Data type optimization
|
||||||
|
- Projection transformation
|
||||||
|
- Compatibility preparation
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Data type conversion may affect values
|
||||||
|
- Projection transformation requires resampling
|
||||||
|
- Large rasters may take time to process
|
||||||
|
- Output format affects file size
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Raster Tools](raster.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
# Raster Histogram
|
||||||
|
|
||||||
|
Analyze pixel value distributions in raster datasets.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Raster histogram analysis generates histograms showing the distribution of pixel values in raster datasets.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Raster Dataset**: Raster dataset to analyze
|
||||||
|
- **Band** (optional): Band to analyze (default: first band)
|
||||||
|
- **Bins** (optional): Number of histogram bins
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
Histogram data containing:
|
||||||
|
|
||||||
|
- Value ranges for each bin
|
||||||
|
- Pixel counts for each bin
|
||||||
|
- Statistics (min, max, mean, median)
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"raster_dataset_id": 125,
|
||||||
|
"band": 1,
|
||||||
|
"bins": 256
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Data distribution analysis
|
||||||
|
- Quality assessment
|
||||||
|
- Value range identification
|
||||||
|
- Visualization preparation
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- NoData values excluded
|
||||||
|
- Results depend on raster data type
|
||||||
|
- Bins affect histogram resolution
|
||||||
|
- Large rasters may take time to process
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Raster Tools](raster.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
# Raster Profile
|
||||||
|
|
||||||
|
Extract pixel values along a line or path.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Raster profile extracts pixel values from a raster dataset along a specified line or path.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Raster Dataset**: Raster dataset to sample
|
||||||
|
- **Line Geometry**: GeoJSON LineString for profile path
|
||||||
|
- **Band** (optional): Band to sample (default: first band)
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
Profile data containing:
|
||||||
|
|
||||||
|
- Distance along line
|
||||||
|
- Pixel values at each point
|
||||||
|
- Coordinates
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"raster_dataset_id": 125,
|
||||||
|
"line_geometry": {
|
||||||
|
"type": "LineString",
|
||||||
|
"coordinates": [ ... ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Elevation profiles
|
||||||
|
- Transect analysis
|
||||||
|
- Cross-section extraction
|
||||||
|
- Value sampling
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Line geometry defines sampling path
|
||||||
|
- Values interpolated for sub-pixel positions
|
||||||
|
- Results include distance and values
|
||||||
|
- Processing time depends on line length
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Raster Tools](raster.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
# Raster Summary
|
||||||
|
|
||||||
|
Generate summary statistics for raster datasets.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Raster summary calculates comprehensive statistics (min, max, mean, stddev, etc.) for raster datasets.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Raster Dataset**: Raster dataset to analyze
|
||||||
|
- **Band** (optional): Band to analyze (default: all bands)
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
Summary statistics containing:
|
||||||
|
|
||||||
|
- Minimum value
|
||||||
|
- Maximum value
|
||||||
|
- Mean value
|
||||||
|
- Standard deviation
|
||||||
|
- NoData count
|
||||||
|
- Valid pixel count
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"raster_dataset_id": 125,
|
||||||
|
"band": 1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Data quality assessment
|
||||||
|
- Value range identification
|
||||||
|
- Statistics reporting
|
||||||
|
- Data exploration
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- NoData values excluded
|
||||||
|
- Statistics calculated for valid pixels only
|
||||||
|
- Large rasters may take time to process
|
||||||
|
- Results depend on raster data type
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Raster Tools](raster.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
# Summarize Within
|
||||||
|
|
||||||
|
Calculate summary statistics for features within polygon zones.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Summarize within calculates statistics (count, sum, average, etc.) for features that fall within polygon zones.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Input Dataset**: Point or line dataset to summarize
|
||||||
|
- **Zone Dataset**: Polygon dataset defining zones
|
||||||
|
- **Statistics**: Statistics to calculate
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New dataset containing:
|
||||||
|
|
||||||
|
- Zone polygons
|
||||||
|
- Summary statistics for each zone
|
||||||
|
- Zone attributes
|
||||||
|
|
||||||
|
## Statistics
|
||||||
|
|
||||||
|
- **Count**: Number of features in zone
|
||||||
|
- **Sum**: Sum of numeric values
|
||||||
|
- **Average**: Average of numeric values
|
||||||
|
- **Min/Max**: Minimum/maximum values
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"input_dataset_id": 123,
|
||||||
|
"zone_dataset_id": 124,
|
||||||
|
"statistics": ["count", "sum", "average"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Zonal statistics
|
||||||
|
- Aggregated analysis
|
||||||
|
- Summary reporting
|
||||||
|
- Data aggregation
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Features must be within zones
|
||||||
|
- Multiple statistics can be calculated
|
||||||
|
- Results depend on zone boundaries
|
||||||
|
- Processing time depends on dataset sizes
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
# Zonal Statistics
|
||||||
|
|
||||||
|
Calculate statistics for raster data within polygon zones.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Zonal statistics calculates summary statistics (mean, sum, count, etc.) for raster pixel values within polygon zones.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- **Raster Dataset**: Raster dataset to analyze
|
||||||
|
- **Zone Dataset**: Polygon dataset defining zones
|
||||||
|
- **Statistics**: Statistics to calculate
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
New dataset containing:
|
||||||
|
|
||||||
|
- Zone polygons
|
||||||
|
- Raster statistics for each zone
|
||||||
|
- Zone attributes
|
||||||
|
|
||||||
|
## Statistics
|
||||||
|
|
||||||
|
- **Mean**: Average pixel value
|
||||||
|
- **Sum**: Sum of pixel values
|
||||||
|
- **Count**: Number of pixels
|
||||||
|
- **Min/Max**: Minimum/maximum pixel values
|
||||||
|
- **StdDev**: Standard deviation of pixel values
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"raster_dataset_id": 125,
|
||||||
|
"zone_dataset_id": 123,
|
||||||
|
"statistics": ["mean", "sum", "count"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Land cover analysis
|
||||||
|
- Elevation statistics
|
||||||
|
- Climate data aggregation
|
||||||
|
- Raster value extraction
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Zones must overlap raster extent
|
||||||
|
- Statistics calculated for overlapping pixels
|
||||||
|
- NoData values excluded
|
||||||
|
- Processing time depends on raster and zone sizes
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Raster Tools](raster.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,315 @@
|
||||||
|
# Analysis API
|
||||||
|
|
||||||
|
Endpoints for running spatial analysis tools.
|
||||||
|
|
||||||
|
## Hot Spot Analysis
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/analysis_hotspot_run.php`
|
||||||
|
|
||||||
|
Run Getis-Ord Gi* hot spot analysis on a dataset.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"value_field": "population",
|
||||||
|
"neighbor_type": "distance",
|
||||||
|
"distance": 1000,
|
||||||
|
"output_mode": "static"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `dataset_id` (required): Dataset ID to analyze
|
||||||
|
- `value_field` (required): Numeric field to analyze
|
||||||
|
- `neighbor_type` (optional): "distance" or "knn" (default: "distance")
|
||||||
|
- `distance` (required if neighbor_type="distance"): Distance threshold in dataset units
|
||||||
|
- `k_neighbors` (required if neighbor_type="knn"): Number of nearest neighbors
|
||||||
|
- `output_mode` (optional): "static", "view", or "materialized_view" (default: "static")
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"job_id": 456,
|
||||||
|
"message": "Hot spot analysis job queued"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Background Job
|
||||||
|
|
||||||
|
The analysis runs as a background job. Use the `job_id` to check status via [Jobs API](jobs.md).
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X POST "https://example.com/api/analysis_hotspot_run.php" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Cookie: PHPSESSID=..." \
|
||||||
|
-d '{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"value_field": "population",
|
||||||
|
"neighbor_type": "distance",
|
||||||
|
"distance": 1000
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Outlier Analysis
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/analysis/outlier_run.php`
|
||||||
|
|
||||||
|
Identify statistical outliers in a dataset.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"value_field": "income",
|
||||||
|
"method": "zscore",
|
||||||
|
"threshold": 2.0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `dataset_id` (required): Dataset ID to analyze
|
||||||
|
- `value_field` (required): Numeric field to analyze
|
||||||
|
- `method` (optional): "zscore" or "mad" (default: "zscore")
|
||||||
|
- `threshold` (optional): Z-score threshold or MAD multiplier (default: 2.0)
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"job_id": 457,
|
||||||
|
"message": "Outlier analysis job queued"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## KDE (Kernel Density Estimation)
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/analysis_kde.php`
|
||||||
|
|
||||||
|
Generate kernel density estimation surface from point data.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"bandwidth": 1000,
|
||||||
|
"cell_size": 100,
|
||||||
|
"weight_field": null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `dataset_id` (required): Point dataset ID
|
||||||
|
- `bandwidth` (optional): Bandwidth in dataset units (default: auto-calculated)
|
||||||
|
- `cell_size` (optional): Output cell size (default: auto-calculated)
|
||||||
|
- `weight_field` (optional): Field to weight points
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"job_id": 458,
|
||||||
|
"message": "KDE analysis job queued"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Nearest Neighbor Analysis
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/nearest_run.php`
|
||||||
|
|
||||||
|
Find nearest neighbors between two datasets.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"source_dataset_id": 123,
|
||||||
|
"target_dataset_id": 124,
|
||||||
|
"max_distance": 5000,
|
||||||
|
"limit": 1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `source_dataset_id` (required): Source dataset ID
|
||||||
|
- `target_dataset_id` (required): Target dataset ID
|
||||||
|
- `max_distance` (optional): Maximum search distance
|
||||||
|
- `limit` (optional): Maximum neighbors per feature (default: 1)
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"job_id": 459,
|
||||||
|
"message": "Nearest neighbor analysis job queued"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dissolve Analysis
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/run_dissolve.php`
|
||||||
|
|
||||||
|
Dissolve features based on attribute values.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"dissolve_field": "category",
|
||||||
|
"aggregation": {
|
||||||
|
"population": "sum",
|
||||||
|
"area": "sum"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `dataset_id` (required): Dataset ID
|
||||||
|
- `dissolve_field` (required): Field to dissolve on
|
||||||
|
- `aggregation` (optional): Aggregation functions for numeric fields
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"job_id": 460,
|
||||||
|
"message": "Dissolve analysis job queued"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Clip Analysis
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/datasets_clip_run.php`
|
||||||
|
|
||||||
|
Clip features to a boundary geometry.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"clip_geometry": {
|
||||||
|
"type": "Polygon",
|
||||||
|
"coordinates": [ ... ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `dataset_id` (required): Dataset ID to clip
|
||||||
|
- `clip_geometry` (required): GeoJSON geometry for clipping boundary
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"job_id": 461,
|
||||||
|
"message": "Clip analysis job queued"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Erase Analysis
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/analysis_erase_run.php`
|
||||||
|
|
||||||
|
Erase features from a dataset using another dataset.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"input_dataset_id": 123,
|
||||||
|
"erase_dataset_id": 124
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `input_dataset_id` (required): Input dataset ID
|
||||||
|
- `erase_dataset_id` (required): Erase dataset ID
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"job_id": 462,
|
||||||
|
"message": "Erase analysis job queued"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Zonal Statistics
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/zonal_stats.php`
|
||||||
|
|
||||||
|
Calculate statistics for raster data within polygon zones.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"raster_dataset_id": 125,
|
||||||
|
"zone_dataset_id": 123,
|
||||||
|
"statistics": ["mean", "sum", "count"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `raster_dataset_id` (required): Raster dataset ID
|
||||||
|
- `zone_dataset_id` (required): Polygon zone dataset ID
|
||||||
|
- `statistics` (optional): Statistics to calculate (default: all)
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"job_id": 463,
|
||||||
|
"message": "Zonal statistics job queued"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Output Modes
|
||||||
|
|
||||||
|
Analysis results can be stored in different formats:
|
||||||
|
|
||||||
|
- **static**: Results stored in a permanent table (default)
|
||||||
|
- **view**: Results stored as a database view (updates with source data)
|
||||||
|
- **materialized_view**: Results stored as a materialized view (requires refresh)
|
||||||
|
|
||||||
|
## Job Status
|
||||||
|
|
||||||
|
All analysis operations run as background jobs. Use the returned `job_id` to check status:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
GET /api/job_status.php?job_id=456
|
||||||
|
```
|
||||||
|
|
||||||
|
See [Jobs API](jobs.md) for details.
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis Tools](../analysis-tools/index.md)
|
||||||
|
- [Workers](../workers/index.md)
|
||||||
|
- [Jobs API](jobs.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,309 @@
|
||||||
|
# Datasets API
|
||||||
|
|
||||||
|
Endpoints for managing and querying spatial datasets.
|
||||||
|
|
||||||
|
## List Datasets
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/datasets/list.php`
|
||||||
|
|
||||||
|
List all datasets accessible to the current user.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `has_geometry` (optional): Filter datasets with geometry (0 or 1)
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": 123,
|
||||||
|
"name": "Sample Dataset",
|
||||||
|
"original_name": "sample.geojson",
|
||||||
|
"file_type": "geojson",
|
||||||
|
"metadata": { ... }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X GET "https://example.com/api/datasets/list.php?has_geometry=1" \
|
||||||
|
-H "Cookie: PHPSESSID=..."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Get Dataset
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/datasets/get.php`
|
||||||
|
|
||||||
|
Get detailed information about a specific dataset.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `id` (required): Dataset ID
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"id": 123,
|
||||||
|
"name": "Sample Dataset",
|
||||||
|
"original_name": "sample.geojson",
|
||||||
|
"file_type": "geojson",
|
||||||
|
"file_size": 1024000,
|
||||||
|
"description": "Dataset description",
|
||||||
|
"metadata": {
|
||||||
|
"feature_count": 1000,
|
||||||
|
"geometry_type": "Point",
|
||||||
|
"bbox": [-180, -90, 180, 90]
|
||||||
|
},
|
||||||
|
"uploaded_at": "2024-01-01T00:00:00Z",
|
||||||
|
"updated_at": "2024-01-01T00:00:00Z"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X GET "https://example.com/api/datasets/get.php?id=123" \
|
||||||
|
-H "Cookie: PHPSESSID=..."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Query Dataset
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/basic/index.php/datasets/{id}/query`
|
||||||
|
|
||||||
|
Query features from a dataset with filtering and pagination.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `page` (optional): Page number (default: 1)
|
||||||
|
- `limit` (optional): Items per page (default: 100, max: 1000)
|
||||||
|
- `bbox` (optional): Bounding box filter (minX,minY,maxX,maxY)
|
||||||
|
- `properties` (optional): Property filters (JSON object)
|
||||||
|
- `geometry_type` (optional): Filter by geometry type
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"type": "FeatureCollection",
|
||||||
|
"features": [
|
||||||
|
{
|
||||||
|
"type": "Feature",
|
||||||
|
"id": 1,
|
||||||
|
"properties": { ... },
|
||||||
|
"geometry": { ... }
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pagination": {
|
||||||
|
"page": 1,
|
||||||
|
"limit": 100,
|
||||||
|
"total": 1000,
|
||||||
|
"pages": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X GET "https://example.com/api/basic/index.php/datasets/123/query?page=1&limit=50&bbox=-180,-90,180,90" \
|
||||||
|
-H "Cookie: PHPSESSID=..."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Get Dataset Properties
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/datasets/get_properties.php`
|
||||||
|
|
||||||
|
Get all unique property keys from a dataset.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `id` (required): Dataset ID
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": ["property1", "property2", "property3"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Get Property Values
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/datasets/get_property_values.php`
|
||||||
|
|
||||||
|
Get unique values for a specific property.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `id` (required): Dataset ID
|
||||||
|
- `property` (required): Property name
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": ["value1", "value2", "value3"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dataset Filters
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/datasets/filters.php`
|
||||||
|
|
||||||
|
Get saved filters for a dataset.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `id` (required): Dataset ID
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"filters": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "Filter Name",
|
||||||
|
"conditions": { ... }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Save Dataset Filters
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/datasets/save_filters.php`
|
||||||
|
|
||||||
|
Save filter configuration for a dataset.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": 123,
|
||||||
|
"filters": [
|
||||||
|
{
|
||||||
|
"name": "Filter Name",
|
||||||
|
"conditions": {
|
||||||
|
"property": "value",
|
||||||
|
"operator": "equals"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"message": "Filters saved successfully"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dataset Legend
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/datasets/legend.php`
|
||||||
|
|
||||||
|
Get legend configuration for a dataset.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `id` (required): Dataset ID
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"type": "graduated",
|
||||||
|
"property": "value",
|
||||||
|
"stops": [
|
||||||
|
{ "value": 0, "color": "#0000ff" },
|
||||||
|
{ "value": 100, "color": "#ff0000" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Save Dataset Legend
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/datasets/save_legend.php`
|
||||||
|
|
||||||
|
Save legend configuration for a dataset.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": 123,
|
||||||
|
"legend": {
|
||||||
|
"type": "graduated",
|
||||||
|
"property": "value",
|
||||||
|
"stops": [ ... ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"message": "Legend saved successfully"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Update Dataset Name
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/update_dataset_name.php`
|
||||||
|
|
||||||
|
Update the display name of a dataset.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": 123,
|
||||||
|
"name": "New Dataset Name"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"message": "Dataset name updated"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
Dataset operations that may take time (imports, analysis) are processed as background jobs. See [Jobs API](jobs.md) for job management.
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis Tools](../analysis-tools/index.md)
|
||||||
|
- [Architecture Overview](../architecture.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,159 @@
|
||||||
|
# Images API
|
||||||
|
|
||||||
|
Proxy API for GeoServer catalog and WMS/WFS services.
|
||||||
|
|
||||||
|
## Ping
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/images/index.php/ping`
|
||||||
|
|
||||||
|
Check GeoServer connectivity and version.
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"about": {
|
||||||
|
"resource": {
|
||||||
|
"@class": "aboutVersion",
|
||||||
|
"version": "2.21.0",
|
||||||
|
"gitRevision": "...",
|
||||||
|
"buildDate": "..."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X GET "https://example.com/api/images/index.php/ping"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Catalog
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/images/index.php/catalog`
|
||||||
|
|
||||||
|
List all layers in GeoServer catalog.
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"layers": {
|
||||||
|
"layer": [
|
||||||
|
{
|
||||||
|
"name": "layer1",
|
||||||
|
"href": "http://geoserver/rest/layers/layer1.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Workspaces
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/images/index.php/workspaces`
|
||||||
|
|
||||||
|
List all workspaces.
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"workspaces": {
|
||||||
|
"workspace": [
|
||||||
|
{
|
||||||
|
"name": "workspace1",
|
||||||
|
"href": "http://geoserver/rest/workspaces/workspace1.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Layers
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/images/index.php/layers`
|
||||||
|
|
||||||
|
List all layers (detailed).
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"layers": {
|
||||||
|
"layer": [
|
||||||
|
{
|
||||||
|
"name": "layer1",
|
||||||
|
"type": "VECTOR",
|
||||||
|
"defaultStyle": { ... },
|
||||||
|
"resource": { ... }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## WMS Proxy
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/images/index.php/wms`
|
||||||
|
|
||||||
|
Proxy WMS requests to GeoServer.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
Standard WMS parameters:
|
||||||
|
- `service`: WMS
|
||||||
|
- `version`: 1.1.1 or 1.3.0
|
||||||
|
- `request`: GetMap, GetFeatureInfo, GetCapabilities, etc.
|
||||||
|
- `layers`: Layer names
|
||||||
|
- `styles`: Style names
|
||||||
|
- `bbox`: Bounding box
|
||||||
|
- `width`, `height`: Image dimensions
|
||||||
|
- `format`: Output format
|
||||||
|
- `srs` or `crs`: Spatial reference system
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X GET "https://example.com/api/images/index.php/wms?service=WMS&version=1.1.1&request=GetMap&layers=layer1&bbox=-180,-90,180,90&width=800&height=600&format=image/png&srs=EPSG:4326"
|
||||||
|
```
|
||||||
|
|
||||||
|
## WFS Proxy
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/images/index.php/wfs`
|
||||||
|
|
||||||
|
Proxy WFS requests to GeoServer.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
Standard WFS parameters:
|
||||||
|
- `service`: WFS
|
||||||
|
- `version`: 1.0.0, 1.1.0, or 2.0.0
|
||||||
|
- `request`: GetFeature, GetCapabilities, DescribeFeatureType, etc.
|
||||||
|
- `typeName`: Feature type name
|
||||||
|
- `outputFormat`: Output format (GML, GeoJSON, etc.)
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X GET "https://example.com/api/images/index.php/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=layer1&outputFormat=application/json"
|
||||||
|
```
|
||||||
|
|
||||||
|
## REST Proxy
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/images/index.php/rest/{path}`
|
||||||
|
|
||||||
|
Proxy GeoServer REST API requests (read-only by default).
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X GET "https://example.com/api/images/index.php/rest/layers/layer1.json"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Server API](server.md)
|
||||||
|
- [Architecture Overview](../architecture.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
# API Reference
|
||||||
|
|
||||||
|
Aurora GIS provides a comprehensive RESTful API for programmatic access to datasets, analysis tools, and system functionality.
|
||||||
|
|
||||||
|
## API Overview
|
||||||
|
|
||||||
|
The API is organized into several sections:
|
||||||
|
|
||||||
|
- **Basic API**: Dataset listing, details, and GeoJSON queries
|
||||||
|
- **Server API**: Server information and capabilities
|
||||||
|
- **Images API**: GeoServer proxy and catalog access
|
||||||
|
- **Analysis APIs**: Endpoints for running spatial analysis
|
||||||
|
- **Worker APIs**: Background job management
|
||||||
|
- **Dataset APIs**: Dataset-specific operations
|
||||||
|
|
||||||
|
## Authentication
|
||||||
|
|
||||||
|
Most API endpoints require authentication. Authentication is handled via:
|
||||||
|
|
||||||
|
- **Session-based**: For web interface requests
|
||||||
|
- **API Key**: (Optional, if configured)
|
||||||
|
|
||||||
|
Unauthenticated requests return `401 Unauthorized`.
|
||||||
|
|
||||||
|
Some endpoints support public access for datasets marked as public.
|
||||||
|
|
||||||
|
## Base URLs
|
||||||
|
|
||||||
|
- **Basic API**: `/api/basic/index.php`
|
||||||
|
- **Server API**: `/api/server/index.php`
|
||||||
|
- **Images API**: `/api/images/index.php`
|
||||||
|
- **Main API**: `/api.php`
|
||||||
|
- **Dataset APIs**: `/api/datasets/`
|
||||||
|
- **Analysis APIs**: `/api/analysis/`
|
||||||
|
|
||||||
|
## Response Format
|
||||||
|
|
||||||
|
All API responses are in JSON format:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": { ... },
|
||||||
|
"error": null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Error responses:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": false,
|
||||||
|
"error": "Error message",
|
||||||
|
"status": 400
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## API Endpoints
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
datasets
|
||||||
|
analysis
|
||||||
|
jobs
|
||||||
|
images
|
||||||
|
server
|
||||||
|
```
|
||||||
|
|
||||||
|
## Rate Limiting
|
||||||
|
|
||||||
|
API requests are subject to rate limiting to ensure system stability. Contact the administrator for rate limit information.
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Architecture Overview](../architecture.md)
|
||||||
|
- [Analysis Tools](../analysis-tools/index.md)
|
||||||
|
- [Workers](../workers/index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,185 @@
|
||||||
|
# Jobs API
|
||||||
|
|
||||||
|
Endpoints for managing background jobs.
|
||||||
|
|
||||||
|
## Get Job Status
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/job_status.php`
|
||||||
|
|
||||||
|
Get the current status of a background job.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `job_id` (required): Job ID
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"job_status": "completed",
|
||||||
|
"job": {
|
||||||
|
"id": 456,
|
||||||
|
"job_type": "hotspot_analysis",
|
||||||
|
"status": "completed",
|
||||||
|
"progress": 100,
|
||||||
|
"params": { ... },
|
||||||
|
"result": {
|
||||||
|
"dataset_id": 789,
|
||||||
|
"dataset_name": "Hot Spot Results",
|
||||||
|
"table_name": "spatial_data_789"
|
||||||
|
},
|
||||||
|
"created_at": "2024-01-01T00:00:00Z",
|
||||||
|
"started_at": "2024-01-01T00:01:00Z",
|
||||||
|
"finished_at": "2024-01-01T00:05:00Z"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Job Statuses
|
||||||
|
|
||||||
|
- `queued`: Job is waiting to be processed
|
||||||
|
- `running`: Job is currently being processed
|
||||||
|
- `completed`: Job completed successfully
|
||||||
|
- `failed`: Job failed with an error
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X GET "https://example.com/api/job_status.php?job_id=456" \
|
||||||
|
-H "Cookie: PHPSESSID=..."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Cancel Job
|
||||||
|
|
||||||
|
**Endpoint**: `POST /api/job_cancel.php`
|
||||||
|
|
||||||
|
Cancel a queued or running job.
|
||||||
|
|
||||||
|
### Request Body
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"job_id": 456
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"message": "Job cancelled successfully"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
|
||||||
|
- Only queued or running jobs can be cancelled
|
||||||
|
- Completed or failed jobs cannot be cancelled
|
||||||
|
- Users can only cancel their own jobs (admins can cancel any job)
|
||||||
|
|
||||||
|
## List User Jobs
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/jobs/status.php`
|
||||||
|
|
||||||
|
List all jobs for the current user.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `status` (optional): Filter by status (queued, running, completed, failed)
|
||||||
|
- `job_type` (optional): Filter by job type
|
||||||
|
- `limit` (optional): Maximum results (default: 50)
|
||||||
|
- `offset` (optional): Result offset (default: 0)
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"jobs": [
|
||||||
|
{
|
||||||
|
"id": 456,
|
||||||
|
"job_type": "hotspot_analysis",
|
||||||
|
"status": "completed",
|
||||||
|
"progress": 100,
|
||||||
|
"created_at": "2024-01-01T00:00:00Z",
|
||||||
|
"finished_at": "2024-01-01T00:05:00Z"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"total": 10,
|
||||||
|
"limit": 50,
|
||||||
|
"offset": 0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X GET "https://example.com/api/jobs/status.php?status=running&limit=10" \
|
||||||
|
-H "Cookie: PHPSESSID=..."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Job Result Structure
|
||||||
|
|
||||||
|
Completed jobs include a `result` field with job-specific information:
|
||||||
|
|
||||||
|
### Hot Spot Analysis Result
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 789,
|
||||||
|
"dataset_name": "Hot Spot Results",
|
||||||
|
"table_name": "spatial_data_789",
|
||||||
|
"row_count": 1000,
|
||||||
|
"storage_type": "table"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Outlier Analysis Result
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 790,
|
||||||
|
"dataset_name": "Outlier Results",
|
||||||
|
"table_name": "spatial_data_790",
|
||||||
|
"row_count": 50,
|
||||||
|
"outlier_count": 50
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Nearest Analysis Result
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 791,
|
||||||
|
"dataset_name": "Nearest Results",
|
||||||
|
"table_name": "spatial_data_791",
|
||||||
|
"row_count": 500,
|
||||||
|
"source_dataset_id": 123,
|
||||||
|
"target_dataset_id": 124
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
Failed jobs include an `error_message` field:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "failed",
|
||||||
|
"error_message": "Dataset not found",
|
||||||
|
"job": {
|
||||||
|
"id": 456,
|
||||||
|
"status": "failed",
|
||||||
|
"error_message": "Dataset not found"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](analysis.md)
|
||||||
|
- [Workers](../workers/index.md)
|
||||||
|
- [Architecture Overview](../architecture.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
# Server API
|
||||||
|
|
||||||
|
Endpoints for server information and capabilities.
|
||||||
|
|
||||||
|
## Server Information
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/server/index.php`
|
||||||
|
|
||||||
|
Get server information and API capabilities.
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "Aurora GIS",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"capabilities": {
|
||||||
|
"datasets": true,
|
||||||
|
"analysis": true,
|
||||||
|
"raster": true,
|
||||||
|
"workers": true
|
||||||
|
},
|
||||||
|
"endpoints": {
|
||||||
|
"datasets": "/api/datasets/",
|
||||||
|
"analysis": "/api/analysis/",
|
||||||
|
"jobs": "/api/jobs/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Basic API Information
|
||||||
|
|
||||||
|
**Endpoint**: `GET /api/basic/index.php`
|
||||||
|
|
||||||
|
Get basic API information and available endpoints.
|
||||||
|
|
||||||
|
### Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "Basic API",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"endpoints": {
|
||||||
|
"datasets": "/api/basic/index.php/datasets",
|
||||||
|
"query": "/api/basic/index.php/datasets/{id}/query"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Datasets API](datasets.md)
|
||||||
|
- [Analysis API](analysis.md)
|
||||||
|
- [Architecture Overview](../architecture.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,353 @@
|
||||||
|
# Architecture Overview
|
||||||
|
|
||||||
|
This document provides a comprehensive overview of the Aurora GIS architecture, including system components, data flows, and design patterns.
|
||||||
|
|
||||||
|
## System Architecture
|
||||||
|
|
||||||
|
Aurora GIS follows a modular architecture with clear separation between:
|
||||||
|
|
||||||
|
- **Frontend**: PHP-based web interface with JavaScript for interactivity
|
||||||
|
- **Backend**: PHP application layer with PostgreSQL/PostGIS database
|
||||||
|
- **Workers**: Background job processing system
|
||||||
|
- **API**: RESTful API layer for programmatic access
|
||||||
|
- **Analysis Engine**: Spatial analysis tools and algorithms
|
||||||
|
|
||||||
|
## Core Components
|
||||||
|
|
||||||
|
### 1. Dataset Engine
|
||||||
|
|
||||||
|
The dataset engine is the core component responsible for managing spatial datasets.
|
||||||
|
|
||||||
|
#### Data Storage Model
|
||||||
|
|
||||||
|
Each dataset is stored in its own table following the naming convention `spatial_data_{dataset_id}`:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE TABLE spatial_data_{id} (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
feature_id TEXT,
|
||||||
|
geometry_type TEXT,
|
||||||
|
properties JSONB,
|
||||||
|
geometry JSONB,
|
||||||
|
geom GEOMETRY,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
- Better performance with large numbers of datasets
|
||||||
|
- Easier data management and cleanup
|
||||||
|
- Improved query performance for individual datasets
|
||||||
|
- Reduced table size and index overhead
|
||||||
|
|
||||||
|
#### Dataset Metadata
|
||||||
|
|
||||||
|
Dataset metadata is stored in the `spatial_files` table:
|
||||||
|
|
||||||
|
- File information (name, path, type, size)
|
||||||
|
- User-provided description
|
||||||
|
- Extracted metadata (JSONB)
|
||||||
|
- Access permissions
|
||||||
|
- Creation and update timestamps
|
||||||
|
|
||||||
|
#### PostGIS Integration
|
||||||
|
|
||||||
|
- All spatial data stored as PostGIS `GEOMETRY` type
|
||||||
|
- Automatic SRID handling (default: 4326)
|
||||||
|
- Spatial indexes using GiST for performance
|
||||||
|
- Support for all PostGIS geometry types
|
||||||
|
|
||||||
|
### 2. Background Jobs System
|
||||||
|
|
||||||
|
The background jobs system enables asynchronous processing of long-running operations.
|
||||||
|
|
||||||
|
#### Job Queue
|
||||||
|
|
||||||
|
Jobs are stored in the `background_jobs` table:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE TABLE background_jobs (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
user_id INTEGER,
|
||||||
|
job_type TEXT,
|
||||||
|
params JSONB,
|
||||||
|
status TEXT, -- 'queued', 'running', 'completed', 'failed'
|
||||||
|
result JSONB,
|
||||||
|
error_message TEXT,
|
||||||
|
progress INTEGER,
|
||||||
|
created_at TIMESTAMP,
|
||||||
|
started_at TIMESTAMP,
|
||||||
|
finished_at TIMESTAMP
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Job Lifecycle
|
||||||
|
|
||||||
|
1. **Enqueue**: Job created with status 'queued'
|
||||||
|
2. **Fetch**: Worker fetches next job using `FOR UPDATE SKIP LOCKED`
|
||||||
|
3. **Process**: Worker updates status to 'running' and processes job
|
||||||
|
4. **Complete**: Worker updates status to 'completed' with results
|
||||||
|
5. **Error**: On failure, status set to 'failed' with error message
|
||||||
|
|
||||||
|
#### Worker Architecture
|
||||||
|
|
||||||
|
Workers are long-running PHP CLI scripts that:
|
||||||
|
|
||||||
|
- Poll the database for queued jobs
|
||||||
|
- Process jobs of a specific type
|
||||||
|
- Handle errors gracefully
|
||||||
|
- Log progress and results
|
||||||
|
- Run continuously until stopped
|
||||||
|
|
||||||
|
See [Workers Documentation](workers/index.md) for details on each worker.
|
||||||
|
|
||||||
|
### 3. Analysis Tools
|
||||||
|
|
||||||
|
Aurora GIS provides a comprehensive suite of spatial analysis tools.
|
||||||
|
|
||||||
|
#### Vector Analysis Tools
|
||||||
|
|
||||||
|
- **Hot Spot Analysis**: Getis-Ord Gi* statistics for identifying clusters
|
||||||
|
- **Outlier Detection**: Z-score and MAD-based outlier identification
|
||||||
|
- **KDE (Kernel Density Estimation)**: Density surface generation
|
||||||
|
- **Clustering**: Spatial clustering algorithms
|
||||||
|
- **Proximity Analysis**: Buffer, nearest neighbor, distance calculations
|
||||||
|
- **Overlay Operations**: Intersect, union, erase, join
|
||||||
|
|
||||||
|
#### Raster Analysis Tools
|
||||||
|
|
||||||
|
- **Zonal Statistics**: Calculate statistics within polygon zones
|
||||||
|
- **Raster Histogram**: Analyze pixel value distributions
|
||||||
|
- **Raster Summary**: Generate summary statistics
|
||||||
|
- **Raster Profile**: Extract values along a line
|
||||||
|
- **Raster Conversion**: Convert between formats
|
||||||
|
- **Raster Comparison**: Compare two raster datasets
|
||||||
|
|
||||||
|
See [Analysis Tools Documentation](analysis-tools/index.md) for details.
|
||||||
|
|
||||||
|
### 4. API Layer
|
||||||
|
|
||||||
|
The API layer provides RESTful access to datasets and analysis tools.
|
||||||
|
|
||||||
|
#### API Structure
|
||||||
|
|
||||||
|
- **Basic API** (`/api/basic/index.php`): Dataset listing, details, GeoJSON queries
|
||||||
|
- **Server API** (`/api/server/index.php`): Server information and capabilities
|
||||||
|
- **Images API** (`/api/images/index.php`): GeoServer proxy and catalog
|
||||||
|
- **Analysis APIs**: Endpoints for running analysis tools
|
||||||
|
- **Worker APIs**: Endpoints for job management
|
||||||
|
|
||||||
|
#### Authentication
|
||||||
|
|
||||||
|
- Session-based authentication for web interface
|
||||||
|
- API key authentication (optional)
|
||||||
|
- Dataset-level access control
|
||||||
|
- Public dataset access (configurable)
|
||||||
|
|
||||||
|
See [API Documentation](api/index.md) for endpoint details.
|
||||||
|
|
||||||
|
### 5. PostGIS Data Flows
|
||||||
|
|
||||||
|
#### Import Flow
|
||||||
|
|
||||||
|
```
|
||||||
|
Uploaded File
|
||||||
|
↓
|
||||||
|
Format Detection
|
||||||
|
↓
|
||||||
|
Geometry Extraction
|
||||||
|
↓
|
||||||
|
PostGIS Processing
|
||||||
|
↓
|
||||||
|
spatial_data_{id} Table
|
||||||
|
↓
|
||||||
|
Spatial Index Creation
|
||||||
|
↓
|
||||||
|
Metadata Extraction
|
||||||
|
↓
|
||||||
|
spatial_files Record
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Analysis Flow
|
||||||
|
|
||||||
|
```
|
||||||
|
User Request
|
||||||
|
↓
|
||||||
|
Job Enqueue
|
||||||
|
↓
|
||||||
|
Worker Fetch
|
||||||
|
↓
|
||||||
|
PostGIS Analysis
|
||||||
|
↓
|
||||||
|
Result Table/View
|
||||||
|
↓
|
||||||
|
Job Complete
|
||||||
|
↓
|
||||||
|
User Notification
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Export Flow
|
||||||
|
|
||||||
|
```
|
||||||
|
Dataset Selection
|
||||||
|
↓
|
||||||
|
Query PostGIS Table
|
||||||
|
↓
|
||||||
|
Format Conversion
|
||||||
|
↓
|
||||||
|
GeoJSON/Shapefile/CSV
|
||||||
|
↓
|
||||||
|
Download
|
||||||
|
```
|
||||||
|
|
||||||
|
## Data Processing Pipeline
|
||||||
|
|
||||||
|
### File Upload Processing
|
||||||
|
|
||||||
|
1. **File Validation**: Check file type, size, and format
|
||||||
|
2. **Geometry Extraction**: Parse geometry from source format
|
||||||
|
3. **SRID Detection**: Identify or assign spatial reference system
|
||||||
|
4. **Table Creation**: Create `spatial_data_{id}` table
|
||||||
|
5. **Data Import**: Insert features into PostGIS table
|
||||||
|
6. **Index Creation**: Create spatial and attribute indexes
|
||||||
|
7. **Metadata Extraction**: Extract and store metadata
|
||||||
|
8. **Registration**: Create `spatial_files` record
|
||||||
|
|
||||||
|
### Analysis Processing
|
||||||
|
|
||||||
|
1. **Parameter Validation**: Validate input parameters
|
||||||
|
2. **Job Creation**: Enqueue background job
|
||||||
|
3. **Worker Processing**: Worker fetches and processes job
|
||||||
|
4. **PostGIS Execution**: Run spatial analysis queries
|
||||||
|
5. **Result Storage**: Store results in table/view
|
||||||
|
6. **Metadata Update**: Update job status and results
|
||||||
|
7. **User Notification**: Notify user of completion
|
||||||
|
|
||||||
|
## Database Schema
|
||||||
|
|
||||||
|
### Core Tables
|
||||||
|
|
||||||
|
- **spatial_files**: Dataset metadata and file information
|
||||||
|
- **spatial_data_{id}**: Individual dataset tables (dynamic)
|
||||||
|
- **background_jobs**: Job queue and status
|
||||||
|
- **user**: User accounts and authentication
|
||||||
|
- **access_group**: Access control groups
|
||||||
|
- **user_access**: User-group associations
|
||||||
|
- **dataset_permissions**: Dataset-level permissions
|
||||||
|
|
||||||
|
### Supporting Tables
|
||||||
|
|
||||||
|
- **ogc_connections**: External PostGIS connections
|
||||||
|
- **scheduled_imports**: Scheduled URL imports
|
||||||
|
- **map_views**: Saved map configurations
|
||||||
|
- **dashboards**: Dashboard definitions
|
||||||
|
- **presentations**: Presentation configurations
|
||||||
|
- **categories_keywords**: Dataset categorization
|
||||||
|
|
||||||
|
## Security Architecture
|
||||||
|
|
||||||
|
### Authentication
|
||||||
|
|
||||||
|
- Session-based authentication
|
||||||
|
- OAuth support (GitHub, Google, Microsoft)
|
||||||
|
- Password hashing (bcrypt)
|
||||||
|
- Session management
|
||||||
|
|
||||||
|
### Authorization
|
||||||
|
|
||||||
|
- Role-based access control (Admin, User, Publisher)
|
||||||
|
- Dataset-level permissions
|
||||||
|
- Access group management
|
||||||
|
- Public dataset access (optional)
|
||||||
|
|
||||||
|
### Data Security
|
||||||
|
|
||||||
|
- SQL injection prevention (prepared statements)
|
||||||
|
- XSS protection (output escaping)
|
||||||
|
- File upload validation
|
||||||
|
- Path traversal prevention
|
||||||
|
- Secure file storage
|
||||||
|
|
||||||
|
## Performance Optimizations
|
||||||
|
|
||||||
|
### Database Optimizations
|
||||||
|
|
||||||
|
- Spatial indexes (GiST) on geometry columns
|
||||||
|
- Attribute indexes on frequently queried fields
|
||||||
|
- Connection pooling (PgBouncer support)
|
||||||
|
- Query optimization and caching
|
||||||
|
- Materialized views for complex queries
|
||||||
|
|
||||||
|
### Application Optimizations
|
||||||
|
|
||||||
|
- Lazy loading of map components
|
||||||
|
- Pagination for large datasets
|
||||||
|
- Background job processing
|
||||||
|
- Caching of metadata and configurations
|
||||||
|
- Efficient JSONB storage
|
||||||
|
|
||||||
|
### Worker Optimizations
|
||||||
|
|
||||||
|
- Parallel job processing (multiple workers)
|
||||||
|
- Job prioritization
|
||||||
|
- Resource limits and timeouts
|
||||||
|
- Error handling and retry logic
|
||||||
|
|
||||||
|
## Scalability Considerations
|
||||||
|
|
||||||
|
### Horizontal Scaling
|
||||||
|
|
||||||
|
- Stateless application design
|
||||||
|
- Database connection pooling
|
||||||
|
- Worker scaling (multiple worker instances)
|
||||||
|
- Load balancing support
|
||||||
|
|
||||||
|
### Vertical Scaling
|
||||||
|
|
||||||
|
- Database query optimization
|
||||||
|
- Index optimization
|
||||||
|
- Memory management
|
||||||
|
- Worker resource allocation
|
||||||
|
|
||||||
|
## Integration Points
|
||||||
|
|
||||||
|
### External Services
|
||||||
|
|
||||||
|
- **GeoServer**: WMS/WFS services
|
||||||
|
- **QGIS Server**: QGIS project rendering
|
||||||
|
- **pg_tileserv**: Vector tile generation
|
||||||
|
- **OAuth Providers**: Authentication
|
||||||
|
- **S3**: Cloud storage for large files
|
||||||
|
|
||||||
|
### Data Sources
|
||||||
|
|
||||||
|
- **PostGIS Remote**: External PostGIS databases
|
||||||
|
- **URL Imports**: Web-accessible spatial data
|
||||||
|
- **File Uploads**: Local file uploads
|
||||||
|
- **Overture Maps**: Parquet file imports
|
||||||
|
- **S3 Buckets**: Cloud-based data sources
|
||||||
|
|
||||||
|
## Monitoring and Logging
|
||||||
|
|
||||||
|
### Application Logging
|
||||||
|
|
||||||
|
- Error logging to files
|
||||||
|
- Worker-specific logs
|
||||||
|
- Import operation logs
|
||||||
|
- API access logs
|
||||||
|
|
||||||
|
### Database Monitoring
|
||||||
|
|
||||||
|
- Query performance monitoring
|
||||||
|
- Connection pool monitoring
|
||||||
|
- Table size monitoring
|
||||||
|
- Index usage statistics
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Installation Guide](installation.md)
|
||||||
|
- [Configuration Guide](configuration.md)
|
||||||
|
- [API Documentation](api/index.md)
|
||||||
|
- [Workers Documentation](workers/index.md)
|
||||||
|
- [Analysis Tools Documentation](analysis-tools/index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,120 @@
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to Aurora GIS will be documented in this file.
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Comprehensive ReadTheDocs documentation
|
||||||
|
- Sphinx documentation with MyST Markdown
|
||||||
|
- API documentation for all endpoints
|
||||||
|
- Worker documentation
|
||||||
|
- Analysis tools documentation
|
||||||
|
- UI components documentation
|
||||||
|
|
||||||
|
## [1.0.0] - 2024-01-01
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Initial release of Aurora GIS
|
||||||
|
- Dataset management system
|
||||||
|
- Spatial analysis tools
|
||||||
|
- Background job processing
|
||||||
|
- RESTful API
|
||||||
|
- Interactive map viewer
|
||||||
|
- Dashboard builder
|
||||||
|
- Support for multiple data formats (GeoJSON, Shapefile, KML, CSV, GeoTIFF)
|
||||||
|
- PostGIS integration
|
||||||
|
- OAuth authentication (GitHub, Google, Microsoft)
|
||||||
|
- URL-based imports
|
||||||
|
- PostGIS remote connections
|
||||||
|
- Overture Maps integration
|
||||||
|
- S3 bucket imports
|
||||||
|
- QGIS project support
|
||||||
|
- Raster analysis tools
|
||||||
|
- Vector analysis tools
|
||||||
|
- Hot spot analysis
|
||||||
|
- Outlier detection
|
||||||
|
- KDE (Kernel Density Estimation)
|
||||||
|
- Clustering
|
||||||
|
- Zonal statistics
|
||||||
|
- Background workers for long-running operations
|
||||||
|
- Dashboard widgets
|
||||||
|
- Presentation builder
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
#### Data Management
|
||||||
|
- File upload with drag-and-drop
|
||||||
|
- Multiple format support
|
||||||
|
- Metadata extraction
|
||||||
|
- Dataset versioning
|
||||||
|
- Access control and permissions
|
||||||
|
|
||||||
|
#### Spatial Analysis
|
||||||
|
- Hot spot analysis (Getis-Ord Gi*)
|
||||||
|
- Outlier detection (z-score, MAD)
|
||||||
|
- KDE (Kernel Density Estimation)
|
||||||
|
- Clustering algorithms
|
||||||
|
- Buffer analysis
|
||||||
|
- Nearest neighbor analysis
|
||||||
|
- Intersect, union, erase operations
|
||||||
|
- Join operations
|
||||||
|
- Dissolve operations
|
||||||
|
- Clip operations
|
||||||
|
- Summarize within
|
||||||
|
- Zonal statistics
|
||||||
|
|
||||||
|
#### Raster Analysis
|
||||||
|
- Zonal statistics
|
||||||
|
- Raster histogram
|
||||||
|
- Raster summary
|
||||||
|
- Raster profile
|
||||||
|
- Raster conversion
|
||||||
|
- Raster comparison
|
||||||
|
|
||||||
|
#### Background Processing
|
||||||
|
- Asynchronous job processing
|
||||||
|
- Worker-based architecture
|
||||||
|
- Job status tracking
|
||||||
|
- Progress monitoring
|
||||||
|
|
||||||
|
#### Visualization
|
||||||
|
- Interactive Leaflet.js maps
|
||||||
|
- OpenLayers integration
|
||||||
|
- Dashboard builder
|
||||||
|
- Chart generation
|
||||||
|
- Layer styling
|
||||||
|
- Legend management
|
||||||
|
|
||||||
|
#### API
|
||||||
|
- RESTful API endpoints
|
||||||
|
- Dataset management API
|
||||||
|
- Analysis API
|
||||||
|
- Job management API
|
||||||
|
- GeoServer proxy API
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
### Core Components
|
||||||
|
- Dataset engine with PostGIS
|
||||||
|
- Background jobs system
|
||||||
|
- Analysis tools suite
|
||||||
|
- API layer
|
||||||
|
- Web interface
|
||||||
|
|
||||||
|
### Technology Stack
|
||||||
|
- PHP 7.4+
|
||||||
|
- PostgreSQL 12+ with PostGIS
|
||||||
|
- Bootstrap 5
|
||||||
|
- Leaflet.js / OpenLayers
|
||||||
|
- Chart.js / Plotly
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Installation Guide](installation.md)
|
||||||
|
- [Configuration Guide](configuration.md)
|
||||||
|
- [Architecture Overview](architecture.md)
|
||||||
|
- [API Reference](api/index.md)
|
||||||
|
- [Workers Documentation](workers/index.md)
|
||||||
|
- [Analysis Tools](analysis-tools/index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
# Configuration file for the Sphinx documentation builder.
|
||||||
|
#
|
||||||
|
# For the full list of built-in configuration values, see the documentation:
|
||||||
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
||||||
|
|
||||||
|
# -- Project information -----------------------------------------------------
|
||||||
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
|
||||||
|
|
||||||
|
project = 'Aurora GIS'
|
||||||
|
copyright = '2024, Aurora GIS Team'
|
||||||
|
author = 'Aurora GIS Team'
|
||||||
|
release = '1.0.0'
|
||||||
|
|
||||||
|
# -- General configuration ---------------------------------------------------
|
||||||
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
|
||||||
|
|
||||||
|
extensions = [
|
||||||
|
'myst_parser',
|
||||||
|
'sphinx.ext.autodoc',
|
||||||
|
'sphinx.ext.viewcode',
|
||||||
|
'sphinx.ext.intersphinx',
|
||||||
|
]
|
||||||
|
|
||||||
|
templates_path = ['_templates']
|
||||||
|
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
|
||||||
|
|
||||||
|
# -- Options for MyST Markdown -----------------------------------------------
|
||||||
|
# https://myst-parser.readthedocs.io/en/latest/configuration.html
|
||||||
|
|
||||||
|
myst_enable_extensions = [
|
||||||
|
"colon_fence",
|
||||||
|
"deflist",
|
||||||
|
"dollarmath",
|
||||||
|
"fieldlist",
|
||||||
|
"html_admonition",
|
||||||
|
"html_image",
|
||||||
|
"linkify",
|
||||||
|
"replacements",
|
||||||
|
"smartquotes",
|
||||||
|
"strikethrough",
|
||||||
|
"substitution",
|
||||||
|
"tasklist",
|
||||||
|
]
|
||||||
|
|
||||||
|
# -- Options for HTML output -------------------------------------------------
|
||||||
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
|
||||||
|
|
||||||
|
html_theme = 'sphinx_rtd_theme'
|
||||||
|
html_static_path = ['_static']
|
||||||
|
html_logo = None
|
||||||
|
html_favicon = None
|
||||||
|
|
||||||
|
# -- Intersphinx configuration -----------------------------------------------
|
||||||
|
intersphinx_mapping = {
|
||||||
|
'python': ('https://docs.python.org/3', None),
|
||||||
|
'postgis': ('https://postgis.net/documentation/', None),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,311 @@
|
||||||
|
# Configuration Guide
|
||||||
|
|
||||||
|
This guide covers all configuration options available in Aurora GIS.
|
||||||
|
|
||||||
|
## Configuration Files
|
||||||
|
|
||||||
|
### Primary Configuration: `config/const.php`
|
||||||
|
|
||||||
|
This file contains the core application constants. It is created during initialization and should not be edited manually unless necessary.
|
||||||
|
|
||||||
|
```php
|
||||||
|
const DB_HOST = 'localhost'; // PostgreSQL host
|
||||||
|
const DB_NAME = 'aurora_gis'; // Database name
|
||||||
|
const DB_USER = 'aurora_user'; // Database username
|
||||||
|
const DB_PASS = 'your_password'; // Database password
|
||||||
|
const DB_PORT = '5432'; // Database port
|
||||||
|
|
||||||
|
const DATA_DIR = '/var/www/data'; // Data directory for file storage
|
||||||
|
const SESS_USR_KEY = 'dc_user'; // Session key for user data
|
||||||
|
const SUPER_ADMIN_ID = 1; // ID of super admin user
|
||||||
|
```
|
||||||
|
|
||||||
|
### Database Configuration: `config/database.php`
|
||||||
|
|
||||||
|
This file handles database connections and connection pooling settings.
|
||||||
|
|
||||||
|
Key settings:
|
||||||
|
- **PDO Error Mode**: Set to `ERRMODE_EXCEPTION` for error handling
|
||||||
|
- **Prepared Statements**: Uses emulated prepares for PgBouncer compatibility
|
||||||
|
- **Statement Timeout**: 30 seconds (30000ms)
|
||||||
|
- **Idle Transaction Timeout**: 15 seconds (15000ms)
|
||||||
|
|
||||||
|
## Authentication Configuration
|
||||||
|
|
||||||
|
### OAuth Providers
|
||||||
|
|
||||||
|
Configure OAuth providers in `config/const.php`:
|
||||||
|
|
||||||
|
```php
|
||||||
|
const DISABLE_OAUTH_USER_CREATION = false; // Set to true to disable auto user creation
|
||||||
|
const GITHUB_CLIENT_ID = 'your_github_client_id';
|
||||||
|
const GITHUB_CLIENT_SECRET = 'your_github_client_secret';
|
||||||
|
const GOOGLE_CLIENT_ID = 'your_google_client_id';
|
||||||
|
const GOOGLE_CLIENT_SECRET = 'your_google_client_secret';
|
||||||
|
const MICROSOFT_CLIENT_ID = 'your_microsoft_client_id';
|
||||||
|
const MICROSOFT_CLIENT_SECRET = 'your_microsoft_client_secret';
|
||||||
|
const MICROSOFT_TENANT_ID = 'your_microsoft_tenant_id';
|
||||||
|
```
|
||||||
|
|
||||||
|
### OAuth Setup
|
||||||
|
|
||||||
|
1. **GitHub OAuth**:
|
||||||
|
- Go to GitHub Settings > Developer settings > OAuth Apps
|
||||||
|
- Create a new OAuth App
|
||||||
|
- Set Authorization callback URL: `https://your-domain/auth-github.php`
|
||||||
|
- Copy Client ID and Client Secret
|
||||||
|
|
||||||
|
2. **Google OAuth**:
|
||||||
|
- Go to Google Cloud Console > APIs & Services > Credentials
|
||||||
|
- Create OAuth 2.0 Client ID
|
||||||
|
- Add authorized redirect URI: `https://your-domain/auth-google.php`
|
||||||
|
- Copy Client ID and Client Secret
|
||||||
|
|
||||||
|
3. **Microsoft OAuth**:
|
||||||
|
- Go to Azure Portal > App registrations
|
||||||
|
- Create new registration
|
||||||
|
- Add redirect URI: `https://your-domain/auth-microsoft.php`
|
||||||
|
- Copy Application (client) ID, Directory (tenant) ID, and Client secret
|
||||||
|
|
||||||
|
## Data Directory Configuration
|
||||||
|
|
||||||
|
The `DATA_DIR` constant specifies where uploaded files and processed data are stored:
|
||||||
|
|
||||||
|
```php
|
||||||
|
const DATA_DIR = '/var/www/data';
|
||||||
|
```
|
||||||
|
|
||||||
|
Ensure this directory:
|
||||||
|
- Exists and is writable by the web server user
|
||||||
|
- Has sufficient disk space
|
||||||
|
- Has proper permissions (755 for directories, 644 for files)
|
||||||
|
|
||||||
|
Subdirectories created automatically:
|
||||||
|
- `uploads/` - Uploaded files
|
||||||
|
- `uploads/geoserver_documents/` - GeoServer documents
|
||||||
|
- `uploads/tabular/` - Tabular data files
|
||||||
|
- `uploads/raster/` - Raster files
|
||||||
|
- `uploads/qgis/` - QGIS projects
|
||||||
|
- `logs/` - Application logs
|
||||||
|
|
||||||
|
## Database Settings
|
||||||
|
|
||||||
|
### Connection Pooling (PgBouncer)
|
||||||
|
|
||||||
|
If using PgBouncer for connection pooling, the application uses emulated prepared statements:
|
||||||
|
|
||||||
|
```php
|
||||||
|
PDO::ATTR_EMULATE_PREPARES => true
|
||||||
|
```
|
||||||
|
|
||||||
|
### Timeout Settings
|
||||||
|
|
||||||
|
Configured in `config/database.php`:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$pdo->exec("SET statement_timeout = 30000"); // 30 seconds
|
||||||
|
$pdo->exec("SET idle_in_transaction_session_timeout = 15000"); // 15 seconds
|
||||||
|
```
|
||||||
|
|
||||||
|
Adjust these values based on your workload:
|
||||||
|
- Increase `statement_timeout` for long-running queries
|
||||||
|
- Decrease `idle_in_transaction_session_timeout` to prevent connection leaks
|
||||||
|
|
||||||
|
## Application Settings
|
||||||
|
|
||||||
|
Application settings are stored in the `app_settings` table and can be managed via the admin interface or directly in the database.
|
||||||
|
|
||||||
|
### Common Settings
|
||||||
|
|
||||||
|
Access via `includes/settings.php` functions:
|
||||||
|
|
||||||
|
```php
|
||||||
|
get_app_setting($pdo, 'setting_key', $default);
|
||||||
|
set_app_setting($pdo, 'setting_key', 'value');
|
||||||
|
```
|
||||||
|
|
||||||
|
### System Settings Page
|
||||||
|
|
||||||
|
Access system settings via the admin interface at `/system_settings.php`:
|
||||||
|
|
||||||
|
- **Site Name**: Display name for the application
|
||||||
|
- **Default Basemap**: Default map tile provider
|
||||||
|
- **Max Upload Size**: Maximum file upload size
|
||||||
|
- **Enable Public Access**: Allow anonymous dataset access
|
||||||
|
- **Email Settings**: SMTP configuration for notifications
|
||||||
|
|
||||||
|
## Worker Configuration
|
||||||
|
|
||||||
|
Background workers are configured via systemd service files in the `systemd/` directory.
|
||||||
|
|
||||||
|
### Worker Service Files
|
||||||
|
|
||||||
|
Each worker has a corresponding `.service` file:
|
||||||
|
|
||||||
|
- `hotspot_worker.service` - Hotspot analysis worker
|
||||||
|
- `outlier_worker.service` - Outlier analysis worker
|
||||||
|
- `nearest_worker.service` - Nearest neighbor analysis worker
|
||||||
|
- `dissolve_worker.service` - Dissolve operations worker
|
||||||
|
- `clip_worker.service` - Clip operations worker
|
||||||
|
- `raster_clip_worker.service` - Raster clip operations worker
|
||||||
|
|
||||||
|
### Configuring Workers
|
||||||
|
|
||||||
|
Edit the service file to set:
|
||||||
|
- Working directory
|
||||||
|
- PHP path
|
||||||
|
- User/group
|
||||||
|
- Environment variables
|
||||||
|
- Resource limits
|
||||||
|
|
||||||
|
Example service file:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=Hotspot Analysis Worker
|
||||||
|
After=network.target postgresql.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=www-data
|
||||||
|
WorkingDirectory=/var/www/html/aurora-gis
|
||||||
|
ExecStart=/usr/bin/php workers/hotspot_analysis_worker.php
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
## GeoServer Configuration
|
||||||
|
|
||||||
|
If using GeoServer for WMS/WFS services:
|
||||||
|
|
||||||
|
1. Configure GeoServer connection in `config/const.php` or environment variables
|
||||||
|
2. Set GeoServer admin credentials
|
||||||
|
3. Configure workspace and data stores
|
||||||
|
4. Enable required services (WMS, WFS, WCS)
|
||||||
|
|
||||||
|
## QGIS Server Configuration
|
||||||
|
|
||||||
|
For QGIS project rendering:
|
||||||
|
|
||||||
|
1. Install QGIS Server (see Installation Guide)
|
||||||
|
2. Configure QGIS Server settings in `mapproxy_settings.php`
|
||||||
|
3. Set QGIS Server URL in application settings
|
||||||
|
4. Ensure QGIS projects are accessible to QGIS Server
|
||||||
|
|
||||||
|
## pg_tileserv Configuration
|
||||||
|
|
||||||
|
For vector tile generation:
|
||||||
|
|
||||||
|
1. Install and configure pg_tileserv
|
||||||
|
2. Ensure PostGIS tables have proper SRID constraints
|
||||||
|
3. Configure pg_tileserv to discover tables automatically
|
||||||
|
4. Set pg_tileserv URL in application settings
|
||||||
|
|
||||||
|
## Security Configuration
|
||||||
|
|
||||||
|
### File Upload Security
|
||||||
|
|
||||||
|
- File type validation is enforced
|
||||||
|
- File size limits can be configured
|
||||||
|
- Uploaded files are stored outside the web root when possible
|
||||||
|
- File names are sanitized to prevent path traversal
|
||||||
|
|
||||||
|
### Database Security
|
||||||
|
|
||||||
|
- Use prepared statements (automatic via PDO)
|
||||||
|
- Database credentials stored in `config/const.php` (protect this file)
|
||||||
|
- User access controlled via `access_group` and `user_access` tables
|
||||||
|
- Dataset-level permissions via `dataset_permissions` table
|
||||||
|
|
||||||
|
### Session Security
|
||||||
|
|
||||||
|
- Session key configured via `SESS_USR_KEY` constant
|
||||||
|
- Session cookies should be HTTP-only and secure in production
|
||||||
|
- Configure session timeout in `php.ini`
|
||||||
|
|
||||||
|
## Performance Tuning
|
||||||
|
|
||||||
|
### PostgreSQL Tuning
|
||||||
|
|
||||||
|
Key PostgreSQL settings for optimal performance:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Increase shared buffers
|
||||||
|
shared_buffers = 256MB
|
||||||
|
|
||||||
|
-- Increase work memory for complex queries
|
||||||
|
work_mem = 16MB
|
||||||
|
|
||||||
|
-- Enable parallel queries
|
||||||
|
max_parallel_workers_per_gather = 4
|
||||||
|
|
||||||
|
-- Optimize for spatial queries
|
||||||
|
random_page_cost = 1.1 # For SSD storage
|
||||||
|
```
|
||||||
|
|
||||||
|
### PHP Tuning
|
||||||
|
|
||||||
|
In `php.ini`:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
memory_limit = 512M
|
||||||
|
max_execution_time = 300
|
||||||
|
upload_max_filesize = 100M
|
||||||
|
post_max_size = 100M
|
||||||
|
```
|
||||||
|
|
||||||
|
### Application Tuning
|
||||||
|
|
||||||
|
- Enable OPcache for PHP
|
||||||
|
- Use connection pooling (PgBouncer)
|
||||||
|
- Configure appropriate worker counts
|
||||||
|
- Monitor and optimize slow queries
|
||||||
|
|
||||||
|
## Environment-Specific Configuration
|
||||||
|
|
||||||
|
### Development
|
||||||
|
|
||||||
|
- Enable error display: `ini_set('display_errors', 1)`
|
||||||
|
- Use verbose logging
|
||||||
|
- Disable caching
|
||||||
|
- Use test database
|
||||||
|
|
||||||
|
### Production
|
||||||
|
|
||||||
|
- Disable error display: `ini_set('display_errors', 0)`
|
||||||
|
- Enable error logging
|
||||||
|
- Use production database
|
||||||
|
- Enable caching
|
||||||
|
- Use HTTPS only
|
||||||
|
- Configure proper backup strategy
|
||||||
|
|
||||||
|
## Monitoring and Logging
|
||||||
|
|
||||||
|
### Application Logs
|
||||||
|
|
||||||
|
Logs are stored in the `logs/` directory:
|
||||||
|
- `error.log` - PHP errors
|
||||||
|
- `worker_*.log` - Worker-specific logs
|
||||||
|
- `import_*.log` - Import operation logs
|
||||||
|
|
||||||
|
### Database Logging
|
||||||
|
|
||||||
|
Enable PostgreSQL logging:
|
||||||
|
|
||||||
|
```conf
|
||||||
|
# In postgresql.conf
|
||||||
|
logging_collector = on
|
||||||
|
log_directory = 'log'
|
||||||
|
log_filename = 'postgresql-%Y-%m-%d.log'
|
||||||
|
log_statement = 'all' # or 'mod' for modifications only
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Installation Guide](installation.md)
|
||||||
|
- [Architecture Overview](architecture.md)
|
||||||
|
- [Workers Documentation](workers/index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,257 @@
|
||||||
|
# Dashboard
|
||||||
|
|
||||||
|
Create custom interactive dashboards with multiple widgets to visualize and analyze spatial data.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Dashboards provide a flexible, drag-and-drop interface for building custom data visualization layouts. Combine maps, charts, tables, and analysis widgets to create comprehensive data views.
|
||||||
|
|
||||||
|
## Creating Dashboards
|
||||||
|
|
||||||
|
### Access
|
||||||
|
|
||||||
|
- Navigate to Dashboard Builder (`dashboard_builder.php`)
|
||||||
|
- Only admins can create new dashboards
|
||||||
|
- Users with edit permissions can modify existing dashboards
|
||||||
|
|
||||||
|
### Building Process
|
||||||
|
|
||||||
|
1. **Add Widgets**: Drag widgets from the sidebar onto the canvas
|
||||||
|
2. **Configure Widgets**: Click widgets to configure data sources and settings
|
||||||
|
3. **Arrange Layout**: Drag widgets to reposition, resize from corners
|
||||||
|
4. **Save Dashboard**: Save configuration and assign permissions
|
||||||
|
|
||||||
|
## Widget Types
|
||||||
|
|
||||||
|
### Map Widget
|
||||||
|
|
||||||
|
Interactive map display with multiple layers.
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Dataset selection
|
||||||
|
- Basemap selection
|
||||||
|
- Layer styling
|
||||||
|
- Initial extent
|
||||||
|
- Interaction settings
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Pan and zoom
|
||||||
|
- Feature identification
|
||||||
|
- Layer visibility toggle
|
||||||
|
- Popup configuration
|
||||||
|
|
||||||
|
### Chart Widget
|
||||||
|
|
||||||
|
Data visualization charts.
|
||||||
|
|
||||||
|
**Chart Types**:
|
||||||
|
- **Bar Chart**: Categorical comparisons
|
||||||
|
- **Line Chart**: Time series or trends
|
||||||
|
- **Pie Chart**: Proportional data
|
||||||
|
- **Scatter Plot**: Correlation analysis
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Dataset selection
|
||||||
|
- X and Y axis fields
|
||||||
|
- Aggregation functions
|
||||||
|
- Chart styling
|
||||||
|
- Update intervals
|
||||||
|
|
||||||
|
### Table Widget
|
||||||
|
|
||||||
|
Data table display with sorting and filtering.
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Column selection
|
||||||
|
- Sorting by columns
|
||||||
|
- Filtering
|
||||||
|
- Pagination
|
||||||
|
- Export options
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Dataset selection
|
||||||
|
- Visible columns
|
||||||
|
- Default sort
|
||||||
|
- Page size
|
||||||
|
- Row limit
|
||||||
|
|
||||||
|
### Counter Widget
|
||||||
|
|
||||||
|
Display summary statistics.
|
||||||
|
|
||||||
|
**Functions**:
|
||||||
|
- **Count**: Number of features
|
||||||
|
- **Sum**: Sum of numeric values
|
||||||
|
- **Average**: Mean value
|
||||||
|
- **Min/Max**: Minimum/maximum values
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Dataset selection
|
||||||
|
- Calculation function
|
||||||
|
- Value field (for sum/avg/min/max)
|
||||||
|
- Filter conditions
|
||||||
|
- Formatting options
|
||||||
|
|
||||||
|
### Filter Widget
|
||||||
|
|
||||||
|
Dataset filter controls for interactive filtering.
|
||||||
|
|
||||||
|
**Filter Types**:
|
||||||
|
- **Property Filters**: Filter by attribute values
|
||||||
|
- **Spatial Filters**: Filter by location
|
||||||
|
- **Date Filters**: Filter by date ranges
|
||||||
|
- **Numeric Filters**: Filter by numeric ranges
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Synchronize filters across widgets
|
||||||
|
- Real-time updates
|
||||||
|
- Save filter presets
|
||||||
|
- Clear filters
|
||||||
|
|
||||||
|
### Vector Analysis Widget
|
||||||
|
|
||||||
|
Tabular statistics for vector datasets.
|
||||||
|
|
||||||
|
**Statistics**:
|
||||||
|
- Feature count
|
||||||
|
- Geometry type distribution
|
||||||
|
- Attribute summaries
|
||||||
|
- Spatial extent
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Dataset selection
|
||||||
|
- Statistics to display
|
||||||
|
- Grouping options
|
||||||
|
|
||||||
|
### Raster Analysis Widget
|
||||||
|
|
||||||
|
Tabular statistics for raster datasets.
|
||||||
|
|
||||||
|
**Statistics**:
|
||||||
|
- Pixel count
|
||||||
|
- Value ranges
|
||||||
|
- Band information
|
||||||
|
- NoData statistics
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Raster dataset selection
|
||||||
|
- Statistics to display
|
||||||
|
- Band selection
|
||||||
|
|
||||||
|
### Hot Spot Summary Widget
|
||||||
|
|
||||||
|
Hot spot analysis summary statistics.
|
||||||
|
|
||||||
|
**Information**:
|
||||||
|
- Total features analyzed
|
||||||
|
- Hot spot count by class
|
||||||
|
- Cold spot count by class
|
||||||
|
- Significance distribution
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Hot spot dataset selection
|
||||||
|
- Class breakdown
|
||||||
|
- Summary format
|
||||||
|
|
||||||
|
### Outlier Summary Widget
|
||||||
|
|
||||||
|
Outlier analysis summary statistics.
|
||||||
|
|
||||||
|
**Information**:
|
||||||
|
- Total features
|
||||||
|
- Outlier count
|
||||||
|
- Outlier percentage
|
||||||
|
- Method used (z-score/MAD)
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Outlier dataset selection
|
||||||
|
- Summary format
|
||||||
|
|
||||||
|
## Dashboard Features
|
||||||
|
|
||||||
|
### Layout Management
|
||||||
|
|
||||||
|
- **Drag and Drop**: Reposition widgets by dragging
|
||||||
|
- **Resize**: Resize widgets from corners
|
||||||
|
- **Grid System**: Snap to grid for alignment
|
||||||
|
- **Responsive**: Adapts to different screen sizes
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
- **Widget Settings**: Configure each widget individually
|
||||||
|
- **Data Sources**: Link widgets to datasets
|
||||||
|
- **Styling**: Customize colors, fonts, sizes
|
||||||
|
- **Update Intervals**: Set refresh rates for live data
|
||||||
|
|
||||||
|
### Sharing and Permissions
|
||||||
|
|
||||||
|
- **Public Dashboards**: Share via public URL
|
||||||
|
- **Access Control**: Set permissions per user/group
|
||||||
|
- **Embed Codes**: Embed dashboards in external sites
|
||||||
|
- **Export**: Export dashboard configuration
|
||||||
|
|
||||||
|
### Viewing Dashboards
|
||||||
|
|
||||||
|
- **Full Screen**: View dashboards in full-screen mode
|
||||||
|
- **Print**: Print-friendly layouts
|
||||||
|
- **Export**: Export dashboard as image/PDF
|
||||||
|
- **Mobile**: Responsive mobile views
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
### Data Monitoring
|
||||||
|
|
||||||
|
- Real-time data monitoring
|
||||||
|
- Key performance indicators
|
||||||
|
- Status dashboards
|
||||||
|
- Alert systems
|
||||||
|
|
||||||
|
### Analysis Results
|
||||||
|
|
||||||
|
- Analysis result displays
|
||||||
|
- Statistical summaries
|
||||||
|
- Trend visualizations
|
||||||
|
- Comparative analysis
|
||||||
|
|
||||||
|
### Public Portals
|
||||||
|
|
||||||
|
- Public data portals
|
||||||
|
- Community dashboards
|
||||||
|
- Open data displays
|
||||||
|
- Information kiosks
|
||||||
|
|
||||||
|
### Executive Summaries
|
||||||
|
|
||||||
|
- High-level overviews
|
||||||
|
- Executive reports
|
||||||
|
- Strategic dashboards
|
||||||
|
- Performance metrics
|
||||||
|
|
||||||
|
## Example Dashboard
|
||||||
|
|
||||||
|
A typical dashboard might include:
|
||||||
|
|
||||||
|
1. **Map Widget**: Showing geographic distribution
|
||||||
|
2. **Counter Widgets**: Key statistics (total features, average values)
|
||||||
|
3. **Chart Widget**: Trend analysis over time
|
||||||
|
4. **Table Widget**: Detailed data view
|
||||||
|
5. **Filter Widget**: Interactive filtering controls
|
||||||
|
|
||||||
|
## API Access
|
||||||
|
|
||||||
|
Dashboards can be accessed programmatically:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# View dashboard
|
||||||
|
GET /view_dashboard.php?id={dashboard_id}
|
||||||
|
|
||||||
|
# Dashboard API
|
||||||
|
GET /dashboard_api.php?action=get&id={dashboard_id}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Dashboard Builder UI](../ui/dashboard-builder.md)
|
||||||
|
- [Map Viewer](../ui/map-viewer.md)
|
||||||
|
- [Analysis Tools](../analysis-tools/index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,262 @@
|
||||||
|
# ESRI/ArcGIS Import
|
||||||
|
|
||||||
|
Import spatial data from ArcGIS Server and ArcGIS Online services.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
ESRI/ArcGIS import allows you to harvest and import data from ArcGIS REST services, including MapServer and FeatureServer endpoints.
|
||||||
|
|
||||||
|
## Supported Services
|
||||||
|
|
||||||
|
### MapServer
|
||||||
|
|
||||||
|
- **Description**: ArcGIS MapServer REST service
|
||||||
|
- **Features**: Map layers, feature layers, group layers
|
||||||
|
- **Use Case**: Static map services, published datasets
|
||||||
|
|
||||||
|
### FeatureServer
|
||||||
|
|
||||||
|
- **Description**: ArcGIS FeatureServer REST service
|
||||||
|
- **Features**: Editable feature layers, queries
|
||||||
|
- **Use Case**: Dynamic data, editable services
|
||||||
|
|
||||||
|
### ArcGIS Online
|
||||||
|
|
||||||
|
- **Description**: ArcGIS Online hosted services
|
||||||
|
- **Features**: Public and private services
|
||||||
|
- **Use Case**: Cloud-hosted datasets
|
||||||
|
|
||||||
|
## Import Methods
|
||||||
|
|
||||||
|
### Service Browser
|
||||||
|
|
||||||
|
Browse and import from ArcGIS services:
|
||||||
|
|
||||||
|
1. Navigate to ESRI browser page
|
||||||
|
2. Enter service URL
|
||||||
|
3. Browse available layers
|
||||||
|
4. Select layer to import
|
||||||
|
5. Configure import options
|
||||||
|
6. Click "Import"
|
||||||
|
|
||||||
|
### Direct URL Import
|
||||||
|
|
||||||
|
Import directly from service URL:
|
||||||
|
|
||||||
|
1. Navigate to URL import page
|
||||||
|
2. Enter ArcGIS service URL
|
||||||
|
3. System detects service type
|
||||||
|
4. Configure import options
|
||||||
|
5. Click "Import"
|
||||||
|
|
||||||
|
## Service URL Format
|
||||||
|
|
||||||
|
### MapServer
|
||||||
|
|
||||||
|
```
|
||||||
|
https://server/arcgis/rest/services/ServiceName/MapServer
|
||||||
|
https://server/arcgis/rest/services/ServiceName/MapServer/{layerId}
|
||||||
|
```
|
||||||
|
|
||||||
|
### FeatureServer
|
||||||
|
|
||||||
|
```
|
||||||
|
https://server/arcgis/rest/services/ServiceName/FeatureServer
|
||||||
|
https://server/arcgis/rest/services/ServiceName/FeatureServer/{layerId}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ArcGIS Online
|
||||||
|
|
||||||
|
```
|
||||||
|
https://services.arcgis.com/{orgId}/arcgis/rest/services/{serviceName}/FeatureServer
|
||||||
|
```
|
||||||
|
|
||||||
|
## Import Process
|
||||||
|
|
||||||
|
### Step 1: Service Discovery
|
||||||
|
|
||||||
|
System discovers service information:
|
||||||
|
- Service type (MapServer/FeatureServer)
|
||||||
|
- Available layers
|
||||||
|
- Layer metadata
|
||||||
|
- Spatial reference system
|
||||||
|
|
||||||
|
### Step 2: Layer Selection
|
||||||
|
|
||||||
|
Select layer to import:
|
||||||
|
- Browse available layers
|
||||||
|
- View layer metadata
|
||||||
|
- Check geometry types
|
||||||
|
- Verify attribute fields
|
||||||
|
|
||||||
|
### Step 3: Query Configuration
|
||||||
|
|
||||||
|
Configure data query:
|
||||||
|
- **Where Clause**: SQL WHERE clause for filtering
|
||||||
|
- **Out Fields**: Fields to include
|
||||||
|
- **Spatial Filter**: Bounding box or geometry
|
||||||
|
- **Max Records**: Maximum features to import
|
||||||
|
|
||||||
|
### Step 4: Authentication
|
||||||
|
|
||||||
|
If required, provide credentials:
|
||||||
|
- **Username/Password**: ArcGIS credentials
|
||||||
|
- **Token**: ArcGIS token (auto-generated)
|
||||||
|
- **Anonymous**: For public services
|
||||||
|
|
||||||
|
### Step 5: Data Harvesting
|
||||||
|
|
||||||
|
Data is harvested from service:
|
||||||
|
- Paginated queries (1000 features per batch)
|
||||||
|
- Geometry conversion (ArcGIS JSON to GeoJSON)
|
||||||
|
- Attribute extraction
|
||||||
|
- Coordinate transformation
|
||||||
|
|
||||||
|
### Step 6: Import
|
||||||
|
|
||||||
|
Harvested data is imported:
|
||||||
|
- Table creation: `spatial_data_{file_id}`
|
||||||
|
- Geometry conversion to PostGIS
|
||||||
|
- Spatial index creation
|
||||||
|
- Metadata storage
|
||||||
|
|
||||||
|
## Query Parameters
|
||||||
|
|
||||||
|
### Where Clause
|
||||||
|
|
||||||
|
SQL WHERE clause for filtering:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
OBJECTID > 1000
|
||||||
|
Category = 'Residential'
|
||||||
|
Population > 50000
|
||||||
|
```
|
||||||
|
|
||||||
|
### Out Fields
|
||||||
|
|
||||||
|
Comma-separated list of fields:
|
||||||
|
|
||||||
|
```
|
||||||
|
OBJECTID,Name,Category,Population
|
||||||
|
* -- All fields
|
||||||
|
```
|
||||||
|
|
||||||
|
### Spatial Filter
|
||||||
|
|
||||||
|
Bounding box or geometry:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"geometry": {
|
||||||
|
"xmin": -180,
|
||||||
|
"ymin": -90,
|
||||||
|
"xmax": 180,
|
||||||
|
"ymax": 90,
|
||||||
|
"spatialReference": {"wkid": 4326}
|
||||||
|
},
|
||||||
|
"geometryType": "esriGeometryEnvelope"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Authentication
|
||||||
|
|
||||||
|
### Public Services
|
||||||
|
|
||||||
|
No authentication required for public services.
|
||||||
|
|
||||||
|
### Secured Services
|
||||||
|
|
||||||
|
For secured services, provide:
|
||||||
|
- **Username**: ArcGIS username
|
||||||
|
- **Password**: ArcGIS password
|
||||||
|
- **Token**: Auto-generated from credentials
|
||||||
|
|
||||||
|
### Token Management
|
||||||
|
|
||||||
|
- Tokens auto-generated from credentials
|
||||||
|
- Tokens cached for session
|
||||||
|
- Token refresh handled automatically
|
||||||
|
|
||||||
|
## Scheduled Imports
|
||||||
|
|
||||||
|
Set up recurring imports:
|
||||||
|
|
||||||
|
1. Configure ArcGIS import
|
||||||
|
2. Set schedule (daily, weekly, monthly)
|
||||||
|
3. Configure update mode
|
||||||
|
4. Save schedule
|
||||||
|
|
||||||
|
**Update Modes**:
|
||||||
|
- **Replace**: Replace all data
|
||||||
|
- **Append**: Add new data
|
||||||
|
- **Upsert**: Update existing, insert new
|
||||||
|
|
||||||
|
## Metadata Harvesting
|
||||||
|
|
||||||
|
System harvests comprehensive metadata:
|
||||||
|
- Service information
|
||||||
|
- Layer metadata
|
||||||
|
- Field definitions
|
||||||
|
- Spatial reference
|
||||||
|
- Extent information
|
||||||
|
|
||||||
|
## Example: MapServer Import
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Via browser
|
||||||
|
1. Navigate to ESRI browser
|
||||||
|
2. Enter: https://server/arcgis/rest/services/ServiceName/MapServer
|
||||||
|
3. Select layer
|
||||||
|
4. Configure query
|
||||||
|
5. Click "Harvest"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example: FeatureServer Import
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"service_url": "https://server/arcgis/rest/services/ServiceName/FeatureServer/0",
|
||||||
|
"where": "Category = 'Residential'",
|
||||||
|
"out_fields": "*",
|
||||||
|
"max_records": 10000,
|
||||||
|
"auth_username": "user",
|
||||||
|
"auth_password": "pass"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
**Service not accessible**
|
||||||
|
- Verify service URL
|
||||||
|
- Check network connectivity
|
||||||
|
- Verify service is public or provide credentials
|
||||||
|
|
||||||
|
**Authentication failed**
|
||||||
|
- Verify username/password
|
||||||
|
- Check service permissions
|
||||||
|
- Verify token endpoint accessible
|
||||||
|
|
||||||
|
**No features returned**
|
||||||
|
- Check WHERE clause syntax
|
||||||
|
- Verify layer has data
|
||||||
|
- Check spatial filter bounds
|
||||||
|
|
||||||
|
**Import timeout**
|
||||||
|
- Reduce max records
|
||||||
|
- Use spatial filter to limit data
|
||||||
|
- Consider scheduled import for large datasets
|
||||||
|
|
||||||
|
**Geometry errors**
|
||||||
|
- Verify spatial reference system
|
||||||
|
- Check for invalid geometries
|
||||||
|
- Verify geometry type compatibility
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Vector Import](vector.md)
|
||||||
|
- [Raster Import](raster.md)
|
||||||
|
- [PostGIS Import](postgis.md)
|
||||||
|
- [URL Import](vector.md#url-import)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
# Data Import Guide
|
||||||
|
|
||||||
|
Aurora GIS supports multiple methods for importing spatial data into the system.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Data can be imported from various sources:
|
||||||
|
|
||||||
|
- **File Uploads**: Direct file uploads from your computer
|
||||||
|
- **URL Imports**: Import from web-accessible URLs
|
||||||
|
- **PostGIS Remote**: Connect to external PostGIS databases
|
||||||
|
- **ESRI/ArcGIS**: Import from ArcGIS services
|
||||||
|
- **S3 Buckets**: Import from cloud storage
|
||||||
|
- **Overture Maps**: Import from Overture Maps parquet files
|
||||||
|
|
||||||
|
## Import Methods
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
vector
|
||||||
|
raster
|
||||||
|
postgis
|
||||||
|
esri
|
||||||
|
```
|
||||||
|
|
||||||
|
## General Import Process
|
||||||
|
|
||||||
|
1. **Select Import Method**: Choose the appropriate import method
|
||||||
|
2. **Configure Source**: Provide source location and credentials
|
||||||
|
3. **Set Parameters**: Configure import options (SRID, filters, etc.)
|
||||||
|
4. **Execute Import**: Start the import process
|
||||||
|
5. **Monitor Progress**: Track import status
|
||||||
|
6. **Verify Results**: Check imported dataset
|
||||||
|
|
||||||
|
## Import Options
|
||||||
|
|
||||||
|
### Update Modes
|
||||||
|
|
||||||
|
- **Replace**: Replace existing data
|
||||||
|
- **Append**: Add to existing data
|
||||||
|
- **Upsert**: Update existing, insert new
|
||||||
|
|
||||||
|
### Scheduling
|
||||||
|
|
||||||
|
- **Immediate**: Import immediately
|
||||||
|
- **Scheduled**: Schedule for later execution
|
||||||
|
- **Recurring**: Set up recurring imports
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Installation Guide](../installation.md)
|
||||||
|
- [Configuration Guide](../configuration.md)
|
||||||
|
- [Architecture Overview](../architecture.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,190 @@
|
||||||
|
# PostGIS Remote Import
|
||||||
|
|
||||||
|
Import spatial data from external PostGIS databases.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
PostGIS remote import allows you to connect to external PostgreSQL/PostGIS databases and import spatial tables as datasets in Aurora GIS.
|
||||||
|
|
||||||
|
## Connection Setup
|
||||||
|
|
||||||
|
### Create Connection
|
||||||
|
|
||||||
|
1. Navigate to PostGIS import page
|
||||||
|
2. Click "New Connection"
|
||||||
|
3. Enter connection details:
|
||||||
|
- **Host**: Database server address
|
||||||
|
- **Port**: Database port (default: 5432)
|
||||||
|
- **Database**: Database name
|
||||||
|
- **Username**: Database username
|
||||||
|
- **Password**: Database password
|
||||||
|
4. Test connection
|
||||||
|
5. Save connection
|
||||||
|
|
||||||
|
### Connection Management
|
||||||
|
|
||||||
|
- **Save Connections**: Store credentials securely (encrypted)
|
||||||
|
- **Test Connections**: Verify connectivity before import
|
||||||
|
- **Delete Connections**: Remove saved connections
|
||||||
|
|
||||||
|
## Import Process
|
||||||
|
|
||||||
|
### Step 1: Select Connection
|
||||||
|
|
||||||
|
Choose a saved PostGIS connection or enter new connection details.
|
||||||
|
|
||||||
|
### Step 2: Browse Database
|
||||||
|
|
||||||
|
Browse available schemas and tables:
|
||||||
|
- **Schemas**: List of database schemas
|
||||||
|
- **Tables**: Spatial tables in selected schema
|
||||||
|
- **Columns**: Table columns and geometry information
|
||||||
|
|
||||||
|
### Step 3: Configure Import
|
||||||
|
|
||||||
|
Set import options:
|
||||||
|
- **Schema**: Source schema name
|
||||||
|
- **Table**: Source table name
|
||||||
|
- **Geometry Column**: Geometry column name (auto-detected)
|
||||||
|
- **ID Column**: Primary key column (optional)
|
||||||
|
- **Update Mode**: Replace, append, or upsert
|
||||||
|
|
||||||
|
### Step 4: Execute Import
|
||||||
|
|
||||||
|
Import can be:
|
||||||
|
- **Materialized**: Copy data to local database
|
||||||
|
- **Foreign Table**: Create foreign table (read-only, live connection)
|
||||||
|
|
||||||
|
## Import Modes
|
||||||
|
|
||||||
|
### Materialized Import
|
||||||
|
|
||||||
|
Full data copy to local database:
|
||||||
|
- **Pros**: Fast queries, no external dependency
|
||||||
|
- **Cons**: Data duplication, requires refresh for updates
|
||||||
|
- **Use Case**: Static datasets, analysis workflows
|
||||||
|
|
||||||
|
### Foreign Table Import
|
||||||
|
|
||||||
|
Live connection to external database:
|
||||||
|
- **Pros**: Always current, no data duplication
|
||||||
|
- **Cons**: Requires external connection, slower queries
|
||||||
|
- **Use Case**: Frequently updated data, large datasets
|
||||||
|
|
||||||
|
## Update Modes
|
||||||
|
|
||||||
|
### Replace
|
||||||
|
|
||||||
|
Replace all existing data:
|
||||||
|
- Delete existing data
|
||||||
|
- Import all source data
|
||||||
|
- Use for complete refresh
|
||||||
|
|
||||||
|
### Append
|
||||||
|
|
||||||
|
Add new data to existing:
|
||||||
|
- Keep existing data
|
||||||
|
- Add new records
|
||||||
|
- Use for incremental updates
|
||||||
|
|
||||||
|
### Upsert
|
||||||
|
|
||||||
|
Update existing, insert new:
|
||||||
|
- Requires key columns
|
||||||
|
- Updates matching records
|
||||||
|
- Inserts new records
|
||||||
|
- Use for incremental updates with changes
|
||||||
|
|
||||||
|
## Scheduled Imports
|
||||||
|
|
||||||
|
Set up recurring imports:
|
||||||
|
|
||||||
|
1. Configure import
|
||||||
|
2. Set schedule:
|
||||||
|
- **Daily**: Run at specified time
|
||||||
|
- **Weekly**: Run on specified day
|
||||||
|
- **Monthly**: Run on specified date
|
||||||
|
3. Configure update mode
|
||||||
|
4. Save schedule
|
||||||
|
|
||||||
|
## Refresh Import
|
||||||
|
|
||||||
|
Manually refresh existing imports:
|
||||||
|
|
||||||
|
1. Navigate to import history
|
||||||
|
2. Select import to refresh
|
||||||
|
3. Click "Refresh"
|
||||||
|
4. System re-imports data using original settings
|
||||||
|
|
||||||
|
## Connection Security
|
||||||
|
|
||||||
|
### Credential Storage
|
||||||
|
|
||||||
|
- Passwords encrypted in database
|
||||||
|
- Secure connection testing
|
||||||
|
- Access control per user
|
||||||
|
|
||||||
|
### Network Security
|
||||||
|
|
||||||
|
- Use SSL connections when available
|
||||||
|
- Configure firewall rules
|
||||||
|
- Use VPN for remote databases
|
||||||
|
|
||||||
|
## Example: Materialized Import
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"connection_id": 1,
|
||||||
|
"schema": "public",
|
||||||
|
"table": "parcels",
|
||||||
|
"geometry_column": "geom",
|
||||||
|
"id_column": "parcel_id",
|
||||||
|
"update_mode": "replace",
|
||||||
|
"materialize": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example: Foreign Table Import
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"connection_id": 1,
|
||||||
|
"schema": "public",
|
||||||
|
"table": "parcels",
|
||||||
|
"geometry_column": "geom",
|
||||||
|
"materialize": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
**Connection failed**
|
||||||
|
- Verify host, port, database name
|
||||||
|
- Check network connectivity
|
||||||
|
- Verify credentials
|
||||||
|
- Check firewall rules
|
||||||
|
|
||||||
|
**Table not found**
|
||||||
|
- Verify schema name
|
||||||
|
- Check table exists
|
||||||
|
- Verify user permissions
|
||||||
|
|
||||||
|
**Geometry column not detected**
|
||||||
|
- Ensure PostGIS extension enabled
|
||||||
|
- Check geometry column type
|
||||||
|
- Verify spatial reference system
|
||||||
|
|
||||||
|
**Import timeout**
|
||||||
|
- Check table size
|
||||||
|
- Use materialized import for large tables
|
||||||
|
- Consider filtering data
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Vector Import](vector.md)
|
||||||
|
- [Raster Import](raster.md)
|
||||||
|
- [ESRI Import](esri.md)
|
||||||
|
- [Configuration Guide](../configuration.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,213 @@
|
||||||
|
# Raster Data Import
|
||||||
|
|
||||||
|
Import raster data from files, URLs, or cloud storage.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Raster data import supports multiple formats and import methods for grid-based spatial data.
|
||||||
|
|
||||||
|
## Supported Formats
|
||||||
|
|
||||||
|
### GeoTIFF
|
||||||
|
|
||||||
|
- **Extension**: `.tif`, `.tiff`, `.gtif`
|
||||||
|
- **Description**: Georeferenced TIFF format
|
||||||
|
- **Features**: Full support for multi-band rasters, overviews, compression
|
||||||
|
|
||||||
|
### Cloud Optimized GeoTIFF (COG)
|
||||||
|
|
||||||
|
- **Extension**: `.tif`, `.tiff`
|
||||||
|
- **Description**: Cloud-optimized GeoTIFF format
|
||||||
|
- **Features**: Optimized for cloud storage and streaming
|
||||||
|
- **Benefits**: Efficient access to large rasters
|
||||||
|
|
||||||
|
### Other Formats
|
||||||
|
|
||||||
|
- **JPEG2000**: `.jp2`, `.j2k`
|
||||||
|
- **PNG**: `.png` (with world file)
|
||||||
|
- **NetCDF**: `.nc`, `.nc4`
|
||||||
|
- **HDF**: `.hdf`, `.h5`
|
||||||
|
|
||||||
|
## Import Methods
|
||||||
|
|
||||||
|
### File Upload
|
||||||
|
|
||||||
|
Upload raster files directly:
|
||||||
|
|
||||||
|
1. Navigate to raster upload page
|
||||||
|
2. Select file or drag and drop
|
||||||
|
3. Add optional description
|
||||||
|
4. Configure import options
|
||||||
|
5. Click "Upload"
|
||||||
|
|
||||||
|
**File Size Limit**: Configurable (default: 100MB+)
|
||||||
|
|
||||||
|
### URL Import
|
||||||
|
|
||||||
|
Import from web-accessible URLs:
|
||||||
|
|
||||||
|
1. Navigate to URL import page
|
||||||
|
2. Enter raster URL
|
||||||
|
3. Configure import options
|
||||||
|
4. Optionally schedule import
|
||||||
|
5. Click "Import"
|
||||||
|
|
||||||
|
### S3 Bucket Import
|
||||||
|
|
||||||
|
Import from AWS S3 buckets:
|
||||||
|
|
||||||
|
1. Navigate to S3 import page
|
||||||
|
2. Configure AWS credentials
|
||||||
|
3. Select bucket and file
|
||||||
|
4. Configure import mode
|
||||||
|
5. Click "Import"
|
||||||
|
|
||||||
|
**Import Modes**:
|
||||||
|
- **Serve COG**: Register as remote COG (no download)
|
||||||
|
- **Download PostGIS**: Download and import to PostGIS
|
||||||
|
|
||||||
|
### GeoServer Import
|
||||||
|
|
||||||
|
Import from GeoServer WCS:
|
||||||
|
|
||||||
|
1. Navigate to GeoServer import page
|
||||||
|
2. Select workspace and layer
|
||||||
|
3. Configure import options
|
||||||
|
4. Click "Import"
|
||||||
|
|
||||||
|
## Import Process
|
||||||
|
|
||||||
|
### Step 1: File Validation
|
||||||
|
|
||||||
|
Raster file is validated:
|
||||||
|
- Format detection
|
||||||
|
- GDAL availability check
|
||||||
|
- File integrity verification
|
||||||
|
- Metadata extraction
|
||||||
|
|
||||||
|
### Step 2: Metadata Extraction
|
||||||
|
|
||||||
|
Metadata extracted using GDAL:
|
||||||
|
- Spatial reference system (SRID)
|
||||||
|
- Bounding box
|
||||||
|
- Pixel size
|
||||||
|
- Band count
|
||||||
|
- Data type
|
||||||
|
- NoData values
|
||||||
|
|
||||||
|
### Step 3: PostGIS Import
|
||||||
|
|
||||||
|
Raster imported into PostGIS using `raster2pgsql`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
raster2pgsql -s {srid} -t {tile_size} {file} {schema}.{table} | psql
|
||||||
|
```
|
||||||
|
|
||||||
|
**Options**:
|
||||||
|
- **Tile Size**: Default 256x256 pixels
|
||||||
|
- **Schema**: Default 'public'
|
||||||
|
- **Table Name**: Auto-generated or specified
|
||||||
|
- **SRID**: Detected from file or specified
|
||||||
|
|
||||||
|
### Step 4: Registration
|
||||||
|
|
||||||
|
Raster registered in system:
|
||||||
|
- Metadata stored in `aurora_raster_layers` table
|
||||||
|
- Layer name assigned
|
||||||
|
- Access permissions set
|
||||||
|
- Preview generation
|
||||||
|
|
||||||
|
## Configuration Options
|
||||||
|
|
||||||
|
### Tile Size
|
||||||
|
|
||||||
|
Configure raster tiling:
|
||||||
|
- **256x256**: Default, good for most cases
|
||||||
|
- **512x512**: Larger tiles, fewer database rows
|
||||||
|
- **128x128**: Smaller tiles, more database rows
|
||||||
|
|
||||||
|
### Import Mode
|
||||||
|
|
||||||
|
For S3/URL imports:
|
||||||
|
- **Serve COG**: Register remote COG, no local storage
|
||||||
|
- **Download PostGIS**: Download and import to PostGIS
|
||||||
|
|
||||||
|
### Compression
|
||||||
|
|
||||||
|
Configure raster compression:
|
||||||
|
- **None**: No compression
|
||||||
|
- **JPEG**: Lossy compression
|
||||||
|
- **LZW**: Lossless compression
|
||||||
|
- **Deflate**: Lossless compression
|
||||||
|
|
||||||
|
## Example: GeoTIFF Upload
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Via API
|
||||||
|
curl -X POST "https://example.com/raster_upload.php" \
|
||||||
|
-F "raster_file=@elevation.tif" \
|
||||||
|
-F "description=Digital elevation model" \
|
||||||
|
-F "tile_size=256x256"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example: S3 Import
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Via API
|
||||||
|
curl -X POST "https://example.com/raster_bucket_import_api.php" \
|
||||||
|
-d "url=s3://bucket/path/to/raster.tif" \
|
||||||
|
-d "mode=download_postgis" \
|
||||||
|
-d "aws_access_key_id=..." \
|
||||||
|
-d "aws_secret_access_key=..."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Cloud Optimized GeoTIFF (COG)
|
||||||
|
|
||||||
|
COG format provides:
|
||||||
|
- **Efficient Streaming**: Access specific regions without full download
|
||||||
|
- **Cloud Storage**: Optimized for S3, Azure, GCS
|
||||||
|
- **Performance**: Fast access to large rasters
|
||||||
|
- **Cost Effective**: Reduced bandwidth usage
|
||||||
|
|
||||||
|
### Creating COGs
|
||||||
|
|
||||||
|
Use GDAL to create COG:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gdal_translate input.tif output.tif \
|
||||||
|
-of COG \
|
||||||
|
-co COMPRESS=LZW \
|
||||||
|
-co TILED=YES
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
**GDAL not available**
|
||||||
|
- Install GDAL: `apt-get install gdal-bin` (Ubuntu)
|
||||||
|
- Verify: `gdalinfo --version`
|
||||||
|
- Check PATH configuration
|
||||||
|
|
||||||
|
**Large file timeout**
|
||||||
|
- Increase PHP execution time
|
||||||
|
- Use background import
|
||||||
|
- Consider chunked upload
|
||||||
|
|
||||||
|
**SRID not detected**
|
||||||
|
- Check raster metadata
|
||||||
|
- Specify SRID manually
|
||||||
|
- Verify projection information
|
||||||
|
|
||||||
|
**Memory issues**
|
||||||
|
- Increase PHP memory limit
|
||||||
|
- Use tile-based processing
|
||||||
|
- Consider resampling large rasters
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Vector Import](vector.md)
|
||||||
|
- [PostGIS Import](postgis.md)
|
||||||
|
- [ESRI Import](esri.md)
|
||||||
|
- [Raster Analysis Tools](../analysis-tools/raster-histogram.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,210 @@
|
||||||
|
# Vector Data Import
|
||||||
|
|
||||||
|
Import vector spatial data from files or URLs.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Vector data import supports multiple file formats and import methods for point, line, and polygon data.
|
||||||
|
|
||||||
|
## Supported Formats
|
||||||
|
|
||||||
|
### GeoJSON
|
||||||
|
|
||||||
|
- **Extension**: `.geojson`, `.json`
|
||||||
|
- **Description**: GeoJSON Feature Collections
|
||||||
|
- **Features**: Full support for all geometry types and properties
|
||||||
|
|
||||||
|
### Shapefile
|
||||||
|
|
||||||
|
- **Extension**: `.shp`, `.zip` (containing shapefile components)
|
||||||
|
- **Description**: ESRI Shapefile format
|
||||||
|
- **Requirements**: ZIP archive must contain `.shp`, `.shx`, `.dbf` files
|
||||||
|
- **Note**: `.prj` file recommended for proper coordinate system
|
||||||
|
|
||||||
|
### KML
|
||||||
|
|
||||||
|
- **Extension**: `.kml`
|
||||||
|
- **Description**: Google Earth KML format
|
||||||
|
- **Features**: Supports placemarks, paths, and polygons
|
||||||
|
|
||||||
|
### CSV
|
||||||
|
|
||||||
|
- **Extension**: `.csv`
|
||||||
|
- **Description**: Comma-separated values with coordinates
|
||||||
|
- **Requirements**: Must have coordinate columns (lat/lon or x/y)
|
||||||
|
- **Features**: Automatic column detection
|
||||||
|
|
||||||
|
### GeoPackage
|
||||||
|
|
||||||
|
- **Extension**: `.gpkg`
|
||||||
|
- **Description**: OGC GeoPackage format
|
||||||
|
- **Features**: Supports multiple layers and raster data
|
||||||
|
|
||||||
|
### DXF
|
||||||
|
|
||||||
|
- **Extension**: `.dxf`
|
||||||
|
- **Description**: AutoCAD DXF format
|
||||||
|
- **Features**: Supports CAD drawings and annotations
|
||||||
|
|
||||||
|
### PBF
|
||||||
|
|
||||||
|
- **Extension**: `.pbf`
|
||||||
|
- **Description**: OpenStreetMap Protocol Buffer Format
|
||||||
|
- **Requirements**: `osm2pgsql` must be installed
|
||||||
|
- **Features**: High-performance OSM data import
|
||||||
|
|
||||||
|
## Import Methods
|
||||||
|
|
||||||
|
### File Upload
|
||||||
|
|
||||||
|
Upload files directly from your computer:
|
||||||
|
|
||||||
|
1. Navigate to upload page
|
||||||
|
2. Select file or drag and drop
|
||||||
|
3. Add optional description
|
||||||
|
4. Select target SRS (default: EPSG:4326)
|
||||||
|
5. Click "Upload"
|
||||||
|
|
||||||
|
**File Size Limit**: 50MB (configurable)
|
||||||
|
|
||||||
|
### URL Import
|
||||||
|
|
||||||
|
Import from web-accessible URLs:
|
||||||
|
|
||||||
|
1. Navigate to URL import page
|
||||||
|
2. Enter data URL
|
||||||
|
3. Configure import options
|
||||||
|
4. Optionally schedule import
|
||||||
|
5. Click "Import"
|
||||||
|
|
||||||
|
**Supported URL Types**:
|
||||||
|
- Direct file URLs
|
||||||
|
- GeoJSON service endpoints
|
||||||
|
- ArcGIS REST services
|
||||||
|
- WFS endpoints
|
||||||
|
|
||||||
|
### Scheduled Import
|
||||||
|
|
||||||
|
Set up recurring imports from URLs:
|
||||||
|
|
||||||
|
1. Configure URL import
|
||||||
|
2. Set schedule (daily, weekly, monthly)
|
||||||
|
3. Configure update mode (replace, append, upsert)
|
||||||
|
4. Save schedule
|
||||||
|
|
||||||
|
## Import Process
|
||||||
|
|
||||||
|
### Step 1: File Detection
|
||||||
|
|
||||||
|
The system automatically detects file type based on:
|
||||||
|
- File extension
|
||||||
|
- File content (for ambiguous extensions)
|
||||||
|
- ZIP archive contents
|
||||||
|
|
||||||
|
### Step 2: Metadata Extraction
|
||||||
|
|
||||||
|
Metadata is extracted including:
|
||||||
|
- Feature count
|
||||||
|
- Geometry types
|
||||||
|
- Bounding box
|
||||||
|
- Coordinate system
|
||||||
|
- Attribute fields
|
||||||
|
|
||||||
|
### Step 3: Data Processing
|
||||||
|
|
||||||
|
Data is processed based on file type:
|
||||||
|
- **GeoJSON**: Direct parsing and import
|
||||||
|
- **Shapefile**: Extraction from ZIP, coordinate transformation
|
||||||
|
- **CSV**: Coordinate column detection, geometry creation
|
||||||
|
- **KML**: Placemark and geometry extraction
|
||||||
|
- **PBF**: OSM data processing via osm2pgsql
|
||||||
|
|
||||||
|
### Step 4: PostGIS Import
|
||||||
|
|
||||||
|
Processed data is imported into PostGIS:
|
||||||
|
- Table creation: `spatial_data_{file_id}`
|
||||||
|
- Geometry conversion to PostGIS format
|
||||||
|
- Spatial index creation
|
||||||
|
- Attribute storage in JSONB
|
||||||
|
|
||||||
|
### Step 5: Registration
|
||||||
|
|
||||||
|
Dataset is registered in the system:
|
||||||
|
- Metadata stored in `spatial_files` table
|
||||||
|
- Access permissions set
|
||||||
|
- Version record created
|
||||||
|
|
||||||
|
## Configuration Options
|
||||||
|
|
||||||
|
### Target SRS
|
||||||
|
|
||||||
|
Select target spatial reference system:
|
||||||
|
- **EPSG:4326** (WGS84): Default, global coverage
|
||||||
|
- **EPSG:3857** (Web Mercator): Web mapping standard
|
||||||
|
- **Other**: Any valid EPSG code
|
||||||
|
|
||||||
|
### Update Mode
|
||||||
|
|
||||||
|
For scheduled imports:
|
||||||
|
- **Replace**: Replace all existing data
|
||||||
|
- **Append**: Add new data to existing
|
||||||
|
- **Upsert**: Update existing, insert new (requires key columns)
|
||||||
|
|
||||||
|
### Filters
|
||||||
|
|
||||||
|
Apply filters during import:
|
||||||
|
- **Spatial Filter**: Bounding box or geometry
|
||||||
|
- **Attribute Filter**: SQL WHERE clause
|
||||||
|
- **Feature Limit**: Maximum number of features
|
||||||
|
|
||||||
|
## Example: GeoJSON Import
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Via API
|
||||||
|
curl -X POST "https://example.com/upload.php" \
|
||||||
|
-F "spatial_file=@data.geojson" \
|
||||||
|
-F "description=Sample dataset" \
|
||||||
|
-F "targetSRS=EPSG:4326"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example: URL Import
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Via API
|
||||||
|
curl -X POST "https://example.com/import_url.php" \
|
||||||
|
-d "url=https://example.com/data.geojson" \
|
||||||
|
-d "description=Imported from URL" \
|
||||||
|
-d "targetSRS=EPSG:4326"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
**File too large**
|
||||||
|
- Check file size limit configuration
|
||||||
|
- Consider splitting large files
|
||||||
|
- Use URL import for very large files
|
||||||
|
|
||||||
|
**Invalid geometry**
|
||||||
|
- Verify coordinate system
|
||||||
|
- Check for invalid geometries in source
|
||||||
|
- Use geometry validation tools
|
||||||
|
|
||||||
|
**Missing coordinate system**
|
||||||
|
- Ensure `.prj` file included for shapefiles
|
||||||
|
- Specify target SRS manually
|
||||||
|
- Check source data metadata
|
||||||
|
|
||||||
|
**Import timeout**
|
||||||
|
- Increase PHP execution time limit
|
||||||
|
- Use background import for large files
|
||||||
|
- Consider chunked upload for very large files
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Raster Import](raster.md)
|
||||||
|
- [PostGIS Import](postgis.md)
|
||||||
|
- [ESRI Import](esri.md)
|
||||||
|
- [Installation Guide](../installation.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,129 @@
|
||||||
|
# Aurora GIS Documentation
|
||||||
|
|
||||||
|
Welcome to the Aurora GIS documentation. Aurora GIS is a comprehensive PHP-based web application for managing, analyzing, and visualizing geospatial data using PostgreSQL and PostGIS.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Aurora GIS provides a complete solution for:
|
||||||
|
|
||||||
|
- **Data Management**: Upload, import, and manage spatial datasets in multiple formats
|
||||||
|
- **Spatial Analysis**: Perform advanced geospatial analysis including hotspot detection, outlier analysis, KDE, clustering, and more
|
||||||
|
- **Data Visualization**: Interactive maps, dashboards, and charts
|
||||||
|
- **Background Processing**: Asynchronous job processing for long-running operations
|
||||||
|
- **API Access**: RESTful API for programmatic access to datasets and analysis tools
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
1. [Installation Guide](installation.md) - Set up Aurora GIS on your server
|
||||||
|
2. [Configuration](configuration.md) - Configure database, authentication, and system settings
|
||||||
|
3. [Architecture Overview](architecture.md) - Understand the system architecture
|
||||||
|
|
||||||
|
## Documentation Sections
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Getting Started
|
||||||
|
|
||||||
|
installation
|
||||||
|
configuration
|
||||||
|
architecture
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Data Import
|
||||||
|
|
||||||
|
import/index
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: API Reference
|
||||||
|
|
||||||
|
api/index
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Workers
|
||||||
|
|
||||||
|
workers/index
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Analysis Tools
|
||||||
|
|
||||||
|
analysis-tools/index
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: User Interface
|
||||||
|
|
||||||
|
ui/index
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Content & Applications
|
||||||
|
|
||||||
|
dashboard
|
||||||
|
web-apps
|
||||||
|
accordion
|
||||||
|
```
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 1
|
||||||
|
:caption: Additional Resources
|
||||||
|
|
||||||
|
changelog
|
||||||
|
```
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
### Data Import & Management
|
||||||
|
- **Vector Formats**: GeoJSON, Shapefiles, KML, CSV, GeoPackage, DXF, PBF
|
||||||
|
- **Raster Formats**: GeoTIFF, COG, JPEG2000, NetCDF, HDF
|
||||||
|
- **URL-based imports** with scheduling
|
||||||
|
- **PostGIS remote** database connections
|
||||||
|
- **ESRI/ArcGIS** service imports
|
||||||
|
- **Overture Maps** integration
|
||||||
|
- **S3 bucket** imports
|
||||||
|
|
||||||
|
### Spatial Analysis
|
||||||
|
- **Hot Spot Analysis**: Identify statistically significant clusters using Getis-Ord Gi* statistics
|
||||||
|
- **Outlier Detection**: Find statistical outliers using z-score or MAD methods
|
||||||
|
- **KDE (Kernel Density Estimation)**: Generate density surfaces from point data
|
||||||
|
- **Clustering**: Group features based on spatial proximity
|
||||||
|
- **Zonal Statistics**: Calculate statistics for raster data within polygon zones
|
||||||
|
- **Proximity Analysis**: Buffer, nearest neighbor, and distance calculations
|
||||||
|
- **Overlay Operations**: Intersect, union, erase, and join operations
|
||||||
|
|
||||||
|
### Background Processing
|
||||||
|
- Asynchronous job processing for long-running operations
|
||||||
|
- Worker-based architecture for scalable processing
|
||||||
|
- Job status tracking and monitoring
|
||||||
|
- Support for scheduled imports and analysis
|
||||||
|
|
||||||
|
### Visualization
|
||||||
|
- Interactive Leaflet.js maps
|
||||||
|
- **Dashboard Builder**: Create custom dashboards with multiple widgets
|
||||||
|
- **Web Apps**: Build multi-page applications with custom layouts
|
||||||
|
- **Accordion Stories**: Create narrative content with expandable sections
|
||||||
|
- Chart generation from spatial data
|
||||||
|
- Layer styling and legend management
|
||||||
|
- Popup configuration for feature details
|
||||||
|
|
||||||
|
## System Requirements
|
||||||
|
|
||||||
|
- PHP 7.4 or higher
|
||||||
|
- PostgreSQL 12+ with PostGIS extension
|
||||||
|
- Web server (Apache/Nginx)
|
||||||
|
- PHP extensions: PDO, PDO_PGSQL, JSON, ZIP, GDAL (for raster operations)
|
||||||
|
- Optional: DuckDB (for Overture Maps), QGIS Server (for QGIS projects)
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues, questions, or contributions, please refer to the relevant documentation sections or contact the development team.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,273 @@
|
||||||
|
# Installation Guide
|
||||||
|
|
||||||
|
This guide will walk you through installing and setting up Aurora GIS on your server.
|
||||||
|
|
||||||
|
## System Requirements
|
||||||
|
|
||||||
|
### Server Requirements
|
||||||
|
|
||||||
|
- **PHP**: 7.4 or higher
|
||||||
|
- **PostgreSQL**: 12 or higher
|
||||||
|
- **PostGIS**: 3.0 or higher
|
||||||
|
- **Web Server**: Apache 2.4+ or Nginx 1.18+
|
||||||
|
- **Operating System**: Linux (Ubuntu/Debian recommended), macOS, or Windows
|
||||||
|
|
||||||
|
### PHP Extensions
|
||||||
|
|
||||||
|
Required PHP extensions:
|
||||||
|
- `pdo`
|
||||||
|
- `pdo_pgsql`
|
||||||
|
- `json`
|
||||||
|
- `zip`
|
||||||
|
- `gd` (for image processing)
|
||||||
|
- `curl` (for URL imports)
|
||||||
|
|
||||||
|
Optional but recommended:
|
||||||
|
- `gdal` (for advanced raster operations)
|
||||||
|
- `mbstring` (for string handling)
|
||||||
|
|
||||||
|
### Optional Dependencies
|
||||||
|
|
||||||
|
- **DuckDB**: For Overture Maps parquet processing
|
||||||
|
- **QGIS Server**: For QGIS project rendering
|
||||||
|
- **GeoServer**: For advanced WMS/WFS services
|
||||||
|
- **pg_tileserv**: For vector tile generation
|
||||||
|
|
||||||
|
## Installation Steps
|
||||||
|
|
||||||
|
### 1. Install PostgreSQL and PostGIS
|
||||||
|
|
||||||
|
#### Ubuntu/Debian
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install PostgreSQL and PostGIS
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install postgresql postgresql-contrib postgis
|
||||||
|
|
||||||
|
# Enable PostGIS extension
|
||||||
|
sudo -u postgres psql -c "CREATE EXTENSION IF NOT EXISTS postgis;"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### macOS (Homebrew)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew install postgresql postgis
|
||||||
|
brew services start postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Windows
|
||||||
|
|
||||||
|
Download and install from:
|
||||||
|
- PostgreSQL: https://www.postgresql.org/download/windows/
|
||||||
|
- PostGIS: https://postgis.net/windows_downloads/
|
||||||
|
|
||||||
|
### 2. Create Database
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create database user
|
||||||
|
sudo -u postgres createuser -P aurora_user
|
||||||
|
|
||||||
|
# Create database
|
||||||
|
sudo -u postgres createdb -O aurora_user aurora_gis
|
||||||
|
|
||||||
|
# Enable PostGIS extension
|
||||||
|
sudo -u postgres psql -d aurora_gis -c "CREATE EXTENSION IF NOT EXISTS postgis;"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Install Application Files
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone or download the application
|
||||||
|
cd /var/www/html # or your web server directory
|
||||||
|
git clone <repository-url> aurora-gis
|
||||||
|
cd aurora-gis
|
||||||
|
|
||||||
|
# Set proper permissions
|
||||||
|
sudo chown -R www-data:www-data .
|
||||||
|
sudo chmod -R 755 .
|
||||||
|
sudo chmod -R 775 uploads/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Configure Web Server
|
||||||
|
|
||||||
|
#### Apache Configuration
|
||||||
|
|
||||||
|
Create or edit `/etc/apache2/sites-available/aurora-gis.conf`:
|
||||||
|
|
||||||
|
```apache
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerName aurora-gis.local
|
||||||
|
DocumentRoot /var/www/html/aurora-gis
|
||||||
|
|
||||||
|
<Directory /var/www/html/aurora-gis>
|
||||||
|
Options Indexes FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
ErrorLog ${APACHE_LOG_DIR}/aurora-gis_error.log
|
||||||
|
CustomLog ${APACHE_LOG_DIR}/aurora-gis_access.log combined
|
||||||
|
</VirtualHost>
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable the site:
|
||||||
|
```bash
|
||||||
|
sudo a2ensite aurora-gis
|
||||||
|
sudo systemctl reload apache2
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Nginx Configuration
|
||||||
|
|
||||||
|
Create `/etc/nginx/sites-available/aurora-gis`:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name aurora-gis.local;
|
||||||
|
root /var/www/html/aurora-gis;
|
||||||
|
index index.php;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$query_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
|
||||||
|
fastcgi_index index.php;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable the site:
|
||||||
|
```bash
|
||||||
|
sudo ln -s /etc/nginx/sites-available/aurora-gis /etc/nginx/sites-enabled/
|
||||||
|
sudo nginx -t
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Initialize Application
|
||||||
|
|
||||||
|
1. Open your web browser and navigate to:
|
||||||
|
```
|
||||||
|
http://your-server/initialize.php
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Fill in the initialization form:
|
||||||
|
- **Database Host**: `localhost` (or your PostgreSQL host)
|
||||||
|
- **Database Name**: `aurora_gis`
|
||||||
|
- **Database User**: `aurora_user`
|
||||||
|
- **Database Password**: Your database password
|
||||||
|
- **Database Port**: `5432` (default)
|
||||||
|
- **Admin Email**: Your admin email address
|
||||||
|
- **Admin Password**: Choose a secure password
|
||||||
|
|
||||||
|
3. Click "Initialize" to:
|
||||||
|
- Create the `config/const.php` file with database credentials
|
||||||
|
- Create all required database tables
|
||||||
|
- Create the initial admin user
|
||||||
|
- Set up required directories
|
||||||
|
|
||||||
|
### 6. Verify Installation
|
||||||
|
|
||||||
|
After initialization, you should be able to:
|
||||||
|
|
||||||
|
1. Log in with your admin credentials at the login page
|
||||||
|
2. Access the home page and see the dashboard
|
||||||
|
3. Upload a test dataset to verify functionality
|
||||||
|
|
||||||
|
## Post-Installation Setup
|
||||||
|
|
||||||
|
### Create Required Directories
|
||||||
|
|
||||||
|
The initialization script creates most directories, but you may need to create additional ones:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p uploads/geoserver_documents
|
||||||
|
mkdir -p uploads/tabular
|
||||||
|
mkdir -p uploads/raster
|
||||||
|
mkdir -p uploads/qgis
|
||||||
|
mkdir -p logs
|
||||||
|
chmod -R 775 uploads/
|
||||||
|
chmod -R 775 logs/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure Background Workers
|
||||||
|
|
||||||
|
Background workers process long-running jobs. Set them up as systemd services:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Copy systemd service files
|
||||||
|
sudo cp systemd/*.service /etc/systemd/system/
|
||||||
|
|
||||||
|
# Enable and start workers
|
||||||
|
sudo systemctl enable hotspot_worker.service
|
||||||
|
sudo systemctl start hotspot_worker.service
|
||||||
|
# Repeat for other workers as needed
|
||||||
|
```
|
||||||
|
|
||||||
|
See the [Workers Documentation](workers/index.md) for details on each worker.
|
||||||
|
|
||||||
|
### Optional: Install DuckDB (for Overture Maps)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Ubuntu/Debian
|
||||||
|
sudo snap install duckdb
|
||||||
|
|
||||||
|
# Or download binary from https://duckdb.org/docs/installation/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Optional: Install QGIS Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Ubuntu/Debian
|
||||||
|
sudo apt-get install qgis-server qgis-server-plugin
|
||||||
|
|
||||||
|
# Configure QGIS Server
|
||||||
|
sudo systemctl enable qgis-server
|
||||||
|
sudo systemctl start qgis-server
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Database Connection Issues
|
||||||
|
|
||||||
|
- Verify PostgreSQL is running: `sudo systemctl status postgresql`
|
||||||
|
- Check database credentials in `config/const.php`
|
||||||
|
- Ensure PostGIS extension is enabled: `psql -d aurora_gis -c "\dx"`
|
||||||
|
- Check PostgreSQL logs: `/var/log/postgresql/postgresql-*.log`
|
||||||
|
|
||||||
|
### Permission Issues
|
||||||
|
|
||||||
|
- Ensure web server user (www-data/apache) has read/write access to:
|
||||||
|
- `uploads/` directory
|
||||||
|
- `logs/` directory
|
||||||
|
- `config/const.php` (read-only after initialization)
|
||||||
|
|
||||||
|
### PHP Errors
|
||||||
|
|
||||||
|
- Check PHP error log: `/var/log/php-errors.log` or `php.ini` location
|
||||||
|
- Verify all required PHP extensions are installed: `php -m`
|
||||||
|
- Check PHP version: `php -v` (should be 7.4+)
|
||||||
|
|
||||||
|
### PostGIS Issues
|
||||||
|
|
||||||
|
- Verify PostGIS is installed: `psql -d aurora_gis -c "SELECT PostGIS_version();"`
|
||||||
|
- Check spatial reference systems: `psql -d aurora_gis -c "SELECT COUNT(*) FROM spatial_ref_sys;"`
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
After successful installation:
|
||||||
|
|
||||||
|
1. Review [Configuration](configuration.md) for system settings
|
||||||
|
2. Read [Architecture Overview](architecture.md) to understand the system
|
||||||
|
3. Explore [API Documentation](api/index.md) for programmatic access
|
||||||
|
4. Check [Analysis Tools](analysis-tools/index.md) for available features
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Configuration Guide](configuration.md)
|
||||||
|
- [Architecture Overview](architecture.md)
|
||||||
|
- [Workers Documentation](workers/index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
# Analysis Panel
|
||||||
|
|
||||||
|
The analysis panel provides integrated access to spatial analysis tools within the map viewer.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The analysis panel is accessible from the map viewer and provides quick access to analysis tools without leaving the map interface.
|
||||||
|
|
||||||
|
## Available Tools
|
||||||
|
|
||||||
|
### Proximity Analysis
|
||||||
|
|
||||||
|
- **Buffer**: Create buffer zones
|
||||||
|
- **Nearest**: Find nearest neighbors
|
||||||
|
- **Proximity**: Distance calculations
|
||||||
|
- **Center & Dispersion**: Central tendency analysis
|
||||||
|
- **Outliers**: Statistical outlier detection
|
||||||
|
|
||||||
|
### Overlay Operations
|
||||||
|
|
||||||
|
- **Intersect**: Find overlapping features
|
||||||
|
- **Overlay Layers**: Combine multiple layers
|
||||||
|
- **Join**: Spatial joins
|
||||||
|
- **Join Features (Aggregated)**: Aggregated joins
|
||||||
|
- **Summarize Within**: Zonal statistics
|
||||||
|
- **Summarize Nearby**: Proximity-based summaries
|
||||||
|
- **Erase**: Remove overlapping features
|
||||||
|
|
||||||
|
### Spatial Analysis
|
||||||
|
|
||||||
|
- **Clustering**: Group features
|
||||||
|
- **Heatmap**: Density visualization
|
||||||
|
- **Hot Spots**: Getis-Ord Gi* analysis
|
||||||
|
- **Outliers**: Statistical outliers
|
||||||
|
|
||||||
|
### Raster Tools
|
||||||
|
|
||||||
|
- **Identify Pixel Value**: Query pixel values
|
||||||
|
- **Zonal Statistics**: Calculate zone statistics
|
||||||
|
- **Raster Histogram**: Value distribution
|
||||||
|
- **Raster Summary**: Summary statistics
|
||||||
|
- **Raster Profile**: Extract profiles
|
||||||
|
- **Raster Conversion**: Format conversion
|
||||||
|
- **Raster Comparison**: Compare rasters
|
||||||
|
|
||||||
|
## Tool Execution
|
||||||
|
|
||||||
|
### Quick Analysis
|
||||||
|
|
||||||
|
- Select tool from panel
|
||||||
|
- Configure parameters
|
||||||
|
- Run analysis
|
||||||
|
- View results on map
|
||||||
|
|
||||||
|
### Background Processing
|
||||||
|
|
||||||
|
- Long-running analyses run as background jobs
|
||||||
|
- Job status displayed
|
||||||
|
- Results appear when complete
|
||||||
|
- Notification on completion
|
||||||
|
|
||||||
|
## Results Display
|
||||||
|
|
||||||
|
- Results added as new layers
|
||||||
|
- Automatic styling applied
|
||||||
|
- Legend generation
|
||||||
|
- Popup configuration
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis Tools](../analysis-tools/index.md)
|
||||||
|
- [Map Viewer](map-viewer.md)
|
||||||
|
- [Workers](../workers/index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,107 @@
|
||||||
|
# Dashboard Builder
|
||||||
|
|
||||||
|
The dashboard builder allows users to create custom data dashboards with multiple widgets.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The dashboard builder (`dashboard_builder.php`) provides a drag-and-drop interface for creating interactive dashboards.
|
||||||
|
|
||||||
|
## Widgets
|
||||||
|
|
||||||
|
### Map Widget
|
||||||
|
|
||||||
|
- Interactive map display
|
||||||
|
- Multiple dataset layers
|
||||||
|
- Styling and configuration
|
||||||
|
- Basemap selection
|
||||||
|
|
||||||
|
### Chart Widget
|
||||||
|
|
||||||
|
- Bar charts
|
||||||
|
- Line charts
|
||||||
|
- Pie charts
|
||||||
|
- Scatter plots
|
||||||
|
- Time series charts
|
||||||
|
|
||||||
|
### Table Widget
|
||||||
|
|
||||||
|
- Data table display
|
||||||
|
- Sorting and filtering
|
||||||
|
- Pagination
|
||||||
|
- Export options
|
||||||
|
|
||||||
|
### Counter Widget
|
||||||
|
|
||||||
|
- Count of features
|
||||||
|
- Sum of numeric values
|
||||||
|
- Average of numeric values
|
||||||
|
- Custom calculations
|
||||||
|
|
||||||
|
### Filter Widget
|
||||||
|
|
||||||
|
- Dataset filter controls
|
||||||
|
- Property filters
|
||||||
|
- Spatial filters
|
||||||
|
- Filter synchronization
|
||||||
|
|
||||||
|
### Vector Analysis Widget
|
||||||
|
|
||||||
|
- Tabular statistics for vector datasets
|
||||||
|
- Summary information
|
||||||
|
- Aggregated values
|
||||||
|
|
||||||
|
### Raster Analysis Widget
|
||||||
|
|
||||||
|
- Tabular statistics for raster datasets
|
||||||
|
- Summary information
|
||||||
|
- Pixel value statistics
|
||||||
|
|
||||||
|
### Hot Spot Summary Widget
|
||||||
|
|
||||||
|
- Hot spot analysis summary
|
||||||
|
- Statistics display
|
||||||
|
- Class distribution
|
||||||
|
|
||||||
|
### Outlier Summary Widget
|
||||||
|
|
||||||
|
- Outlier analysis summary
|
||||||
|
- Statistics display
|
||||||
|
- Outlier count
|
||||||
|
|
||||||
|
## Dashboard Features
|
||||||
|
|
||||||
|
### Layout
|
||||||
|
|
||||||
|
- Drag-and-drop widget placement
|
||||||
|
- Resizable widgets
|
||||||
|
- Grid-based layout
|
||||||
|
- Responsive design
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
- Widget-specific settings
|
||||||
|
- Data source selection
|
||||||
|
- Styling options
|
||||||
|
- Update intervals
|
||||||
|
|
||||||
|
### Sharing
|
||||||
|
|
||||||
|
- Public dashboard URLs
|
||||||
|
- Embed codes
|
||||||
|
- Export configurations
|
||||||
|
- Permissions management
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Data monitoring dashboards
|
||||||
|
- Analysis result displays
|
||||||
|
- Public data portals
|
||||||
|
- Executive summaries
|
||||||
|
- Operational dashboards
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Dataset Viewer](dataset-viewer.md)
|
||||||
|
- [Map Viewer](map-viewer.md)
|
||||||
|
- [Analysis Panel](analysis-panel.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
# Dataset Tools
|
||||||
|
|
||||||
|
Dataset tools provide batch processing and advanced operations for datasets.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Dataset tools (`batch_tools.php`, `batch_tools_advanced.php`, `batch_tools_raster.php`) provide interfaces for batch operations and advanced analysis.
|
||||||
|
|
||||||
|
## Core Analysis Tools
|
||||||
|
|
||||||
|
### Batch Operations
|
||||||
|
|
||||||
|
- Process multiple datasets
|
||||||
|
- Apply same operation to multiple datasets
|
||||||
|
- Batch import/export
|
||||||
|
- Bulk updates
|
||||||
|
|
||||||
|
### Analysis Tools
|
||||||
|
|
||||||
|
- Hot spot analysis
|
||||||
|
- Outlier detection
|
||||||
|
- Buffer analysis
|
||||||
|
- Join operations
|
||||||
|
- Dissolve operations
|
||||||
|
- Clip operations
|
||||||
|
|
||||||
|
## Advanced Analysis Tools
|
||||||
|
|
||||||
|
### Advanced Operations
|
||||||
|
|
||||||
|
- Complex spatial queries
|
||||||
|
- Multi-step analysis workflows
|
||||||
|
- Custom SQL operations
|
||||||
|
- Advanced filtering
|
||||||
|
|
||||||
|
## Raster Analysis Tools
|
||||||
|
|
||||||
|
### Raster Operations
|
||||||
|
|
||||||
|
- Zonal statistics
|
||||||
|
- Raster conversion
|
||||||
|
- Raster comparison
|
||||||
|
- Raster algebra
|
||||||
|
- Raster resampling
|
||||||
|
|
||||||
|
## Live Analysis Suite
|
||||||
|
|
||||||
|
### Real-time Analysis
|
||||||
|
|
||||||
|
- Live hot spot analysis
|
||||||
|
- Live outlier detection
|
||||||
|
- Live KDE
|
||||||
|
- Real-time filtering
|
||||||
|
- Dynamic updates
|
||||||
|
|
||||||
|
## Tool Configuration
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- Input dataset selection
|
||||||
|
- Output dataset configuration
|
||||||
|
- Analysis parameters
|
||||||
|
- Output format options
|
||||||
|
|
||||||
|
### Scheduling
|
||||||
|
|
||||||
|
- Schedule batch operations
|
||||||
|
- Background processing
|
||||||
|
- Job queue management
|
||||||
|
- Progress monitoring
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis Tools](../analysis-tools/index.md)
|
||||||
|
- [Workers](../workers/index.md)
|
||||||
|
- [API Documentation](../api/index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
# Dataset Viewer
|
||||||
|
|
||||||
|
The dataset viewer provides a comprehensive interface for viewing and managing spatial datasets.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The dataset viewer (`dataset.php`) displays datasets with multiple tabs for different views and operations.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Data Tab
|
||||||
|
|
||||||
|
- Dataset metadata and information
|
||||||
|
- Feature listing with pagination
|
||||||
|
- Property filtering
|
||||||
|
- Export options
|
||||||
|
- Table view of features
|
||||||
|
|
||||||
|
### Map Tab
|
||||||
|
|
||||||
|
- Interactive map display
|
||||||
|
- Layer styling and configuration
|
||||||
|
- Popup configuration
|
||||||
|
- Legend management
|
||||||
|
- Basemap selection
|
||||||
|
|
||||||
|
### Analysis Tab
|
||||||
|
|
||||||
|
- Quick analysis tools
|
||||||
|
- Statistics display
|
||||||
|
- Chart generation
|
||||||
|
- Summary information
|
||||||
|
|
||||||
|
## Layer Controls
|
||||||
|
|
||||||
|
### Visibility
|
||||||
|
|
||||||
|
- Toggle layer visibility on/off
|
||||||
|
- Control layer opacity
|
||||||
|
- Layer ordering (z-index)
|
||||||
|
|
||||||
|
### Styling
|
||||||
|
|
||||||
|
- Point styling (color, size, symbol)
|
||||||
|
- Line styling (color, width, style)
|
||||||
|
- Polygon styling (fill, stroke, opacity)
|
||||||
|
- Graduated colors based on attributes
|
||||||
|
- Categorical colors
|
||||||
|
|
||||||
|
### Filters
|
||||||
|
|
||||||
|
- Property-based filtering
|
||||||
|
- Spatial filtering (bounding box)
|
||||||
|
- Save and load filter configurations
|
||||||
|
- Multiple filter conditions
|
||||||
|
|
||||||
|
### Popups
|
||||||
|
|
||||||
|
- Configure popup content
|
||||||
|
- Select properties to display
|
||||||
|
- Custom HTML formatting
|
||||||
|
- Link to detail pages
|
||||||
|
|
||||||
|
## Legend Management
|
||||||
|
|
||||||
|
- Automatic legend generation
|
||||||
|
- Custom legend configuration
|
||||||
|
- Graduated color legends
|
||||||
|
- Categorical legends
|
||||||
|
- Legend export
|
||||||
|
|
||||||
|
## Export Options
|
||||||
|
|
||||||
|
- GeoJSON export
|
||||||
|
- Shapefile export
|
||||||
|
- CSV export
|
||||||
|
- KML export
|
||||||
|
- Filtered export
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Map Viewer](map-viewer.md)
|
||||||
|
- [Analysis Panel](analysis-panel.md)
|
||||||
|
- [Dataset Tools](dataset-tools.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
# User Interface Components
|
||||||
|
|
||||||
|
Aurora GIS provides a comprehensive web-based interface for managing, analyzing, and visualizing spatial data.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The user interface is built with:
|
||||||
|
|
||||||
|
- **Bootstrap 5**: Responsive UI framework
|
||||||
|
- **Leaflet.js**: Interactive mapping
|
||||||
|
- **OpenLayers**: Advanced mapping capabilities
|
||||||
|
- **Chart.js / Plotly**: Data visualization
|
||||||
|
- **Modern JavaScript**: ES6+ features
|
||||||
|
|
||||||
|
## Main Components
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
dataset-viewer
|
||||||
|
map-viewer
|
||||||
|
dashboard-builder
|
||||||
|
analysis-panel
|
||||||
|
dataset-tools
|
||||||
|
```
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
- **Responsive Design**: Works on desktop, tablet, and mobile
|
||||||
|
- **Dark Mode**: Optional dark theme support
|
||||||
|
- **Interactive Maps**: Pan, zoom, and query features
|
||||||
|
- **Real-time Updates**: Live data updates and filtering
|
||||||
|
- **Customizable Dashboards**: Build custom data dashboards
|
||||||
|
- **Analysis Tools**: Integrated analysis panel
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis Tools](../analysis-tools/index.md)
|
||||||
|
- [API Documentation](../api/index.md)
|
||||||
|
- [Architecture Overview](../architecture.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
# Map Viewer
|
||||||
|
|
||||||
|
The map viewer provides an interactive mapping interface for visualizing spatial data.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The map viewer (`view_map.php`) displays multiple datasets on an interactive map with full analysis capabilities.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Map Display
|
||||||
|
|
||||||
|
- Multiple basemap options
|
||||||
|
- Layer management
|
||||||
|
- Zoom and pan controls
|
||||||
|
- Feature identification
|
||||||
|
- Coordinate display
|
||||||
|
- Scale bar
|
||||||
|
|
||||||
|
### Layer Management
|
||||||
|
|
||||||
|
- Add/remove layers
|
||||||
|
- Layer visibility toggle
|
||||||
|
- Layer opacity control
|
||||||
|
- Layer ordering
|
||||||
|
- Layer grouping
|
||||||
|
|
||||||
|
### Styling
|
||||||
|
|
||||||
|
- Point styling
|
||||||
|
- Line styling
|
||||||
|
- Polygon styling
|
||||||
|
- Graduated colors
|
||||||
|
- Categorical colors
|
||||||
|
- Custom styles
|
||||||
|
|
||||||
|
### Analysis Tools
|
||||||
|
|
||||||
|
Integrated analysis panel with:
|
||||||
|
|
||||||
|
- Hot spot analysis
|
||||||
|
- Outlier detection
|
||||||
|
- KDE (Kernel Density Estimation)
|
||||||
|
- Clustering
|
||||||
|
- Buffer analysis
|
||||||
|
- Nearest neighbor
|
||||||
|
- Overlay operations
|
||||||
|
- Raster tools
|
||||||
|
|
||||||
|
## Basemaps
|
||||||
|
|
||||||
|
Available basemap options:
|
||||||
|
|
||||||
|
- OpenStreetMap
|
||||||
|
- CartoDB Positron
|
||||||
|
- CartoDB Dark Matter
|
||||||
|
- CartoDB Voyager
|
||||||
|
- ESRI World Imagery
|
||||||
|
- Custom WMS layers
|
||||||
|
|
||||||
|
## Interaction
|
||||||
|
|
||||||
|
### Feature Identification
|
||||||
|
|
||||||
|
- Click features to view details
|
||||||
|
- Popup display with attributes
|
||||||
|
- Link to feature detail pages
|
||||||
|
|
||||||
|
### Drawing Tools
|
||||||
|
|
||||||
|
- Draw polygons for clipping
|
||||||
|
- Draw lines for profiles
|
||||||
|
- Draw points for analysis
|
||||||
|
- Measure distances and areas
|
||||||
|
|
||||||
|
### Spatial Queries
|
||||||
|
|
||||||
|
- Query by location
|
||||||
|
- Query by attributes
|
||||||
|
- Spatial filters
|
||||||
|
- Buffer queries
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Dataset Viewer](dataset-viewer.md)
|
||||||
|
- [Analysis Panel](analysis-panel.md)
|
||||||
|
- [Dashboard Builder](dashboard-builder.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,248 @@
|
||||||
|
# Web Apps
|
||||||
|
|
||||||
|
Create multi-page web applications with custom layouts and content.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Web Apps allow you to build custom multi-page applications with unique URLs (slugs). Each app can have multiple pages with different content types including maps, datasets, tables, and charts.
|
||||||
|
|
||||||
|
## Creating Web Apps
|
||||||
|
|
||||||
|
### Access
|
||||||
|
|
||||||
|
- Navigate to Web Apps management (`web_apps.php`)
|
||||||
|
- Only admins can create and manage web apps
|
||||||
|
- Apps are accessible via unique slug URLs
|
||||||
|
|
||||||
|
### App Structure
|
||||||
|
|
||||||
|
Web apps consist of:
|
||||||
|
- **App Configuration**: Name, slug, description, active status
|
||||||
|
- **Pages**: Multiple pages with different content
|
||||||
|
- **Widgets**: Content widgets on each page
|
||||||
|
- **Navigation**: Page navigation system
|
||||||
|
|
||||||
|
## App Configuration
|
||||||
|
|
||||||
|
### Basic Settings
|
||||||
|
|
||||||
|
- **Name**: Display name of the app
|
||||||
|
- **Slug**: URL-friendly identifier (e.g., `my-app`)
|
||||||
|
- **Description**: App description
|
||||||
|
- **Active Status**: Enable/disable app
|
||||||
|
|
||||||
|
### Access
|
||||||
|
|
||||||
|
Apps are accessed via:
|
||||||
|
```
|
||||||
|
/app.php?slug={app_slug}
|
||||||
|
```
|
||||||
|
|
||||||
|
Or with specific page:
|
||||||
|
```
|
||||||
|
/app.php?slug={app_slug}&page={page_id}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Pages
|
||||||
|
|
||||||
|
### Page Types
|
||||||
|
|
||||||
|
Each page can contain different content types:
|
||||||
|
|
||||||
|
- **Map**: Interactive map display
|
||||||
|
- **Dataset**: Dataset viewer
|
||||||
|
- **Table**: Data table
|
||||||
|
- **Chart**: Data visualization
|
||||||
|
|
||||||
|
### Page Configuration
|
||||||
|
|
||||||
|
- **Title**: Page title
|
||||||
|
- **ID**: Unique page identifier
|
||||||
|
- **Content Type**: Map, dataset, table, or chart
|
||||||
|
- **Widgets**: Content widgets on the page
|
||||||
|
|
||||||
|
## Widgets
|
||||||
|
|
||||||
|
### Map Widget
|
||||||
|
|
||||||
|
Interactive map with layers.
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Dataset selection
|
||||||
|
- Basemap selection
|
||||||
|
- Layer styling
|
||||||
|
- Initial extent
|
||||||
|
|
||||||
|
### Dataset Widget
|
||||||
|
|
||||||
|
Dataset viewer widget.
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Dataset selection
|
||||||
|
- View mode (data/map/chart)
|
||||||
|
- Display options
|
||||||
|
|
||||||
|
### Table Widget
|
||||||
|
|
||||||
|
Data table display.
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Dataset selection
|
||||||
|
- Columns to display
|
||||||
|
- Sorting and filtering
|
||||||
|
- Pagination
|
||||||
|
|
||||||
|
### Chart Widget
|
||||||
|
|
||||||
|
Data visualization.
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
- Dataset selection
|
||||||
|
- Chart type
|
||||||
|
- X/Y axis configuration
|
||||||
|
- Styling options
|
||||||
|
|
||||||
|
## Building Web Apps
|
||||||
|
|
||||||
|
### Step 1: Create App
|
||||||
|
|
||||||
|
1. Navigate to Web Apps
|
||||||
|
2. Click "New Web App"
|
||||||
|
3. Enter name and slug
|
||||||
|
4. Set description
|
||||||
|
5. Save app
|
||||||
|
|
||||||
|
### Step 2: Add Pages
|
||||||
|
|
||||||
|
1. Open app editor
|
||||||
|
2. Add new page
|
||||||
|
3. Configure page settings
|
||||||
|
4. Select content type
|
||||||
|
5. Save page
|
||||||
|
|
||||||
|
### Step 3: Configure Widgets
|
||||||
|
|
||||||
|
1. Select page
|
||||||
|
2. Add widgets
|
||||||
|
3. Configure widget settings
|
||||||
|
4. Link to datasets
|
||||||
|
5. Save configuration
|
||||||
|
|
||||||
|
### Step 4: Publish
|
||||||
|
|
||||||
|
1. Set app to active
|
||||||
|
2. Test app via slug URL
|
||||||
|
3. Share app URL
|
||||||
|
4. Monitor usage
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
### Public Applications
|
||||||
|
|
||||||
|
- Public data portals
|
||||||
|
- Community applications
|
||||||
|
- Information systems
|
||||||
|
- Data exploration tools
|
||||||
|
|
||||||
|
### Internal Tools
|
||||||
|
|
||||||
|
- Internal dashboards
|
||||||
|
- Workflow applications
|
||||||
|
- Data entry systems
|
||||||
|
- Reporting tools
|
||||||
|
|
||||||
|
### Custom Solutions
|
||||||
|
|
||||||
|
- Client-specific applications
|
||||||
|
- Project-specific tools
|
||||||
|
- Specialized interfaces
|
||||||
|
- Branded applications
|
||||||
|
|
||||||
|
## App Management
|
||||||
|
|
||||||
|
### Editing
|
||||||
|
|
||||||
|
- Edit app configuration
|
||||||
|
- Modify pages
|
||||||
|
- Update widgets
|
||||||
|
- Change permissions
|
||||||
|
|
||||||
|
### Publishing
|
||||||
|
|
||||||
|
- Activate/deactivate apps
|
||||||
|
- Set public/private access
|
||||||
|
- Configure permissions
|
||||||
|
- Monitor usage
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
- Update content
|
||||||
|
- Refresh data
|
||||||
|
- Modify layouts
|
||||||
|
- Add new pages
|
||||||
|
|
||||||
|
## Permissions
|
||||||
|
|
||||||
|
### Access Control
|
||||||
|
|
||||||
|
- **Public**: Accessible without authentication
|
||||||
|
- **Private**: Requires authentication
|
||||||
|
- **Group-based**: Access by user groups
|
||||||
|
- **User-specific**: Individual user access
|
||||||
|
|
||||||
|
### Editing Permissions
|
||||||
|
|
||||||
|
- Only admins can create/edit apps
|
||||||
|
- App creators can edit their apps
|
||||||
|
- Permissions can be delegated
|
||||||
|
|
||||||
|
## Example Web App
|
||||||
|
|
||||||
|
A typical web app might include:
|
||||||
|
|
||||||
|
1. **Home Page**: Overview with map and key statistics
|
||||||
|
2. **Data Page**: Dataset browser and viewer
|
||||||
|
3. **Analysis Page**: Analysis tools and results
|
||||||
|
4. **About Page**: Information and documentation
|
||||||
|
|
||||||
|
## API Access
|
||||||
|
|
||||||
|
Web apps can be accessed programmatically:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Access app
|
||||||
|
GET /app.php?slug={app_slug}
|
||||||
|
|
||||||
|
# Access specific page
|
||||||
|
GET /app.php?slug={app_slug}&page={page_id}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### Design
|
||||||
|
|
||||||
|
- Keep navigation simple
|
||||||
|
- Use consistent layouts
|
||||||
|
- Optimize for mobile
|
||||||
|
- Test across browsers
|
||||||
|
|
||||||
|
### Content
|
||||||
|
|
||||||
|
- Organize content logically
|
||||||
|
- Use clear page titles
|
||||||
|
- Provide navigation aids
|
||||||
|
- Include help text
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
|
||||||
|
- Optimize widget loading
|
||||||
|
- Use efficient queries
|
||||||
|
- Cache when appropriate
|
||||||
|
- Monitor performance
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Dashboard](dashboard.md)
|
||||||
|
- [Accordion Stories](accordion.md)
|
||||||
|
- [UI Components](../ui/index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
# Clip Worker
|
||||||
|
|
||||||
|
Processes clip operations to extract features within a boundary.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The clip worker extracts features from a dataset that intersect with a clipping boundary geometry.
|
||||||
|
|
||||||
|
## Job Type
|
||||||
|
|
||||||
|
`clip`
|
||||||
|
|
||||||
|
## Input Parameters
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"clip_geometry": {
|
||||||
|
"type": "Polygon",
|
||||||
|
"coordinates": [ ... ]
|
||||||
|
},
|
||||||
|
"output_dataset_id": 124
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `dataset_id` (required): Source dataset ID
|
||||||
|
- `clip_geometry` (required): GeoJSON geometry for clipping boundary
|
||||||
|
- `output_dataset_id` (required): Output dataset ID
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Creates a new dataset with clipped features:
|
||||||
|
|
||||||
|
- Features that intersect the clipping boundary
|
||||||
|
- Geometry clipped to boundary
|
||||||
|
- Original attributes preserved
|
||||||
|
|
||||||
|
## Algorithm
|
||||||
|
|
||||||
|
The worker uses PostGIS `ST_Intersection` to:
|
||||||
|
|
||||||
|
1. Transform clipping geometry to dataset SRID
|
||||||
|
2. Find features that intersect the boundary
|
||||||
|
3. Clip geometries to boundary
|
||||||
|
4. Store results in output table
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enqueue a clip job via API
|
||||||
|
curl -X POST "https://example.com/api/datasets_clip_run.php" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"clip_geometry": {
|
||||||
|
"type": "Polygon",
|
||||||
|
"coordinates": [[[-180, -90], [180, -90], [180, 90], [-180, 90], [-180, -90]]]
|
||||||
|
},
|
||||||
|
"output_dataset_id": 124
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. The worker:
|
||||||
|
|
||||||
|
1. Fetches queued `clip` jobs
|
||||||
|
2. Validates input parameters
|
||||||
|
3. Executes PostGIS clip queries
|
||||||
|
4. Creates output dataset
|
||||||
|
5. Marks job as completed
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
- Processing time depends on dataset size and boundary complexity
|
||||||
|
- Complex clipping boundaries may slow processing
|
||||||
|
- Spatial indexes improve intersection performance
|
||||||
|
- Consider simplifying geometries before clipping
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Clip Analysis Tool](../analysis-tools/clip.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Workers Overview](index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
# Create View Worker
|
||||||
|
|
||||||
|
Processes view creation jobs to create database views from queries.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The create view worker creates database views based on SQL queries, allowing dynamic datasets that update when source data changes.
|
||||||
|
|
||||||
|
## Job Type
|
||||||
|
|
||||||
|
`create_view`
|
||||||
|
|
||||||
|
## Input Parameters
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"source_dataset_id": 123,
|
||||||
|
"query": "SELECT * FROM spatial_data_123 WHERE properties->>'category' = 'A'",
|
||||||
|
"output_dataset_id": 124
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `source_dataset_id` (required): Source dataset ID
|
||||||
|
- `query` (required): SQL query to create view from
|
||||||
|
- `output_dataset_id` (required): Output dataset ID
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Creates a new dataset backed by a database view:
|
||||||
|
|
||||||
|
- View created in `spatial_data` schema
|
||||||
|
- Dataset metadata in `spatial_files` table
|
||||||
|
- View updates automatically when source data changes
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- Filtered datasets
|
||||||
|
- Joined datasets
|
||||||
|
- Aggregated datasets
|
||||||
|
- Computed datasets
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enqueue a create view job via API
|
||||||
|
curl -X POST "https://example.com/api/create_view_run.php" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"source_dataset_id": 123,
|
||||||
|
"query": "SELECT * FROM spatial_data_123 WHERE properties->>'\''category'\'' = '\''A'\''",
|
||||||
|
"output_dataset_id": 124
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. The worker:
|
||||||
|
|
||||||
|
1. Fetches queued `create_view` jobs
|
||||||
|
2. Validates input parameters
|
||||||
|
3. Validates SQL query
|
||||||
|
4. Creates database view
|
||||||
|
5. Creates dataset metadata
|
||||||
|
6. Marks job as completed
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
- Views don't store data, so creation is fast
|
||||||
|
- Query performance depends on underlying data
|
||||||
|
- Complex queries may slow view access
|
||||||
|
- Consider materialized views for expensive queries
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Workers Overview](index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,109 @@
|
||||||
|
# Dissolve Worker
|
||||||
|
|
||||||
|
Processes dissolve operations to merge features based on attribute values.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The dissolve worker merges adjacent or overlapping features that share the same attribute value, optionally aggregating numeric fields.
|
||||||
|
|
||||||
|
## Job Type
|
||||||
|
|
||||||
|
`dissolve`
|
||||||
|
|
||||||
|
## Input Parameters
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"source_dataset_id": 123,
|
||||||
|
"output_dataset_id": 124,
|
||||||
|
"dissolve_mode": "field",
|
||||||
|
"dissolve_field": "category",
|
||||||
|
"aggregation_fields": {
|
||||||
|
"population": "sum",
|
||||||
|
"area": "sum"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `source_dataset_id` (required): Source dataset ID
|
||||||
|
- `output_dataset_id` (required): Output dataset ID
|
||||||
|
- `dissolve_mode` (optional): "all", "field", or "custom" (default: "field")
|
||||||
|
- `dissolve_field` (required if mode="field"): Field to dissolve on
|
||||||
|
- `custom_field` (required if mode="custom"): Field for custom grouping
|
||||||
|
- `custom_groups` (required if mode="custom"): Array of group definitions
|
||||||
|
- `aggregation_fields` (optional): Object mapping field names to aggregation functions (sum, avg, min, max, count)
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Creates a new dataset with dissolved features:
|
||||||
|
|
||||||
|
- Merged geometries for each group
|
||||||
|
- Aggregated attribute values
|
||||||
|
- Group identifiers
|
||||||
|
|
||||||
|
## Dissolve Modes
|
||||||
|
|
||||||
|
### All Features
|
||||||
|
|
||||||
|
Merge all features into a single feature. No grouping field required.
|
||||||
|
|
||||||
|
### By Field
|
||||||
|
|
||||||
|
Merge features that share the same value in the specified field.
|
||||||
|
|
||||||
|
### Custom Groups
|
||||||
|
|
||||||
|
Merge features based on custom group definitions. Allows complex grouping logic.
|
||||||
|
|
||||||
|
## Aggregation Functions
|
||||||
|
|
||||||
|
- `sum`: Sum of numeric values
|
||||||
|
- `avg`: Average of numeric values
|
||||||
|
- `min`: Minimum value
|
||||||
|
- `max`: Maximum value
|
||||||
|
- `count`: Count of features
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enqueue a dissolve job via API
|
||||||
|
curl -X POST "https://example.com/api/run_dissolve.php" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"source_dataset_id": 123,
|
||||||
|
"output_dataset_id": 124,
|
||||||
|
"dissolve_mode": "field",
|
||||||
|
"dissolve_field": "category",
|
||||||
|
"aggregation_fields": {
|
||||||
|
"population": "sum",
|
||||||
|
"area": "sum"
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. The worker:
|
||||||
|
|
||||||
|
1. Fetches queued `dissolve` jobs
|
||||||
|
2. Validates input parameters
|
||||||
|
3. Executes PostGIS dissolve queries
|
||||||
|
4. Applies aggregations
|
||||||
|
5. Creates output dataset
|
||||||
|
6. Marks job as completed
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
- Processing time depends on dataset size and number of groups
|
||||||
|
- Complex geometries may slow processing
|
||||||
|
- Aggregation operations add processing time
|
||||||
|
- Consider simplifying geometries before dissolving
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Dissolve Analysis Tool](../analysis-tools/dissolve.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Workers Overview](index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
# Erase Analysis Worker
|
||||||
|
|
||||||
|
Processes erase operations to remove features using another dataset.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The erase analysis worker removes portions of features from an input dataset that overlap with features in an erase dataset.
|
||||||
|
|
||||||
|
## Job Type
|
||||||
|
|
||||||
|
`erase_analysis`
|
||||||
|
|
||||||
|
## Input Parameters
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"input_dataset_id": 123,
|
||||||
|
"erase_dataset_id": 124
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `input_dataset_id` (required): Input dataset ID
|
||||||
|
- `erase_dataset_id` (required): Erase dataset ID
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Creates a new dataset with erased features:
|
||||||
|
|
||||||
|
- Features with erased portions removed
|
||||||
|
- Remaining geometry after erase operation
|
||||||
|
- Original attributes preserved
|
||||||
|
|
||||||
|
## Algorithm
|
||||||
|
|
||||||
|
The worker uses PostGIS `ST_Difference` to:
|
||||||
|
|
||||||
|
1. Find features that intersect the erase dataset
|
||||||
|
2. Calculate difference (input - erase)
|
||||||
|
3. Remove empty geometries
|
||||||
|
4. Store results in output table
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enqueue an erase analysis job via API
|
||||||
|
curl -X POST "https://example.com/api/analysis_erase_run.php" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"input_dataset_id": 123,
|
||||||
|
"erase_dataset_id": 124
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. The worker:
|
||||||
|
|
||||||
|
1. Fetches queued `erase_analysis` jobs
|
||||||
|
2. Validates input parameters
|
||||||
|
3. Executes PostGIS erase operations
|
||||||
|
4. Creates output dataset
|
||||||
|
5. Marks job as completed
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
- Processing time depends on dataset sizes and overlap
|
||||||
|
- Complex geometries may slow processing
|
||||||
|
- Spatial indexes improve intersection performance
|
||||||
|
- Consider simplifying geometries before erasing
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Erase Analysis Tool](../analysis-tools/erase.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Workers Overview](index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,115 @@
|
||||||
|
# Hot Spot Analysis Worker
|
||||||
|
|
||||||
|
Processes hot spot analysis jobs using Getis-Ord Gi* statistics.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The hot spot analysis worker identifies statistically significant clusters of high and low values in spatial data using the Getis-Ord Gi* statistic.
|
||||||
|
|
||||||
|
## Job Type
|
||||||
|
|
||||||
|
`hotspot_analysis`
|
||||||
|
|
||||||
|
## Input Parameters
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"value_field": "population",
|
||||||
|
"neighbor_type": "distance",
|
||||||
|
"distance": 1000,
|
||||||
|
"output_mode": "static"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `dataset_id` (required): Source dataset ID
|
||||||
|
- `value_field` (required): Numeric field to analyze
|
||||||
|
- `neighbor_type` (optional): "distance" or "knn" (default: "distance")
|
||||||
|
- `distance` (required if neighbor_type="distance"): Distance threshold in dataset units
|
||||||
|
- `k_neighbors` (required if neighbor_type="knn"): Number of nearest neighbors
|
||||||
|
- `output_mode` (optional): "static", "view", or "materialized_view" (default: "static")
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Creates a new dataset with hot spot analysis results:
|
||||||
|
|
||||||
|
- **Gi* Z-Score**: Standardized z-score indicating hot/cold spots
|
||||||
|
- **P-Value**: Statistical significance
|
||||||
|
- **Hot Spot Class**: Categorized classes (99% hot, 95% hot, 90% hot, not significant, 90% cold, 95% cold, 99% cold)
|
||||||
|
|
||||||
|
## Output Modes
|
||||||
|
|
||||||
|
### Static Table (default)
|
||||||
|
|
||||||
|
Results stored in a permanent table `spatial_data_{output_id}`. Best for:
|
||||||
|
- Final results that won't change
|
||||||
|
- Maximum query performance
|
||||||
|
- Historical snapshots
|
||||||
|
|
||||||
|
### View
|
||||||
|
|
||||||
|
Results stored as a database view. Best for:
|
||||||
|
- Results that should update when source data changes
|
||||||
|
- Real-time analysis
|
||||||
|
- Reduced storage requirements
|
||||||
|
|
||||||
|
### Materialized View
|
||||||
|
|
||||||
|
Results stored as a materialized view. Best for:
|
||||||
|
- Large datasets requiring periodic refresh
|
||||||
|
- Balance between performance and freshness
|
||||||
|
- Scheduled updates
|
||||||
|
|
||||||
|
## Algorithm
|
||||||
|
|
||||||
|
The worker uses PostGIS functions to:
|
||||||
|
|
||||||
|
1. Calculate spatial weights matrix based on neighbor type
|
||||||
|
2. Compute Getis-Ord Gi* statistic for each feature
|
||||||
|
3. Calculate z-scores and p-values
|
||||||
|
4. Categorize results into hot spot classes
|
||||||
|
5. Store results in output table/view
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enqueue a hot spot analysis job via API
|
||||||
|
curl -X POST "https://example.com/api/analysis_hotspot_run.php" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"value_field": "population",
|
||||||
|
"neighbor_type": "distance",
|
||||||
|
"distance": 1000
|
||||||
|
}'
|
||||||
|
|
||||||
|
# Worker processes the job automatically
|
||||||
|
# Check status via API
|
||||||
|
curl "https://example.com/api/job_status.php?job_id=456"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. The worker:
|
||||||
|
|
||||||
|
1. Fetches queued `hotspot_analysis` jobs
|
||||||
|
2. Validates input parameters
|
||||||
|
3. Executes PostGIS analysis queries
|
||||||
|
4. Creates output dataset
|
||||||
|
5. Marks job as completed
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
- Processing time depends on dataset size and neighbor configuration
|
||||||
|
- Distance-based analysis may be slower for large datasets
|
||||||
|
- KNN-based analysis is generally faster
|
||||||
|
- Consider using materialized views for very large datasets
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Hot Spot Analysis Tool](../analysis-tools/hotspot.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Workers Overview](index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,93 @@
|
||||||
|
# Hot Spot Time Series Worker
|
||||||
|
|
||||||
|
Processes hot spot time series analysis jobs to analyze temporal patterns in hot spots.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The hot spot time series worker performs hot spot analysis across multiple time periods to identify temporal patterns in spatial clustering.
|
||||||
|
|
||||||
|
## Job Type
|
||||||
|
|
||||||
|
`hotspot_timeseries`
|
||||||
|
|
||||||
|
## Input Parameters
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"value_field": "population",
|
||||||
|
"time_field": "date",
|
||||||
|
"time_periods": ["2020", "2021", "2022"],
|
||||||
|
"neighbor_type": "distance",
|
||||||
|
"distance": 1000
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `dataset_id` (required): Source dataset ID
|
||||||
|
- `value_field` (required): Numeric field to analyze
|
||||||
|
- `time_field` (required): Field containing time period identifiers
|
||||||
|
- `time_periods` (required): Array of time period values to analyze
|
||||||
|
- `neighbor_type` (optional): "distance" or "knn" (default: "distance")
|
||||||
|
- `distance` (required if neighbor_type="distance"): Distance threshold
|
||||||
|
- `k_neighbors` (required if neighbor_type="knn"): Number of nearest neighbors
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Creates a new dataset with time series hot spot results:
|
||||||
|
|
||||||
|
- Hot spot analysis for each time period
|
||||||
|
- Temporal patterns in clustering
|
||||||
|
- Time period identifiers
|
||||||
|
- Gi* z-scores and p-values for each period
|
||||||
|
|
||||||
|
## Algorithm
|
||||||
|
|
||||||
|
The worker:
|
||||||
|
|
||||||
|
1. Filters data by time period
|
||||||
|
2. Performs hot spot analysis for each period
|
||||||
|
3. Combines results with time period information
|
||||||
|
4. Stores results in output table
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enqueue a hot spot time series job via API
|
||||||
|
curl -X POST "https://example.com/api/hotspot_timeseries_run.php" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"value_field": "population",
|
||||||
|
"time_field": "year",
|
||||||
|
"time_periods": ["2020", "2021", "2022"],
|
||||||
|
"neighbor_type": "distance",
|
||||||
|
"distance": 1000
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. The worker:
|
||||||
|
|
||||||
|
1. Fetches queued `hotspot_timeseries` jobs
|
||||||
|
2. Validates input parameters
|
||||||
|
3. Performs hot spot analysis for each time period
|
||||||
|
4. Combines results
|
||||||
|
5. Creates output dataset
|
||||||
|
6. Marks job as completed
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
- Processing time depends on dataset size and number of time periods
|
||||||
|
- Each time period requires separate hot spot analysis
|
||||||
|
- Consider limiting number of time periods for large datasets
|
||||||
|
- Results can be large for many time periods
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Hot Spot Analysis Tool](../analysis-tools/hotspot.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Workers Overview](index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
# Workers Documentation
|
||||||
|
|
||||||
|
Background workers process long-running operations asynchronously, allowing the web interface to remain responsive.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Workers are long-running PHP CLI scripts that:
|
||||||
|
|
||||||
|
- Poll the database for queued jobs
|
||||||
|
- Process jobs of a specific type
|
||||||
|
- Handle errors gracefully
|
||||||
|
- Log progress and results
|
||||||
|
- Run continuously until stopped
|
||||||
|
|
||||||
|
## Worker Architecture
|
||||||
|
|
||||||
|
All workers follow a similar pattern:
|
||||||
|
|
||||||
|
1. **Initialization**: Connect to database, verify connection
|
||||||
|
2. **Main Loop**: Continuously poll for jobs
|
||||||
|
3. **Job Processing**: Fetch, process, and complete jobs
|
||||||
|
4. **Error Handling**: Log errors and mark failed jobs
|
||||||
|
|
||||||
|
## Running Workers
|
||||||
|
|
||||||
|
Workers are designed to run as systemd services:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enable and start a worker
|
||||||
|
sudo systemctl enable hotspot_worker.service
|
||||||
|
sudo systemctl start hotspot_worker.service
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
sudo systemctl status hotspot_worker.service
|
||||||
|
|
||||||
|
# View logs
|
||||||
|
sudo journalctl -u hotspot_worker.service -f
|
||||||
|
```
|
||||||
|
|
||||||
|
## Available Workers
|
||||||
|
|
||||||
|
```{toctree}
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
hotspot_analysis
|
||||||
|
outlier_analysis
|
||||||
|
nearest_analysis
|
||||||
|
dissolve
|
||||||
|
clip
|
||||||
|
raster_clip
|
||||||
|
create_view
|
||||||
|
erase_analysis
|
||||||
|
hotspot_timeseries
|
||||||
|
```
|
||||||
|
|
||||||
|
## Worker Configuration
|
||||||
|
|
||||||
|
Workers are configured via systemd service files in the `systemd/` directory. Each service file specifies:
|
||||||
|
|
||||||
|
- Working directory
|
||||||
|
- PHP executable path
|
||||||
|
- User/group to run as
|
||||||
|
- Restart behavior
|
||||||
|
- Resource limits
|
||||||
|
|
||||||
|
## Job Processing
|
||||||
|
|
||||||
|
Workers use the `background_jobs` table to manage jobs:
|
||||||
|
|
||||||
|
- **Enqueue**: Jobs are created with status 'queued'
|
||||||
|
- **Fetch**: Workers fetch jobs using `FOR UPDATE SKIP LOCKED`
|
||||||
|
- **Process**: Workers update status to 'running' and process
|
||||||
|
- **Complete**: Workers update status to 'completed' with results
|
||||||
|
- **Error**: On failure, status set to 'failed' with error message
|
||||||
|
|
||||||
|
## Monitoring
|
||||||
|
|
||||||
|
Monitor workers via:
|
||||||
|
|
||||||
|
- Systemd logs: `journalctl -u {worker_name}.service`
|
||||||
|
- Application logs: `logs/worker_{name}.log`
|
||||||
|
- Database: Query `background_jobs` table for job status
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Architecture Overview](../architecture.md)
|
||||||
|
- [API Documentation](../api/index.md)
|
||||||
|
- [Analysis Tools](../analysis-tools/index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
# Nearest Analysis Worker
|
||||||
|
|
||||||
|
Processes nearest neighbor analysis jobs between two datasets.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The nearest analysis worker finds the nearest features from a target dataset for each feature in a source dataset.
|
||||||
|
|
||||||
|
## Job Type
|
||||||
|
|
||||||
|
`nearest`
|
||||||
|
|
||||||
|
## Input Parameters
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"source_dataset_id": 123,
|
||||||
|
"target_dataset_id": 124,
|
||||||
|
"max_distance": 5000,
|
||||||
|
"limit": 1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `source_dataset_id` (required): Source dataset ID
|
||||||
|
- `target_dataset_id` (required): Target dataset ID
|
||||||
|
- `max_distance` (optional): Maximum search distance in dataset units
|
||||||
|
- `limit` (optional): Maximum neighbors per feature (default: 1)
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Creates a new dataset with nearest neighbor results:
|
||||||
|
|
||||||
|
- Original source feature geometry
|
||||||
|
- Nearest target feature information
|
||||||
|
- Distance to nearest neighbor
|
||||||
|
- Attributes from both source and target features
|
||||||
|
|
||||||
|
## Algorithm
|
||||||
|
|
||||||
|
The worker uses PostGIS functions to:
|
||||||
|
|
||||||
|
1. For each source feature, find nearest target features
|
||||||
|
2. Calculate distances using spatial indexes
|
||||||
|
3. Apply distance and limit constraints
|
||||||
|
4. Join attributes from both datasets
|
||||||
|
5. Store results in output table
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enqueue a nearest analysis job via API
|
||||||
|
curl -X POST "https://example.com/api/nearest_run.php" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"source_dataset_id": 123,
|
||||||
|
"target_dataset_id": 124,
|
||||||
|
"max_distance": 5000,
|
||||||
|
"limit": 1
|
||||||
|
}'
|
||||||
|
|
||||||
|
# Worker processes the job automatically
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. The worker:
|
||||||
|
|
||||||
|
1. Fetches queued `nearest` jobs
|
||||||
|
2. Validates input parameters
|
||||||
|
3. Executes PostGIS nearest neighbor queries
|
||||||
|
4. Creates output dataset
|
||||||
|
5. Marks job as completed
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
- Processing time depends on dataset sizes
|
||||||
|
- Spatial indexes are critical for performance
|
||||||
|
- Large max_distance values may slow processing
|
||||||
|
- Consider limiting results per feature
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Nearest Analysis Tool](../analysis-tools/nearest.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Workers Overview](index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,94 @@
|
||||||
|
# Outlier Analysis Worker
|
||||||
|
|
||||||
|
Processes outlier detection jobs to identify statistical outliers in spatial data.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The outlier analysis worker identifies features with values that are statistically unusual using z-score or MAD (Median Absolute Deviation) methods.
|
||||||
|
|
||||||
|
## Job Type
|
||||||
|
|
||||||
|
`outlier_analysis`
|
||||||
|
|
||||||
|
## Input Parameters
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"value_field": "income",
|
||||||
|
"method": "zscore",
|
||||||
|
"threshold": 2.0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `dataset_id` (required): Source dataset ID
|
||||||
|
- `value_field` (required): Numeric field to analyze
|
||||||
|
- `method` (optional): "zscore" or "mad" (default: "zscore")
|
||||||
|
- `threshold` (optional): Z-score threshold or MAD multiplier (default: 2.0)
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Creates a new dataset with outlier analysis results:
|
||||||
|
|
||||||
|
- Original features marked as outliers
|
||||||
|
- Outlier score (z-score or MAD score)
|
||||||
|
- Outlier flag
|
||||||
|
- Original attributes preserved
|
||||||
|
|
||||||
|
## Methods
|
||||||
|
|
||||||
|
### Z-Score Method
|
||||||
|
|
||||||
|
Calculates standardized z-scores:
|
||||||
|
- Mean and standard deviation calculated
|
||||||
|
- Z-score = (value - mean) / standard_deviation
|
||||||
|
- Features with |z-score| > threshold are outliers
|
||||||
|
|
||||||
|
### MAD Method
|
||||||
|
|
||||||
|
Uses Median Absolute Deviation:
|
||||||
|
- Median calculated
|
||||||
|
- MAD = median(|value - median|)
|
||||||
|
- Modified z-score = 0.6745 * (value - median) / MAD
|
||||||
|
- Features with |modified z-score| > threshold are outliers
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enqueue an outlier analysis job via API
|
||||||
|
curl -X POST "https://example.com/api/analysis/outlier_run.php" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"dataset_id": 123,
|
||||||
|
"value_field": "income",
|
||||||
|
"method": "zscore",
|
||||||
|
"threshold": 2.0
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. The worker:
|
||||||
|
|
||||||
|
1. Fetches queued `outlier_analysis` jobs
|
||||||
|
2. Validates input parameters
|
||||||
|
3. Calculates statistics (mean/std or median/MAD)
|
||||||
|
4. Identifies outliers
|
||||||
|
5. Creates output dataset
|
||||||
|
6. Marks job as completed
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
- Processing time depends on dataset size
|
||||||
|
- Z-score method requires two passes (mean/std, then scoring)
|
||||||
|
- MAD method is more robust to outliers in calculation
|
||||||
|
- Consider filtering null values before analysis
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Outlier Analysis Tool](../analysis-tools/outliers.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Workers Overview](index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
# Raster Clip Worker
|
||||||
|
|
||||||
|
Processes raster clip operations to extract raster data within a boundary.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The raster clip worker extracts raster data that intersects with a clipping boundary geometry.
|
||||||
|
|
||||||
|
## Job Type
|
||||||
|
|
||||||
|
`raster_clip`
|
||||||
|
|
||||||
|
## Input Parameters
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"raster_dataset_id": 125,
|
||||||
|
"clip_geometry": {
|
||||||
|
"type": "Polygon",
|
||||||
|
"coordinates": [ ... ]
|
||||||
|
},
|
||||||
|
"output_dataset_id": 126
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
- `raster_dataset_id` (required): Source raster dataset ID
|
||||||
|
- `clip_geometry` (required): GeoJSON geometry for clipping boundary
|
||||||
|
- `output_dataset_id` (required): Output raster dataset ID
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Creates a new raster dataset with clipped data:
|
||||||
|
|
||||||
|
- Raster data within the clipping boundary
|
||||||
|
- Original raster properties preserved
|
||||||
|
- Proper spatial reference maintained
|
||||||
|
|
||||||
|
## Algorithm
|
||||||
|
|
||||||
|
The worker uses PostGIS raster functions to:
|
||||||
|
|
||||||
|
1. Transform clipping geometry to raster SRID
|
||||||
|
2. Clip raster to boundary using `ST_Clip`
|
||||||
|
3. Store clipped raster in output table
|
||||||
|
4. Update raster metadata
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enqueue a raster clip job via API
|
||||||
|
curl -X POST "https://example.com/api/raster_clip_run.php" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"raster_dataset_id": 125,
|
||||||
|
"clip_geometry": {
|
||||||
|
"type": "Polygon",
|
||||||
|
"coordinates": [[[-180, -90], [180, -90], [180, 90], [-180, 90], [-180, -90]]]
|
||||||
|
},
|
||||||
|
"output_dataset_id": 126
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background Jobs
|
||||||
|
|
||||||
|
This analysis runs as a background job. The worker:
|
||||||
|
|
||||||
|
1. Fetches queued `raster_clip` jobs
|
||||||
|
2. Validates input parameters
|
||||||
|
3. Executes PostGIS raster clip operations
|
||||||
|
4. Creates output raster dataset
|
||||||
|
5. Marks job as completed
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
- Processing time depends on raster size and boundary complexity
|
||||||
|
- Large rasters may require significant memory
|
||||||
|
- Consider resampling for very large rasters
|
||||||
|
- Clipping boundaries should match raster resolution
|
||||||
|
|
||||||
|
## Related Documentation
|
||||||
|
|
||||||
|
- [Raster Tools](../analysis-tools/raster.md)
|
||||||
|
- [Analysis API](../api/analysis.md)
|
||||||
|
- [Workers Overview](index.md)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
[build-system]
|
||||||
|
requires = ["flit_core >=3.2,<4"]
|
||||||
|
build-backend = "flit_core.buildapi"
|
||||||
|
|
||||||
|
[project]
|
||||||
|
name = "GeoLite"
|
||||||
|
authors = [{name = "AcuGIS", email = "hello@citedcorp.com"}]
|
||||||
|
dynamic = ["version", "description"]
|
||||||
PostGIS
Mobile
QGIS
MapBender
GeoServer
GeoNode
GeoNetwork
Novella
Solutions