# esri/oriented-imagery architecture

> Architecture diagram of the GitHub repository esri/oriented-imagery, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/esri/oriented-imagery
- Repository: https://github.com/esri/oriented-imagery

## Overview

Oriented Imagery Classic is a community-supported GIS solution for managing and exploring imagery from angled aerial, drone, and terrestrial sensors. The principal workflow is to choose an oriented imagery catalog (OIC), select a map location, and explore matching images in a viewer; the image’s field of view updates on the map as the user pans or zooms. The repository provides widgets for Web AppBuilder 2D/3D and Experience Builder, custom OIC input types, and API/schema references. The README documents the workflow and catalog structure; sampled widget excerpts show related runtime behavior, but do not expose the complete viewer implementation.

Main entry points: [`OrientedImageryCatalog_Schema.pdf`](https://github.com/esri/oriented-imagery/blob/master/OrientedImageryCatalog_Schema.pdf) (OIC catalog), [`Widgets/ExperienceBuilder/oriented-imagery/src/runtime/widget.tsx`](https://github.com/esri/oriented-imagery/blob/master/Widgets/ExperienceBuilder/oriented-imagery/src/runtime/widget.tsx) (Imagery widget), [`Widgets/DeprecatedWAB2D/OrientedImagery/Widget.js`](https://github.com/esri/oriented-imagery/blob/master/Widgets/DeprecatedWAB2D/OrientedImagery/Widget.js) (2D widget), [`Widgets/WebAppBuilder3D/OrientedImagery3D/Widget.js`](https://github.com/esri/oriented-imagery/blob/master/Widgets/WebAppBuilder3D/OrientedImagery3D/Widget.js) (3D widget)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["Experience Builder"]
  node_experience_settings["Widget settings<br/>[setting.tsx]"]
  node_experience_config["Widget configuration<br/>[config.ts]"]
  node_experience_widget["Imagery widget<br/>[widget.tsx]"]
end

subgraph group_webappbuilder["Web AppBuilder"]
  node_wab2d_widget["2D widget<br/>[Widget.js]"]
  node_wab3d_widget["3D widget<br/>[Widget.js]"]
  node_wab3d_settings["3D settings<br/>[Setting.js]"]
end

subgraph group_catalog["Catalog Inputs"]
  node_oic["OIC catalog"]
  node_feature_service[("Point feature service")]
  node_custom_types["Custom OIC types"]
  node_drone_input["Drone2Map input<br/>[Drone2Map.py]"]
  node_video_input["Geospatial video input<br/>[GeospatialVideo.py]"]
  node_pictometry_input["Pictometry input<br/>[pictometry.py]"]
  node_riegl_input["Riegl CSV input"]
end

subgraph group_references["API and Schema"]
  node_api_reference["Oriented imagery API"]
end

node_app_user(("App user"))
node_map_location["Map location"]
node_custom_app(("Custom application"))

node_app_user -->|"explores imagery"| node_experience_widget
node_app_user -->|"explores imagery"| node_wab2d_widget
node_app_user -->|"explores imagery"| node_wab3d_widget
node_experience_settings -->|"sets options"| node_experience_config
node_experience_widget -->|"reads options"| node_experience_config
node_experience_widget -.->|"uses catalog"| node_oic
node_wab2d_widget -->|"loads catalog"| node_oic
node_wab3d_settings -->|"selects catalog"| node_oic
node_wab3d_widget -.->|"uses catalog"| node_oic
node_app_user -->|"selects location"| node_map_location
node_map_location -->|"queries imagery"| node_experience_widget
node_map_location -->|"queries imagery"| node_wab2d_widget
node_map_location -->|"queries imagery"| node_wab3d_widget
node_oic -->|"references points"| node_feature_service
node_drone_input -->|"imports metadata"| node_oic
node_video_input -->|"imports metadata"| node_oic
node_pictometry_input -->|"imports metadata"| node_oic
node_riegl_input -->|"imports metadata"| node_oic
node_custom_app -->|"uses guidance"| node_api_reference

click node_experience_settings "https://github.com/esri/oriented-imagery/blob/master/Widgets/ExperienceBuilder/oriented-imagery/src/setting/setting.tsx"
click node_experience_config "https://github.com/esri/oriented-imagery/blob/master/Widgets/ExperienceBuilder/oriented-imagery/src/config.ts"
click node_experience_widget "https://github.com/esri/oriented-imagery/blob/master/Widgets/ExperienceBuilder/oriented-imagery/src/runtime/widget.tsx"
click node_wab2d_widget "https://github.com/esri/oriented-imagery/blob/master/Widgets/DeprecatedWAB2D/OrientedImagery/Widget.js"
click node_wab3d_widget "https://github.com/esri/oriented-imagery/blob/master/Widgets/WebAppBuilder3D/OrientedImagery3D/Widget.js"
click node_wab3d_settings "https://github.com/esri/oriented-imagery/blob/master/Widgets/WebAppBuilder3D/OrientedImagery3D/setting/Setting.js"
click node_oic "https://github.com/esri/oriented-imagery/blob/master/OrientedImageryCatalog_Schema.pdf"
click node_custom_types "https://github.com/esri/oriented-imagery/tree/master/CustomTypes"
click node_drone_input "https://github.com/esri/oriented-imagery/blob/master/CustomTypes/Drone2Map.py"
click node_video_input "https://github.com/esri/oriented-imagery/blob/master/CustomTypes/GeospatialVideo.py"
click node_pictometry_input "https://github.com/esri/oriented-imagery/blob/master/CustomTypes/pictometry.py"
click node_riegl_input "https://github.com/esri/oriented-imagery/blob/master/CustomTypes/RieglRiPROCESS_CSV.py"
click node_api_reference "https://github.com/esri/oriented-imagery/blob/master/OrientedImagery_API.pdf"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_experience_settings,node_experience_config,node_experience_widget,node_app_user toneBlue
class node_wab2d_widget,node_wab3d_widget,node_wab3d_settings toneAmber
class node_oic,node_feature_service,node_custom_types,node_drone_input,node_video_input,node_pictometry_input,node_riegl_input toneMint
class node_api_reference toneRose
class node_map_location,node_custom_app toneIndigo
```

## Components

### Experience Builder

- [Widget settings](https://github.com/esri/oriented-imagery/blob/master/Widgets/ExperienceBuilder/oriented-imagery/src/setting/setting.tsx): `Widgets/ExperienceBuilder/oriented-imagery/src/setting/setting.tsx`
- [Widget configuration](https://github.com/esri/oriented-imagery/blob/master/Widgets/ExperienceBuilder/oriented-imagery/src/config.ts): `Widgets/ExperienceBuilder/oriented-imagery/src/config.ts`
- [Imagery widget](https://github.com/esri/oriented-imagery/blob/master/Widgets/ExperienceBuilder/oriented-imagery/src/runtime/widget.tsx): `Widgets/ExperienceBuilder/oriented-imagery/src/runtime/widget.tsx`

### Web AppBuilder

- [2D widget](https://github.com/esri/oriented-imagery/blob/master/Widgets/DeprecatedWAB2D/OrientedImagery/Widget.js): `Widgets/DeprecatedWAB2D/OrientedImagery/Widget.js`
- [3D widget](https://github.com/esri/oriented-imagery/blob/master/Widgets/WebAppBuilder3D/OrientedImagery3D/Widget.js): `Widgets/WebAppBuilder3D/OrientedImagery3D/Widget.js`
- [3D settings](https://github.com/esri/oriented-imagery/blob/master/Widgets/WebAppBuilder3D/OrientedImagery3D/setting/Setting.js): `Widgets/WebAppBuilder3D/OrientedImagery3D/setting/Setting.js`

### Catalog Inputs

- [OIC catalog](https://github.com/esri/oriented-imagery/blob/master/OrientedImageryCatalog_Schema.pdf): `OrientedImageryCatalog_Schema.pdf`
- **Point feature service**
- [Custom OIC types](https://github.com/esri/oriented-imagery/tree/master/CustomTypes): `CustomTypes`
- [Drone2Map input](https://github.com/esri/oriented-imagery/blob/master/CustomTypes/Drone2Map.py): `CustomTypes/Drone2Map.py`
- [Geospatial video input](https://github.com/esri/oriented-imagery/blob/master/CustomTypes/GeospatialVideo.py): `CustomTypes/GeospatialVideo.py`
- [Pictometry input](https://github.com/esri/oriented-imagery/blob/master/CustomTypes/pictometry.py): `CustomTypes/pictometry.py`
- [Riegl CSV input](https://github.com/esri/oriented-imagery/blob/master/CustomTypes/RieglRiPROCESS_CSV.py): `CustomTypes/RieglRiPROCESS_CSV.py`

### API and Schema

- [Oriented imagery API](https://github.com/esri/oriented-imagery/blob/master/OrientedImagery_API.pdf): `OrientedImagery_API.pdf`

### Other components

- **App user**
- **Map location**
- **Custom application**

## Connections

- App user → Imagery widget: explores imagery (evidence: `README.md`)
- App user → 2D widget: explores imagery (evidence: `README.md`)
- App user → 3D widget: explores imagery (evidence: `README.md`)
- Widget settings → Widget configuration: sets options (evidence: `Widgets/ExperienceBuilder/oriented-imagery/src/setting/setting.tsx`)
- Imagery widget → Widget configuration: reads options (evidence: `Widgets/ExperienceBuilder/oriented-imagery/src/runtime/widget.tsx`)
- Imagery widget → OIC catalog: uses catalog (evidence: `README.md`)
- 2D widget → OIC catalog: loads catalog (evidence: `Widgets/DeprecatedWAB2D/OrientedImagery/Widget.js`)
- 3D settings → OIC catalog: selects catalog (evidence: `Widgets/WebAppBuilder3D/OrientedImagery3D/setting/Setting.js`)
- 3D widget → OIC catalog: uses catalog (evidence: `README.md`)
- App user → Map location: selects location (evidence: `README.md`)
- Map location → Imagery widget: queries imagery (evidence: `README.md`)
- Map location → 2D widget: queries imagery (evidence: `README.md`)
- Map location → 3D widget: queries imagery (evidence: `README.md`)
- OIC catalog → Point feature service: references points (evidence: `README.md`)
- Drone2Map input → OIC catalog: imports metadata (evidence: `CustomTypes/Drone2Map.py`)
- Geospatial video input → OIC catalog: imports metadata (evidence: `CustomTypes/GeospatialVideo.py`)
- Pictometry input → OIC catalog: imports metadata (evidence: `CustomTypes/pictometry.py`)
- Riegl CSV input → OIC catalog: imports metadata (evidence: `CustomTypes/RieglRiPROCESS_CSV.py`)
- Custom application → Oriented imagery API: uses guidance (evidence: `README.md`)
