Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions include/ossim/support_data/ossimNitfXmlTag.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
//----------------------------------------------------------------------------
//
// License: MIT
//
// See LICENSE.txt file in the top level directory for more details.
//
// Author: Ryan Feldbush
//
// Description: Generic tag class declaration for NITF tags in an xml format,
// uses template files fed to the constructor to initialise and check formatting.
//
//----------------------------------------------------------------------------

#ifndef OSSIMNITFXML_H
#define OSSIMNITFXML_H

#include <base/ossimXmlNode.h>
#include <ossim/support_data/ossimNitfRegisteredTag.h>

#include <base/ossimXmlDocument.h>

class OSSIM_DLL ossimNitfXmlTag : public ossimNitfRegisteredTag
{
public:
ossimNitfXmlTag(ossimString formatPath, ossimString tagName);

void parseStream(std::istream &in);

void writeStream(std::ostream &out);

void clearFields();

std::ostream &print(std::ostream &out,
const std::string &prefix) const;

ossimString get(const ossimString& fieldName, int i = 0);
void setField(const ossimString& fieldName, const ossimString& fieldValue, int i = 0);

ossim_uint32 computeTagLength() const;

bool loadState(const ossimKeywordlist& kwl, const char* prefix);


private:
void initializeFields();

//Recursive functions that are called by the functions sharing their name
void r_initializeFields(ossimRefPtr<ossimXmlNode> fieldParent, ossimRefPtr<ossimXmlNode> valueParent);
bool r_loadState(ossimRefPtr<ossimXmlNode> fieldParent, ossimRefPtr<ossimXmlNode> valueParent, ossimKeywordlist& kwl);
ossimString r_get(ossimRefPtr<ossimXmlNode> valueParent, ossimString fieldName, int& i);
void r_set(ossimRefPtr<ossimXmlNode> valueParent, const ossimString& fieldName, const ossimString& fieldValue, int &i);


ossimXmlDocument m_doc;
ossimXmlDocument m_fieldsDoc;
};
#endif //OSSIMNITFXML_H
118 changes: 118 additions & 0 deletions share/ossim/templates/nitfSoddxa_Template.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<?xml version="1.0" encoding="utf-8"?>
<spaceObjectDescriptionData mult="1">
<securityData mult="1">
<Security/>
<soClassification>
<ExternalSecurity mult="1" type="String"/>
</soClassification>
<soSIC type="String"/>
<orconOrganization type="String"/>
<smClassification>
<ExternalSecurity mult="1" type="String"/>
</smClassification>
<smRestrictedCollection type="bool"/>
<accmClassification>
<ExternalSecurity mult="1" type="String"/>
</accmClassification>
<accmImageHold type="bool"/>
</securityData>
<sourceCatalog mult="1" type="String">
<catalogDate mult="1" type="String"/>
<catalogVersion type="String"/>
<absVisualMagnitude type="double"/>
<radarCrossSection type="double"/>
<length type="double"/>
<width type="double"/>
<height type="double"/>
<diameter type="double"/>
<mass type="double"/>
<soUid mult="1" type="String"/>
<soType mult="1" type="String"/>
<nonSatelliteInformation>
<name type="String"/>
<identifier type="String"/>
<description type="String"/>
</nonSatelliteInformation>
<satelliteInformation>
<satNo mult="1" type="int"/>
<targetId type="String"/>
<satelliteName mult="1" type="String"/>
<platformId type="String"/>
<satelliteCategory type="String"/>
<satelliteDescription type="String"/>
<internationalDesignator type="String">
<pieceType mult="1" type="String"/>
</internationalDesignator>
<constellationFlag type="bool"/>
<closelySpacedObject type="bool"/>
<threatCategory type="String"/>
<status type="String">
<statusDate mult="1" type="String"/>
</status>
<flightOrientation type="String"/>
<attitudeControlMode type="String"/>
<attitudeActuatorType type="String"/>
<maneuverData>
<maneuverableVehicleFlag type="bool"/>
<maneuverEpoch mult="1" type="String"/>
<maneuverPurpose type="String"/>
</maneuverData>
<payload>
<payloadName type="String"/>
<payloadId type="String"/>
<payloadDescription type="String"/>
<sensor>
<missionId type="String"/>
<sensorName type="String"/>
<sensorId type="String"/>
<modality type="String"/>
<sensorDescription type="String"/>
</sensor>
</payload>
<launch>
<launchSiteId type="String">
<facilityName mult="1" type="String"/>
</launchSiteId>
<launchOrg type="String"/>
<launchDate type="String"/>
<launchVehicle type="String"/>
</launch>
<affiliation mult="1">
<countryName mult="1" type="String">
<cc mult="1" type="String"/>
</countryName>
<orgName type="String"/>
<orgType type="String"/>
<orgRole type="String"/>
</affiliation>
<assessedIdentity type="String">
<confidence type="int"/>
</assessedIdentity>
</satelliteInformation>
<collectionData mult="1">
<collectionReqId mult="1" type="String"/>
<priority type="int"/>
<revNumber type="int"/>
<passNumber type="int"/>
<background mult="1" type="String"/>
<lightingCondition mult="1" type="String"/>
<appVisualMagnitude type="double"/>
<reflectance type="int"/>
<snr type="double"/>
<backgroundType type="String"/>
</collectionData>
<orbitData>
<epochDate mult="1" type="String"/>
<orbitRegime type="String">
<type type="String"/>
</orbitRegime>
<orbitCenter type="String"/>
<meanMotion type="double"/>
<orbitalPeriod type="double"/>
<inclination type="double"/>
<eccentricity type="double"/>
<apogeeAltitude type="double"/>
<perigeeAltitude type="double"/>
</orbitData>
</sourceCatalog>
</spaceObjectDescriptionData>
40 changes: 40 additions & 0 deletions share/ossim/templates/nitfSorbxa_Template.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<spaceObjectOrbitGeometry mult="1" type="Container">
<Security mult="0"> </Security>
<spaceObjectIdentification mult="1">
<soType mult="1" type="String"> 1</soType>
<satNo mult="0" type="String"> </satNo>
<targetId mult="0" type="String"> </targetId>
<soUid mult="1" type="String"> </soUid>
<name mult="1" type="String"> </name>
<identifier mult="0" type="String"> </identifier>
<description mult="0" type="String"> </description>
<internationalDesignator mult="0" type="String">
<pieceType mult="0" type="String"> </pieceType>
</internationalDesignator>
</spaceObjectIdentification>
<geometryData mult="1">
<glasGfm mult="1">
<atitude mult="0">
<desId mult="1" type="String"> </desId>
<desVer mult="1" type="String"> </desVer>
<uuid mult="1" type="String"> </uuid>
<quality mult="1" type="bool"> </quality>
<startTime mult="1" type="String"> </startTime>
<endTime mult="1" type="String"> </endTime>
<timeInterval mult="1" type="double"> </timeInterval>
<processedType mult="1" type="String"> </processedType>
</atitude>
<ephemeris mult="1">
<desId mult="1" type="String"> </desId>
<desVer mult="1" type="String"> </desVer>
<uuid mult="1" type="String"> </uuid>
<quality mult="1" type="bool"> </quality>
<startTime mult="1" type="String"> </startTime>
<endTime mult="1" type="String"> </endTime>
<timeInterval mult="1" type="double"> </timeInterval>
<processedType mult="1" type="String"> </processedType>
</ephemeris>
</glasGfm>
</geometryData>
</spaceObjectOrbitGeometry>
174 changes: 174 additions & 0 deletions src/support_data/ossimNitfXmlTag.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
//----------------------------------------------------------------------------
//
// License: MIT
//
// See LICENSE.txt file in the top level directory for more details.
//
// Author: Ryan Feldbush
//
// Description: Generic tag function definitions for NITF tags in an xml format,
// uses template files fed to the constructor to initialise and check formatting.
//
//----------------------------------------------------------------------------

