Generates a KML file from a pre-built simulation world.
655 {
656 try
657 {
658
659 ConverterFunc converter;
660 double reference_latitude, reference_longitude, reference_altitude;
661
663 {
665 {
669 auto proj = std::make_shared<GeographicLib::LocalCartesian>(reference_latitude, reference_longitude,
670 reference_altitude);
671 converter = [proj](
const math::Vec3& pos,
double& lat,
double& lon,
double& alt)
672 { proj->Reverse(pos.
x, pos.
y, pos.
z, lat, lon, alt); };
673 break;
674 }
676 {
679 converter = [zone, northp](
const math::Vec3& pos,
double& lat,
double& lon,
double& alt)
680 {
681 double gamma, k;
682 GeographicLib::UTMUPS::Reverse(zone, northp, pos.x, pos.y, lat, lon, gamma, k);
683 alt = pos.z;
684 };
685 break;
686 }
688 {
689 const auto& earth = GeographicLib::Geocentric::WGS84();
690 converter = [&earth](
const math::Vec3& pos,
double& lat,
double& lon,
double& alt)
691 { earth.Reverse(pos.
x, pos.
y, pos.
z, lat, lon, alt); };
692 break;
693 }
694 }
695
696 map<const radar::Platform*, vector<const radar::Object*>> platform_to_objects;
697 const auto group_objects = [&](const auto& objectCollection)
698 {
699 for (const auto& obj_ptr : objectCollection)
700 {
701 platform_to_objects[obj_ptr->getPlatform()].push_back(obj_ptr.get());
702 }
703 };
704
708
710 {
711 bool ref_set = false;
712 for (const auto& platform : platform_to_objects | views::keys)
713 {
714 if (!platform->getMotionPath()->getCoords().empty())
715 {
716 const math::Vec3& first_pos = platform->getMotionPath()->getCoords().front().pos;
717 converter(first_pos, reference_latitude, reference_longitude, reference_altitude);
718 ref_set = true;
719 break;
720 }
721 }
722 if (!ref_set)
723 {
727 }
728 }
729
730 std::ofstream kml_file(outputKmlPath.c_str());
731 if (!kml_file.is_open())
732 {
734 return false;
735 }
736
737 writeKmlHeaderAndStyles(kml_file);
738
739 kml_file << " <Folder>\n";
740 kml_file << " <name>Reference Coordinate</name>\n";
741 kml_file << " <description>Placemarks for various elements in the FERSXML file. All Placemarks are "
742 "situated relative to this reference point.</description>\n";
743 kml_file << " <LookAt>\n";
744 kml_file << " <longitude>" << reference_longitude << "</longitude>\n";
745 kml_file << " <latitude>" << reference_latitude << "</latitude>\n";
746 kml_file << " <altitude>" << reference_altitude << "</altitude>\n";
747 kml_file << " <heading>-148.41</heading><tilt>40.55</tilt><range>10000</range>\n";
748 kml_file << " </LookAt>\n";
749
750 const std::string platform_indent = " ";
751 for (const auto& [platform, objects] : platform_to_objects)
752 {
753 processPlatform(platform, objects, kml_file, converter, reference_altitude, platform_indent);
754 }
755
756 kml_file << " </Folder>\n";
757 kml_file << "</Document>\n";
758 kml_file << "</kml>\n";
759 kml_file.close();
760 }
761 catch (const std::exception& e)
762 {
764 return false;
765 }
766 catch (...)
767 {
769 return false;
770 }
771 return true;
772 }
const std::vector< std::unique_ptr< radar::Target > > & getTargets() const noexcept
Retrieves the list of radar targets.
const std::vector< std::unique_ptr< radar::Transmitter > > & getTransmitters() const noexcept
Retrieves the list of radar transmitters.
const std::vector< std::unique_ptr< radar::Receiver > > & getReceivers() const noexcept
Retrieves the list of radar receivers.
A class representing a vector in rectangular coordinates.
RealType x
The x component of the vector.
RealType z
The z component of the vector.
RealType y
The y component of the vector.
@ ERROR
Error level for error events.
double originLongitude() noexcept
@ UTM
Universal Transverse Mercator.
@ ENU
East-North-Up local tangent plane (default)
@ ECEF
Earth-Centered, Earth-Fixed.
CoordinateFrame coordinateFrame() noexcept
double originLatitude() noexcept
bool utmNorthHemisphere() noexcept
double originAltitude() noexcept