v2.0.0
Summary
This major release introduces a new zone-based path plan architecture. Path plans now organize data hierarchically - each field part becomes a zone with its own guidance settings, geometry, and routes. New endpoints support bulk operations, equipment scenario analysis, slope generation, and shared plan access. Several legacy wheel traffic endpoints have been removed.
Breaking Changes
Path Plan List Response Type Changed
GET /api/fields/{fieldId}/path-plans/list
Response model changed from PathPlanListItemViewModel to PathPlanNormalizedModel with zone-based structure
Direct API Request: Options String Removed
POST /api/path-plans/direct
The comma-separated `options` string parameter has been removed and replaced by individual boolean fields: `includeSlopes`, `extendTracks`, `useCrossHatches`, `usePassable`. Note: `usePassable` defaults to `true`, which is the inverse of the old `excludePassable` option.
Before
{
"options": "dem,erosion,extendTracks,useCrossHatches,excludePassable"
}
After
{
"includeSlopes": true,
"extendTracks": true,
"useCrossHatches": true,
"usePassable": false
}
Direct API Request: New Track Type Support
POST /api/path-plans/direct
New optional `trackType` field (Straight, Curved, Spiral) defaults to Straight. When using Curved, an optional `curvedOptions` object is available with `levelOfSmoothing`, `smoothingIterations`, and `minAngleToSmooth`.
Direct API Response: Flat to Hierarchical Structure
POST /api/path-plans/direct
The entire response structure has changed from a flat model to a hierarchical zone-based model. All top-level geometry fields (Boundary, Tracks, ExteriorHeadlandPasses, InnerBoundary, APoints, BPoints) and flat statistics (TrackDistance, HeadlandDistance, MissedArea, OverlapArea, etc.) have been removed. Data is now nested under Zones -> GeometryGroups -> GeometryParts. Routes are embedded as typed geometry parts (RouteTrack, Turn, HeadlandTurn, HeadlandConnector). Slope data is per-geometry-part instead of a single DemResult. Crosshatches are geometry parts instead of a separate array.
Before
PathPlanApiResponse
Boundary, Tracks, ExteriorHeadlandPasses
APoints, BPoints (2D arrays)
TrackDistance, HeadlandDistance, NumberOfTracks
Routes[] (separate route model)
SlopesResult (single DemResult)
Crosshatches[]
After
PathPlanApiResponse
PathPlanId, PathPlanName, Boundary, Area
Equipment, Stats (aggregated)
Zones[]
ZoneBoundary, InnerBoundaries, Stats
GeometryGroups[]
TrackType, TrackBearing, ABLine, Stats
GeometryParts[] (typed: GuidanceTrack,
RouteTrack, Turn, HeadlandTurn, etc.)
Direct GeoJSON API: Feature Types Restructured
POST /api/path-plans/direct/geojson
GeoJSON features are now organized by zone instead of boundary part index. Feature type values changed: `boundary` to `zoneBoundary`, `tracks`/`exteriorHeadlandPasses` to `geometryPart` with a `geometryPartType` property, `aPoint`/`bPoint` replaced by `abLine` (LineString) and `routeStartPoint`/`routeEndPoint`. The `partIndex` property is replaced by `zoneId` and `zoneIndex`. The `demResult` feature is removed (slope data is now per-geometry-part). New feature types added: `zoneStatistics`, `zonesBoundary`.
Before
Feature types:
boundary, tracks,
exteriorHeadlandPasses,
interiorHeadlandPasses,
aPoint, bPoint,
routePart, demResult,
crosshatch, refillPoint
Key: partIndex
After
Feature types:
zoneBoundary, geometryPart
(geometryPartType: GuidanceTrack,
RouteTrack, Turn, HeadlandTurn,
HeadlandConnector, etc.),
abLine, routeStartPoint,
routeEndPoint, zoneStatistics,
refillPoint
Key: zoneId, zoneIndex
Share Path Plans Response Type Changed
POST /api/shares/{code}/plans
Return type changed from `TableSharePathPlanResponseModel` to `TableSharePathPlanNormalizedResponseModel`
Share Equipment Scenario Response Type Changed
GET /api/shares/{code}/equipment-scenario
Return type changed from `ShareEquipmentScenarioResponseModel` to `ShareNormalizedEquipmentScenarioResponseModel`
Wheel Traffic Summary Endpoints Removed
POST /api/wheel-traffic-summary
The `POST /api/wheel-traffic-summary`, `POST /api/wheel-traffic-route-summary`, and `POST /api/wheel-traffic-summary/{pathPlanId}` endpoints have been removed. Wheel traffic analysis is now handled through the normalized path plan zone architecture.
New Endpoints
Path Plans (Normalized)
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/path-plans-normalized/{pathPlanId} |
Get normalized path plan with full zone hierarchy |
| GET | /api/path-plans-normalized/{pathPlanId}/preview |
Get lightweight preview with simplified geometry |
| POST | /api/path-plan-zones/{pathPlanZoneId}/geometry-groups/{geometryGroupId}/set-active |
Set a geometry group as active within its zone |
Guidance
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/pathplan/{pathPlanId}/slopes |
Generate DEM-based slope analysis for a path plan |
Bulk Guidance (Normalized)
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/bulk-guidance/normalized |
Bulk guidance generation with normalized output |
| GET | /api/bulk-guidance/normalized/jobs/{jobId} |
Get normalized bulk guidance job status |
Equipment Scenarios (Normalized)
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/equipment-scenarios/normalized |
Generate normalized equipment explorer scenario |
| GET | /api/equipment-scenarios/normalized/jobs/{jobId} |
Get normalized equipment scenario job status |
Routing (Normalized)
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/routes/normalized |
Generate routes for normalized path plans |
Sharing (Normalized)
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/shares/{code}/path-plans-normalized/{pathPlanId} |
Get shared normalized path plan (anonymous access) |
New Features
1. Hierarchical Zone-Based Architecture
New data model with hierarchical structure: **PathPlan -> Zones -> GeometryGroups -> GeometryParts**. Each field part becomes a separate zone with its own guidance settings, geometry, and statistics.
Properties
| Property | Type | Description |
|---|---|---|
PathPlanNormalizedModel |
model | Top-level container with zones, statistics, and metadata |
PathPlanZoneModel |
model | Represents a single zone (typically one part-field) |
GeometryGroupModel |
model | Contains a complete guidance result (tracks + headlands + route) |
GeometryPartModel |
model | Individual geometry element (track, headland, turn, route segment) |
2. Geometry Group Activation
Support for multiple guidance variants per zone. Use `POST /api/path-plan-zones/{pathPlanZoneId}/geometry-groups/{geometryGroupId}/set-active` to switch between different guidance configurations within a zone.
3. Lightweight Preview Endpoint
New `GET /api/path-plans-normalized/{pathPlanId}/preview` endpoint returns simplified geometries for fast map rendering and reduced bandwidth.
4. Slope Analysis
New `POST /api/pathplan/{pathPlanId}/slopes` endpoint generates DEM-based slope data for a path plan, enriching zones with terrain information.
New Schemas
| Schema | Description |
|---|---|
PathPlanNormalizedModel |
Top-level path plan container with zones and aggregate statistics |
PathPlanZoneModel |
Zone model representing a part-field with geometry groups |
GeometryGroupModel |
Guidance variant containing tracks, headlands, and route |
GeometryPartModel |
Individual geometry element with type-specific details |
GeometryPartTrackDetail |
Track-specific metadata (bearing, width, etc.) |
GeometryPartHeadlandDetail |
Headland-specific metadata (pass number, direction) |
GeometryPartSlopeDetail |
DEM slope analysis data |
RouteZoneRequest |
Request model for normalized routing |
RouteJobResultViewModel |
Job result for normalized routing |
Migration Guide
For clients using path plan list endpoints
- 1 Update response type from `PathPlanListItemViewModel[]` to `PathPlanNormalizedModel[]`
- 2 Map `area` to `totalArea`
- 3 Map `trackCount` to `numberOfTracks`
- 4 Other properties (`pathPlanId`, `name`, `createdAt`) remain the same
For Direct API consumers (POST /api/path-plans/direct)
- 1 Replace the `options` string with individual booleans: `includeSlopes`, `extendTracks`, `useCrossHatches`, `usePassable` (note: `usePassable` is inverted from `excludePassable`)
- 2 Response is now hierarchical: iterate `zones[]` -> `geometryGroups[]` -> `geometryParts[]` to access geometry
- 3 Each geometry part has a `geometryPartType` indicating its role (GuidanceTrack, ExteriorHeadlandPass, RouteTrack, Turn, HeadlandTurn, etc.)
- 4 AB line data moved from `aPoints`/`bPoints` arrays to `zones[].geometryGroups[].abLine` (LineString)
- 5 Statistics moved from flat top-level fields to `stats` objects at plan, zone, and geometry group levels
- 6 Route data is embedded as geometry parts (no separate `routes` array)
- 7 Slope data is per-geometry-part via `slopeDetails` (no separate `slopesResult`)
For Direct GeoJSON API consumers (POST /api/path-plans/direct/geojson)
- 1 Update feature type matching: `boundary` is now `zoneBoundary`, `tracks` and `headlandPasses` are now `geometryPart`
- 2 Use `geometryPartType` property to distinguish geometry parts (replaces old feature type names)
- 3 Replace `partIndex` lookups with `zoneId` and `zoneIndex`
- 4 AB lines are now `abLine` features (LineString) instead of separate `aPoint`/`bPoint` features
- 5 Read `pathPlanStatistics` for aggregated stats (new fields: GHG emissions, coverage metrics)
- 6 Read `zoneStatistics` features for per-zone stats (new feature type)
For clients generating routes
- 1 Use `POST /api/routes/normalized` with `RouteZoneRequest[]`
- 2 Results contain updated `GeometryGroupModel` with route geometry parts
Deprecations
The following endpoints are deprecated and will be removed in a future release. Please migrate to the replacement endpoints.
| Deprecated Endpoint | Replacement |
|---|---|
POST /api/routes
|
POST /api/routes/normalized
|
Questions?
For questions about these API changes, please contact [email protected] or refer to the API documentation.