A comprehensive C++ library for agricultural data interchange following ISO 11783 standards. TaskMap provides both ISOXML task definition generation and real-time TLG (Time Log Generation) binary logging capabilities.
- Complete ISOXML package generation with TASKDATA.XML and binary prescription files
- Real farmtrax integration for automatic AB line and swath generation (not hardcoded coordinates)
- Machine width-based swath calculation - specify implement width for accurate swath patterns
- Automatic guidance pattern generation with configurable headland passes
- Field angle optimization for maximum efficiency based on field geometry
- Zoneout library integration for field boundaries and variable rate prescription grids
- Multiple grid layer support for complex variable rate applications
- ISO 11783 compliant XML structure with farms, partfields, guidance patterns, tasks, and treatment zones
- Lightweight C++ object model for core ISOXML elements (Farm, Partfield, Task)
- Load/Save functionality for TASKDATA.XML files using rapidxml
- Comprehensive validation system with error reporting and cross-reference checking
- ID management and validation for all ISOXML element references
- Extensible architecture for adding additional ISOXML element types
- ISO 11783-10 compliant TLG binary format for real-time field operation data
- Position logging with WGS-84 coordinates and GPS status tracking
- Process data logging with DDI (Data Dictionary Identifier) support
- Multiple concurrent logging sessions for different operations
- Proper binary record structure with packed structs for correct file format
- Combined workflows supporting both generation and logging
- Backward compatibility with legacy API maintained
- TaskMap and Taskmap classes for different use cases
taskmap/
├── common/ # Shared utilities
│ ├── xml_utils.hpp # XML generation and coordinate conversion
│ └── bin_utils.hpp # Binary file writing utilities
├── generate.hpp # ISOXML generation module
├── isoxml_model.hpp # ISOXML object model with load/save
├── logging.hpp # TLG binary logging module
└── taskmap.hpp # Unified interface
Run the step-by-step tutorial to learn both the Generator and Object Model:
make config && make build
./build/tutorial
This tutorial covers:
- Creating field boundaries and zones
- Generating complete ISOXML packages with guidance patterns
- Working with the ISOXML object model directly
- Validation, save/load operations
#include "taskmap/generate.hpp"
// Create zone with boundary and prescription data
zoneout::Zone zone("Field1", "agricultural", boundary, datum, 10.0);
// Generate complete ISOXML package with precise swath calculation
taskmap::ISOXMLGenerator generator;
generator.generate_from_zone(zone, "VRT Fertilization");
// Add guidance patterns with machine-specific parameters
double machine_width = 18.0; // 18-meter sprayer width
double field_angle = 0.0; // Auto-calculated or custom angle
int headland_passes = 2; // Number of headland passes
generator.add_guidance_patterns(zone, machine_width, field_angle, headland_passes);
generator.write_taskdata_package("./output");
// Automatically includes:
// - Field boundary from zoneout polygon data
// - Machine width-based AB lines and swaths from farmtrax library
// - Treatment zones for each grid layer
// - Binary prescription files
#include "taskmap/isoxml_model.hpp"
// Create new ISOXML document
taskmap::ISOXMLDocument doc;
doc.set_management_software("My FMIS", "2.0");
// Create farm structure
auto farm = std::make_shared<taskmap::Farm>("FRM1", "Demo Farm");
farm->city = "Farmville";
farm->country = "USA";
auto partfield = std::make_shared<taskmap::Partfield>("PFD1", "North Field", "FRM1");
partfield->area = "25.5"; // hectares
auto task = std::make_shared<taskmap::Task>("TSK1", "Spring Fertilization");
task->farm_id_ref = "FRM1";
task->partfield_id_ref = "PFD1";
// Add to document with automatic ID validation
doc.add_element(farm);
doc.add_element(partfield);
doc.add_element(task);
// Save to file
doc.save("./output/taskdata.xml");
// Load existing file
taskmap::ISOXMLDocument loaded_doc;
loaded_doc.load("./output/taskdata.xml");
// Validate structure
auto validation_messages = loaded_doc.validate();
for (const auto& msg : validation_messages) {
std::cout << msg.to_string() << std::endl;
}
#include "taskmap/logging.hpp"
// Start field operation logging
taskmap::TaskLogger logger("./output/TLG");
auto* log = logger.start_logging_session("001");
// Log position and process data (WGS-84 coordinates)
logger.update_position(5654321.0, 654321.0, 2); // WGS-84 coords, DGPS quality
logger.log_process_data(taskmap::DDI::APPLICATION_RATE, 280.0);
logger.log_process_data(taskmap::DDI::MACHINE_SPEED, 14000); // mm/s
// Close session - generates TIM0001.TLG file
logger.close_session("001");
#include "taskmap/taskmap.hpp"
// Plan task and start execution
taskmap::TaskMap taskmap("./output");
auto* log = taskmap.plan_and_execute_task(zone, "Field Operation", "001");
// Execute field operation
taskmap.log_position(utm_north, utm_east, gps_status);
taskmap.log_process_data(taskmap::DDI::APPLICATION_RATE, rate);
// Finish operation
taskmap.finish_field_operation("001");
- C++17 compiler
- CMake 3.10+
- Dependencies: zoneout, farmtrax, concord, rapidxml, doctest
make config # Configure and generate build files
make build # Build the project
make test # Run all tests with verbose output
make run # Run the main executable
./build/tutorial # Step-by-step tutorial (RECOMMENDED START HERE)
./build/taskmap_example # ISOXML generation example
./build/logging_example # TLG logging example
./build/isoxml # ISOXML object model demonstration
ISOXML package generated successfully!
Output files:
- ./output/TASKDATA/TASKDATA.XML # Complete task definition
- ./output/TASKDATA/Prescription.bin # Variable rate prescription data
Generated ISOXML Preview:
<?xml version="1.0" encoding="UTF-8"?>
<ISO11783_TaskData VersionMajor="3" VersionMinor="3">
<FRM A="FRM1" B="TestField"/>
<PFD A="PFD1" B="TestField_field" C="FRM1">
<PLN A="BORDER" B="1">
<PNT A="1" B="1" C="5653851.210384" D="710299.169043"/>
<!-- Real coordinates from farmtrax AB line generation -->
TLG Logging Example
==================
Created TLG file: ./output/TLG/TIM0001.TLG
Field operation completed!
Total records logged: 173
TLG file created: ./output/TLG/TIM0001.TLG (3492 bytes)
Created TLG files:
TIM0001.TLG (3492 bytes) # Main operation log
TIM0100.TLG (72 bytes) # Additional session A
TIM0200.TLG (72 bytes) # Additional session B
- Uses
farmtrax::Field(boundary, datum, true, 200000.0, false)
for field partitioning - Calls
field.gen_field(swath_width, angle_degrees, headland_count)
for swath generation - Machine width parameter is critical - determines number of swaths across field
- Field angle optimization - automatic or manual angle for maximum efficiency
- Processes real
field.get_parts()
output for AB lines and headlands - No hardcoded coordinates - all guidance patterns from actual farmtrax calculations
- Header-only implementation using templates and inline functions
- Core elements: Farm, Partfield, Task with full attribute support
- Validation system: Cross-reference checking with detailed error messages
- XML parsing/generation: Uses rapidxml for high-performance processing
- ID management: Automatic duplicate prevention and reference validation
- Constructor:
zoneout::Zone(name, type, boundary, datum, resolution)
- Multiple grid layer support:
zone.grid_data_.getGrid(i)
for each layer - Field boundary extraction:
zone.poly_data_.getFieldBoundary()
- Automatic treatment zone generation for each grid layer
// File Structure (ISO Compliant)
[Header - 32 bytes]: "TLG\0" + version + reserved
[Position Records]: type(1) + timestamp(4) + WGS84_N(4) + WGS84_E(4) + GPS(1) + pad(3) = 17 bytes
[Process Data Records]: type(1) + timestamp(4) + DDI(2) + value(4) + device(1) + pad(1) = 13 bytes
// WGS-84 coordinates in 10^-7 degrees precision
// GPS quality: 0=No GPS, 1=GNSS, 2=DGPS, 3=PPS, 4=RTK, 5=Float RTK, 6=Estimated
DDI::APPLICATION_RATE = 6
(kg/ha)DDI::MACHINE_SPEED = 148
(mm/s)DDI::ACTUAL_WORK_STATE = 141
(0=not working, 1=working)DDI::FUEL_CONSUMPTION = 183
(ml/h)- Full list of agricultural DDI constants provided
- test_generation.cpp: ISOXML generation with farmtrax integration
- test_logging.cpp: ISO-compliant TLG binary format with WGS-84 coordinates
- test_bin_utils.cpp: Type 1/Type 2 grid formats and binary compliance
- test_integration.cpp: End-to-end workflows combining generation and logging
- test_xml_utils.cpp: XML utilities and coordinate conversion
- 443+ assertions covering ISO 11783-10 compliance verification
make test # Run all tests
./build/test_generation # Test ISOXML generation
./build/test_logging # Test TLG binary logging
./build/test_integration # Test combined workflows
The original taskmap::Taskmap
class is preserved for backward compatibility:
taskmap::Taskmap legacy; // Still works
legacy.generate_isoxml_package(zone, output_dir, "Task");
output/
├── TASKDATA/ # ISOXML package
│ ├── TASKDATA.XML # Main task definition
│ ├── Prescription.bin # Grid layer 0 prescription
│ └── Prescription_1.bin # Additional grid layers
└── TLG/ # Time log files
├── TIM0001.TLG # Task execution log
├── TIM0002.TLG # Additional operations
└── ...
- Precision Agriculture: Generate variable rate application maps with machine width-based AB line guidance
- Fleet Management: Log real-time field operation data for analysis and compliance
- FMIS Integration: Create ISO 11783 compliant data for farm management systems
- Research Applications: Collect detailed field operation data with GPS tracking
- Equipment Integration: Interface with agricultural machinery for data exchange
- Task Controller Integration: Load/save TASKDATA.XML files for ISOBUS equipment
- Data Validation: Comprehensive validation of ISOXML structure and cross-references
See LICENSE file for details.
- Follow the code style defined in
.clang-format
- All functions must be fully implemented (no stubs)
- Preserve real farmtrax integration for AB line generation
- Maintain ISO compliance for both ISOXML and TLG formats
- Add tests for new functionality
- zoneout: Field boundary and grid data management
- farmtrax: Automatic AB line and swath generation
- concord: Coordinate conversions and geometric operations
- rapidxml: Fast XML parsing and generation
- doctest: Unit testing framework