#include <support_data/ossimNitfXmlTag.h>
#include <sstream>

ossimNitfXmlTag::ossimNitfXmlTag(ossimString formatPath, ossimString tagName)
: ossimNitfRegisteredTag(tagName, 0)
{
m_fieldsDoc.openFile(formatPath);
initializeFields();
this->m_tagLength = computeTagLength();
}

//Recursive component of the initializeFields method
void ossimNitfXmlTag::r_initializeFields(ossimRefPtr<ossimXmlNode> fieldParent, ossimRefPtr<ossimXmlNode> valueParent)
{
std::vector<ossimRefPtr<ossimXmlNode>> children = fieldParent->getChildNodes();
for (auto& fieldChild: children)
{
if (fieldChild->findAttribute("mult") && fieldChild->getAttributeValue("mult") == "1")
{
auto valueChild = valueParent->addChildNode(fieldChild->getTag());
valueChild->setText(fieldChild->getText());
r_initializeFields(fieldChild, valueChild);
}
}
}

void ossimNitfXmlTag::initializeFields()
{
ossimRefPtr<ossimXmlNode> node = new ossimXmlNode();
node->setTag(m_fieldsDoc.getRoot()->getTag());
m_doc.initRoot(node);
r_initializeFields(m_fieldsDoc.getRoot(), m_doc.getRoot());
}

void ossimNitfXmlTag::parseStream(std::istream &in)
{
std::ostringstream buffer;
std::string line;
std::string delimiter = "</" + m_fieldsDoc.getRoot()->getTag() + ">";
while (std::getline(in, line)) {
if (line.find(delimiter) != std::string::npos) {
buffer << line.substr(0, line.find(delimiter));
break;
}
buffer << line << '\n';
}
m_doc.read(in);
}

void ossimNitfXmlTag::writeStream(std::ostream &out)
{
out << m_doc;
}

void ossimNitfXmlTag::clearFields()
{
m_doc.getRoot()->clear();
initializeFields();
}

std::ostream &ossimNitfXmlTag::print(std::ostream &out,
const std::string &prefix) const
{
out << m_doc;
return out;
}

//Recursive component of the get method
ossimString ossimNitfXmlTag::r_get(ossimRefPtr<ossimXmlNode> valueParent, ossimString fieldName, int& i)
{
std::vector<ossimRefPtr<ossimXmlNode>> children = valueParent->getChildNodes();
for (auto& child: children)
{
if (child->getTag() == fieldName)
{
if (i == 0)
return child->getText();
else
i--;
}
return r_get(child, fieldName, i);
}
return "";
}

ossimString ossimNitfXmlTag::get(const ossimString& fieldName, int i)
{
return r_get(m_doc.getRoot(), fieldName, i);
}

//Recursive component of the set method
void ossimNitfXmlTag::r_set(ossimRefPtr<ossimXmlNode> valueParent, const ossimString& fieldName, const ossimString& fieldValue, int &i)
{
std::vector<ossimRefPtr<ossimXmlNode>> children = valueParent->getChildNodes();
for (auto& child: children)
{
if (child->getTag() == fieldName)
{
if (i == 0)
child->setText(fieldValue);
i--;
}
r_set(child, fieldName, fieldValue, i);
}
}

void ossimNitfXmlTag::setField(const ossimString& fieldName, const ossimString& fieldValue, int i)
{
r_set(m_doc.getRoot(), fieldName, fieldValue, i);
}

ossim_uint32 ossimNitfXmlTag::computeTagLength() const
{
std::stringstream result;
result << m_doc;
return result.str().size();
}

//Recursive component of the loadState method
bool ossimNitfXmlTag::r_loadState(ossimRefPtr<ossimXmlNode> fieldParent, ossimRefPtr<ossimXmlNode> valueParent, ossimKeywordlist& kwl)
{

std::vector<ossimRefPtr<ossimXmlNode>> children = fieldParent->getChildNodes();
std::vector<ossimRefPtr<ossimXmlNode>> valueChildren = valueParent->getChildNodes();
bool needChildren = false;
for (auto& fieldChild: children)
{
ossimRefPtr<ossimXmlNode> valueChild;
for (auto searchChild : valueChildren)
{
if (searchChild->getTag() == fieldChild->getTag())
{
valueChild = searchChild;
break;
}
}
if (!valueChild)
valueChild = valueParent->addChildNode(fieldChild->getTag());
for (const auto& keyword: kwl.getMap())
{
if (fieldChild->getTag().length() <= keyword.first.length() &&
fieldChild->getTag() == keyword.first.substr(0, fieldChild->getTag().length()))
{
valueChild->setText(keyword.second);
kwl.remove(keyword.first.c_str());
break;
}
}
bool needChild = !valueChild->getText().empty() | r_loadState(fieldChild, valueChild, kwl);
if (!needChild && !fieldChild->findAttribute("mult"))
valueParent->removeChild(valueChild);
needChildren = needChildren | needChild;
}
return needChildren;
}

bool ossimNitfXmlTag::loadState(const ossimKeywordlist& kwl, const char* prefix)
{
ossimKeywordlist localKWL = kwl;
return r_loadState(m_fieldsDoc.getRoot(), m_doc.getRoot(), localKWL);
}
Loading