Initial commit

This commit is contained in:
torsten committed 2026-08-13 18:33:10 +02:00
commit b7d90b9afe
16245 files changed
+3396666

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 KiB

+52
View File
@@ -0,0 +1,52 @@
/**
* @RDE_HEADER@
* Interface of AbstractEffectSimulation
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
#include "abstract_map_object.h"
#include "line_style.h"
#include "fill_style.h"
//----------------------------------------------------------------------------
namespace SituationMap
{
/**
* @brief The AesEffectState enum define the different states a EffectSimulation can have.
*/
enum class AesEffectState
{
Unknown = 0, ///< EffectSimulation is unknown.
Error = -1, ///< EffectSimulation has an error.
Expired = 1, ///< EffectSimulation has finished.
Removed = 2, ///< EffectSimulation is deleted.
Created = 4, ///< EffectSimulation is created.
Prepared = 5, ///< EffectSimulation is created, but activation time is in future.
Activated = 6, ///< EffectSimulation is created, and activation time is aimed.
Paused = 7 ///< A triggered EffectSimulation is paused.
};
/**
* @brief The AbstractEffectSimulation class contains some specific parameters.
* Inherenting of this class ease the adding of this functionality.
*/
class SITUATIONMAP_EXPORT AbstractEffectSimulation
{
public:
virtual ~AbstractEffectSimulation() = default;
virtual AesEffectState aesState() const = 0;
virtual void setAesState(AesEffectState aesState) = 0;
};
} // namespace SituationMap
+424
View File
@@ -0,0 +1,424 @@
/**
* @RDE_HEADER@
* Interface of AbstractMapObject
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include "situation_map_utils.h"
#include "text_style.h"
#include <Common/referenced.h>
#include <situation_map_export.h>
#include <MathUtils/geometry_engine.h>
// Qt
#include <QString>
#include <QColor>
#include <QList>
//----------------------------------------------------------------------------
namespace SituationMap
{
// forward:
class BoundingBox;
/**
* @brief The AbstractMapObject class is the baseclass of all MapObjects.
* (The class 'Referenced' is for the RefPointer only)
*
* This class supports main parameters like uniqueMapId, debugInfo and identifier
* to differentiate the objects.
*
* Second, the SymbolData can be set to use the TacticalAppearance of objects.
*
* Last but not least, visibility and drawOrder can be modified.
*
* An object has typically two Appearances:
* The Technical and the Tactical Appearance.
* Both can be switched on of off separatly,
* see setVisibility(ObjectAppearance appearance, bool visibility).
* @internal
* The AbstractMapObjectImpl has to be initialized (set the Map, Layer and so on).
* This call is done by the ObjectFactory.
*/
class SITUATIONMAP_EXPORT AbstractMapObject : virtual public Referenced
{
public:
/*! \name Construction, Destruction */
//@{
/// Constructor
AbstractMapObject() = default;
/// Destructor
virtual ~AbstractMapObject() = default;
virtual void removeMySelf() = 0;
//@}
/*! \name Emulate QObject::property */
//@{
/**
* @brief Set named property to value.
* @param name name.
* @param value value.
* @return True on success, otherwise false.
*/
virtual bool setProperty(const char *name, const QVariant &value) = 0;
/**
* @brief Get named property to value.
* @param name to retrieve
* @return Requested value.
*/
virtual QVariant property(const char *name) const = 0;
//@}
/*! \name Identification */
//@{
/**
* @brief Get uniqueMapId.
* @return uniqueMapId.
*/
virtual UniqueMapId uniqueMapId() const = 0;
/**
* @brief Get debugInfo.
* @return debugInfo.
*/
virtual QString debugInfo() const = 0;
/**
* @brief Set DebugInfo.
* @param debugInfo new value.
*/
virtual void setDebugInfo(const QString &debugInfo) = 0;
/**
* @brief toString delivers a string with some parameters.
* @return String with some parameters.
*/
virtual QString toString() const = 0;
/**
* @brief Get identifier.
* @return identifier.
*/
virtual QString identifier() const = 0;
/**
* @brief Set identifier of object to be displayed on the Map.
* @param identifier new value.
*/
virtual void setIdentifier(const QString &identifier) = 0;
virtual bool identifierVisible() const = 0;
virtual void setIdentifierVisible(bool identifierVisible) = 0;
//@}
/*! \name Direct and indirect assignment
* These values (partyId) has a high priority. Therefore it will overwrite
* some other values.
* \n An example is the line and fill color of an AreaFire.
* \n You can specify AreaFire::rLineStyle.setLineColor(Qt::blue) (== direct).
* \n But if a valid partyId is provided, this will overwrite the line and fill
* \n Exeption:
* \n If forcePartyColor is used, this has more priority than the partyId.
* parameter, color (== indirect).
*/
//@{
/**
* @brief Get partyId.
* @return partyId.
*/
virtual int partyId() const = 0;
/**
* @brief Check partyId
* @return True if partyId is valid, otherwise false.
*/
virtual bool isPartyIdValid() const = 0;
/**
* @brief Set PartyId
* @param partyId new value.
*/
virtual void setPartyId(int partyId) = 0;
/**
* @brief If the color of a party changes the partyId has to re-evaluated to the new color.
* @param partyColorToForce the color to be forced.
* This method set the internal flag, that the next updateView will take the new color.
*/
/**
* @brief If the color of a party changes the partyId has to re-evaluated to the new color.
* If relevant this method will set the internal flag, that the next updateView will take the new color.
* @param partyId causing the change, If less then 0, setting the internal flag is forced.
* @return true if relevant for this object, otherwise false
*/
virtual bool setPartyIdChanged(int partyId = -1) = 0;
/**
* @brief forcePartyColor to fulfill the flashing (e.g. of a participant)
* This forcedColor has more priority that than the partyId.
* @param partyColorToForce the color to be forced.
*/
virtual void forcePartyColor(const QColor &partyColorToBeForced) = 0;
//@}
/**
* @brief useLightColor Use the light party color instead the normal one
*/
virtual bool useLightColor() const = 0; ///< Only for Participants
virtual void setUseLightColor(bool useLightColor) = 0; ///< Only for Participants
//@}
//@{
/**
* @brief Get copy of textStyle.
* @return textStyle.
*/
virtual TextStyle textStyle() const = 0;
/**
* @brief Get reference to TextStyle (to modify easily).
* @return Reference to TextStyle.
* @note: Use this with caution. This will set the internal changed flag.
* Maybe you should prefer setTextStyle.
*/
virtual TextStyle &rTextStyle() = 0;
/**
* @brief Set TextStyle to be used for identifier.
* @param textStyle new value.
*/
virtual void setTextStyle(const TextStyle &textStyle) = 0;
//@}
/*! \name User scale */
//@{
/**
* @brief Get scale.
* @return scale
*/
virtual float scale() const = 0;
/**
* @brief Set scale of object.
* @param newScale new value.
*/
virtual void setScale(float newScale) = 0;
virtual bool isScaleEnabled() const = 0;
virtual void setScaleEnable(bool enabled) = 0;
//@}
/*! \name Layer and draworder */
//@{
/**
* @brief Get logical layername.
* @return logical layername.
*/
virtual QString layer() const = 0;
/**
* @brief Get drawOrder.
* @return drawOrder.
*/
virtual int drawOrder() const = 0;
/**
* @brief Set drawOrder.
* Caused by internal dependencies, the value MUST be within -3000...+3000. (INT_MAX=+32767 / 10 = 3276 -> ~3000).
* \n Otherwise the internal graphics will be disordered.
* \internal Background: Due to missing relative drawOrder an absolute drawOrder has to be used.\n
* To create an absolute drawOrder the specified drawOrder is multiplied with 10.
* The components (usually GraphicalObjects) receive that multiplied valued added by s small offset.
* drawOrder() is not influenced by this and will return the value you set before.
* @param drawOrder new value.
*/
virtual void setDrawOrder(int drawOrder) = 0;
//@}
/** \name Visibility
* If the object has to be invisible setVisibility() should be used.
*
* If only a single part has to be modified, remember the Technical and the Tactical ObjectAppearance.
* Both can be switch on or off separately.
*
* Attention: If the two ObjectAppearances are invisible setVisibility(true) will make them <B>NOT</B> visibile.
**/
//@{
// Visibility :
// Prio 1:
/**
* @brief Get visibility of the whole object (Prio 1).
* @return visibility of the whole object.
*/
virtual bool visibility() const = 0;
/**
* @brief Set visibility of the whole object (Prio 1).
* @param visibility new value.
*/
virtual void setVisibility(bool visibility) = 0;
// Prio 2
/**
* @brief Get visibility of a specific ObjectAppearance (Prio 2).
* @param appearance to be retrieved.
* @return Current value.
*/
virtual bool visibility(ObjectAppearance appearance) const = 0;
/**
* @brief Set Visibility of a specific ObjectAppearance (Prio 2).
* @param appearance to be modified.
* @param visibility new value.
*/
virtual void setVisibility(ObjectAppearance appearance, bool visibility) = 0;
/**
Calculates the intersection of map object another geometry
@param intersector_polyline Geometry to intersect with
@note: The geometry must be closed like a polyline. (not really sure)
*/
virtual bool geometryIntersect(const MathUtils::GeometryEngine::Geometry &intersector_polyline) const = 0;
/**
Calculates if the map object is inside another geometry.
@param hull_polygon Geometry to check against.
@note: The geometry must be closed like a polygon. (not really sure)
*/
virtual bool geometryIsInHull(const MathUtils::GeometryEngine::Geometry &hull_polygon) const = 0;
protected:
static int s_scaleHasVisibilityValue;
public:
static void setScaleHasVisibility(int scaleHasVisibility)
{
s_scaleHasVisibilityValue = scaleHasVisibility;
}
// : Visibility
//@}
/*! \name Selection, Picking */
//@{
/**
* @brief Get selected state.
* @return true if selected, otherwise false.
*/
virtual bool selected() const = 0;
/**
* @brief Set selected state.
* @param selected new state.
*/
virtual void setSelected(bool selected) = 0;
/**
* @brief Get pickable state.
* @return true if pickable, otherwise false.
*/
virtual bool pickable() const = 0;
/**
* @brief Set pickable state.
* @param pickable new state.
*/
virtual void setPickable(bool pickable) = 0;
//@}
/*! \name Symbol */
//@{
/**
* @brief Get current symbol.
* @return Current symbol.
*/
virtual SymbolData symbol() const = 0;
/**
* @brief Set new Symbol
* @param symbol new value.
*/
virtual void setSymbol(const SymbolData &symbol) = 0;
/**
* @brief reRenderSymbol
* Will set the changed flag to true, following updateView is required
*/
virtual void reRenderSymbol() = 0;
virtual SymbolDataToRender symbolDataToRender() const = 0;
/**
* @brief symbolImage returns an image, maybe to be used as preview icon.
* @return image of this MapObject.
*/
virtual SymbolImage symbolImage() const = 0;
virtual QImage previewImage() const = 0;
virtual QImage previewImageTypical() const = 0;
virtual QImage previewImageSpecific() const = 0;
//@}
/*! \name Common convenience methode, e.g. for MapObjectIndicator */
//@{
virtual void boundingBox(BoundingBox &bbox) const = 0;
virtual void setForceMajorColor(const QColor &majorColor) = 0;
virtual QColor majorColor() const = 0;
//@}
/*! \name Some methods regarding extrusion (renderer approach) */
//@{
virtual double extrusionHeight() const = 0;
virtual void setExtrusionHeight(double height = std::nan("")) = 0;
virtual const QString extrusionColorName() const = 0;
virtual void setExtrusionColorName(const QString &extrusionColorName) = 0;
//@}
/*! \name updateView */
//@{
/**
* @brief Transfer all values to view
* @return true on success
*/
virtual bool updateView() = 0;
//@}
};
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
/**
* @brief Output operator used fo all deriving classes.
* @param stream used to stream into.
* @param value to be streamed.
* @return appended stream.
*/
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const AbstractMapObject &value);
} // namespace SituationMap
+170
View File
@@ -0,0 +1,170 @@
/**
* @RDE_HEADER@
* Interface of AbstractMapObject
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "bounding_box.h"
#include "situation_map_utils.h"
#include <situation_map_export.h>
//----------------------------------------------------------------------------
namespace SituationMap
{
BoundingBox::BoundingBox(ExtentType extentType)
{
reset();
m_extentType = extentType;
}
BoundingBox::BoundingBox(ExtentType extentType, const Point3D &center, double width, double height)
: m_extentType(extentType),
m_center(center),
m_width(width),
m_height(height)
{
}
void BoundingBox::reset()
{
m_extentType = ExtentType::Undefined;
m_center = Point3D();
m_width = m_height = std::numeric_limits<double>::lowest();
}
BoundingBox::ExtentType BoundingBox::extentType() const
{
return m_extentType;
}
void BoundingBox::setExtentType(BoundingBox::ExtentType extentType)
{
m_extentType = extentType;
}
bool BoundingBox::isValid() const
{
return
m_extentType != ExtentType::Undefined &&
!m_center.isNull() &&
m_width != std::numeric_limits<double>::lowest() &&
m_height != std::numeric_limits<double>::lowest();
}
Point3D BoundingBox::center() const
{
return m_center;
}
double BoundingBox::width() const
{
return m_width;
}
double BoundingBox::height() const
{
return m_height;
}
Point3D BoundingBox::topLeft() const
{
return Point3D(m_center.x() - width() / 2.0,
m_center.y() + height() / 2.0,
m_center.z());
}
Point3D BoundingBox::topRight() const
{
return Point3D(m_center.x() + width() / 2.0,
m_center.y() + height() / 2.0,
m_center.z());
}
Point3D BoundingBox::bottomLeft() const
{
return Point3D(m_center.x() - width() / 2.0,
m_center.y() - height() / 2.0,
m_center.z());
}
Point3D BoundingBox::bottomRight() const
{
return Point3D(m_center.x() + width() / 2.0,
m_center.y() - height() / 2.0,
m_center.z());
}
Point3D BoundingBox::centerRight() const
{
return Point3D(m_center.x() + width() / 2.0,
m_center.y(),
m_center.z());
}
PositionCont BoundingBox::positions() const
{
PositionCont posCont;
posCont.reserve(4);
posCont.append(topLeft());
posCont.append(topRight());
posCont.append(bottomRight());
posCont.append(bottomLeft());
return posCont;
}
QString BoundingBox::toString() const
{
QString asString = toString(m_extentType);
asString += QStringLiteral(" center=(%1;%2;%3), width=%4, height=%5")
.arg(m_center.x()).arg(m_center.y()).arg(m_center.z()).arg(m_width).arg(m_height);
return asString;
}
QString BoundingBox::toString(BoundingBox::ExtentType value)
{
switch (value)
{
case BoundingBox::ExtentType::Undefined:
return QLatin1String("Undefined");
case BoundingBox::ExtentType::Sim:
return QLatin1String("Sim");
case BoundingBox::ExtentType::Pixel:
return QLatin1String("Pixel");
} // switch
return QLatin1String("BoundingBox::ExtentTypeERROR");
}
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const BoundingBox &value)
{
stream << value.toString();
return stream;
}
std::ostream &operator<< (std::ostream &stream,
const BoundingBox::ExtentType &value)
{
stream << BoundingBox::toString(value);
return stream;
}
} // namespace SituationMap
+85
View File
@@ -0,0 +1,85 @@
/**
* @RDE_HEADER@
* Interface of AbstractMapObject
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include "situation_map_utils.h"
#include <situation_map_export.h>
// Qt
//----------------------------------------------------------------------------
namespace SituationMap
{
class SITUATIONMAP_EXPORT BoundingBox
{
public:
enum class ExtentType {Undefined, Sim, Pixel};
static QString toString(BoundingBox::ExtentType value);
public:
explicit BoundingBox(ExtentType extentType = ExtentType::Undefined);
explicit BoundingBox(ExtentType extentType, const Point3D &center, double width = 0, double height = 0); ///< relative to BasePoint
void reset();
ExtentType extentType() const;
void setExtentType(ExtentType extentType);
bool isValid() const;
Point3D center() const;
double width() const; ///< interpret values depending on type
double height() const; ///< interpret values depending on type
Point3D topLeft() const; ///< use quadrant 1
Point3D topRight() const; ///< use quadrant 1
Point3D bottomLeft() const; ///< use quadrant 1
Point3D bottomRight() const; ///< use quadrant 1
Point3D centerRight() const; ///< use quadrant 1
PositionCont positions() const;
QString toString() const;
protected:
ExtentType m_extentType = ExtentType::Undefined; ///< relevant for width and height
Point3D m_center; ///< simCoordinates
double m_width; ///< simCoordinates or pixel
double m_height; ///< simCoordinates or pixel
};
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
/**
* @brief Output operator
* @param stream used to stream into.
* @param value to be streamed.
* @return appended stream.
*/
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const BoundingBox &value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const BoundingBox::ExtentType &value);
} // namespace SituationMap
+99
View File
@@ -0,0 +1,99 @@
/**
* @RDE_HEADER@
* Class Camera
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "camera.h"
// Qt
#include <QJsonObject>
//----------------------------------------------------------------------------
namespace SituationMap
{
Camera::Camera()
{
resetCamera();
}
void Camera::resetCamera()
{
loc_x_lon = 0;
loc_y_lat = 0;
loc_z = 0;
heading = 0;
pitch = 0;
roll = 0;
}
bool Camera::isNull() const
{
return qFuzzyIsNull(loc_x_lon) && qFuzzyIsNull(loc_y_lat) && qFuzzyIsNull(loc_z) &&
qFuzzyIsNull(heading) && qFuzzyIsNull(pitch) && qFuzzyIsNull(roll);
}
Camera Camera::read(const QJsonObject &json)
{
Camera cam;
if (json.contains(QLatin1String("loc_x_lon")))
cam.loc_x_lon = json[QLatin1String("loc_x_lon")].toDouble();
if (json.contains(QLatin1String("loc_y_lat")))
cam.loc_y_lat = json[QLatin1String("loc_y_lat")].toDouble();
if (json.contains(QLatin1String("loc_z")))
cam.loc_z = json[QLatin1String("loc_z")].toDouble();
if (json.contains(QLatin1String("heading")))
cam.heading = json[QLatin1String("heading")].toDouble();
if (json.contains(QLatin1String("loc_x_lon")))
cam.pitch = json[QLatin1String("pitch")].toDouble();
if (json.contains(QLatin1String("roll")))
cam.roll = json[QLatin1String("roll")].toDouble();
return cam;
}
QJsonObject Camera::toJsonObject() const
{
QJsonObject json;
json[QLatin1String("loc_x_lon")] = loc_x_lon;
json[QLatin1String("loc_y_lat")] = loc_y_lat;
json[QLatin1String("loc_z")] = loc_z;
json[QLatin1String("heading")] = heading;
json[QLatin1String("pitch")] = pitch;
json[QLatin1String("roll")] = roll;
return json;
}
QString Camera::toString() const
{
QString str;
str.append(QStringLiteral("xLon;yLat=%1;%2[rad").arg(loc_x_lon).arg(loc_y_lat) );
str.append(QStringLiteral("xLon;yLat=%1;%2[deg").arg(loc_x_lon*180.0/M_PI).arg(loc_y_lat*180.0/M_PI) );
str.append(QStringLiteral(" z=%1").arg(loc_z));
str.append(QStringLiteral(" heading=%1").arg(heading));
str.append(QStringLiteral(" pitch=%1").arg(pitch));
str.append(QStringLiteral(" roll=%1").arg(roll));
return str;
}
std::ostream &operator<< (std::ostream &stream,
const Camera &value)
{
stream << "Camera(" << value.toString() << "): ";
return stream;
}
} // namespace SituationMap
+63
View File
@@ -0,0 +1,63 @@
/**
* @RDE_HEADER@
* Class Camera
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <Common/situation_map_logging.h>
#include <situation_map_export.h>
// Qt
#include <QString>
class QJsonObject;
//----------------------------------------------------------------------------
namespace SituationMap
{
//----------------------------------------------------------------------------
// for 3D:
/**
* @brief A Camera contains the spatial parameters to set a 3D view on a Scene (3D):
* A virtual camera's location, orientation and field of view.
*
*/
class SITUATIONMAP_EXPORT Camera
{
public:
Camera();
~Camera() = default;
void resetCamera();
bool isNull() const;
static Camera read(const QJsonObject &json);
QJsonObject toJsonObject() const;
QString toString() const;
double loc_x_lon; ///< location x (longitude)
double loc_y_lat; ///< location y (latitude)
double loc_z; ///< location z
double heading;
double pitch;
double roll;
};
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::Camera &value);
} // namespace SituationMap
+88
View File
@@ -0,0 +1,88 @@
/**
* @RDE_HEADER@
* Interface-Implementation of Map
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
// ESRI
// Qt
#include <QString>
namespace Esri
{
namespace ArcGISRuntime
{
class Point;
}
}
namespace SituationMap
{
/**
* @brief The CoordTranslationFunctor is a base class translating between
* the GeographicCoordinats (WGS84 - EPSG:4326) and the
* EsriMap working on map coordinates.
*
* Forward (geographicToMap):
* Geo (lon, lat) to map.
*
* Backward (mapToGeographic):
* Map to Geo (lon, lat).
*/
class CoordTranslationFunctor
{
public:
/*! \name Construction, Destruction */
//@{
explicit CoordTranslationFunctor() = default; ///< Contructor
virtual ~CoordTranslationFunctor() = default; ///< Destructor
//@}
/*! \name Complete translation */
//@{
Q_REQUIRED_RESULT virtual QPointF geographicToMap(const double lon, const double lat) const = 0; ///< Forward: geographic coord to mapCoord, in radian
Q_REQUIRED_RESULT virtual QPointF mapToGeographic(const double x, const double y) const = 0; ///< Backward: mapCoord to geographic Coord
Q_REQUIRED_RESULT virtual QPointF geographicToMap(const QPointF &coord) const = 0; ///< Forward: geographic coord to mapCoord
Q_REQUIRED_RESULT virtual QPointF mapToGeographic(const QPointF &coord) const = 0; ///< Backward: mapCoord to geographic Coord
Q_REQUIRED_RESULT virtual QPointF geographicToMap(const Esri::ArcGISRuntime::Point &coord) const = 0; ///< Forward: geographic coord to mapCoord
Q_REQUIRED_RESULT virtual QPointF mapToGeographic(const Esri::ArcGISRuntime::Point &coord) const = 0; ///< Backward: mapCoord to geographic Coord
Q_REQUIRED_RESULT virtual Point3D geographicToMap(const Point3D &point3D) const = 0; ///< Forward: geographic coord to mapCoord
Q_REQUIRED_RESULT virtual Point3D mapToGeographic(const Point3D &point3D) const = 0; ///< Backward: mapCoord to geographic Coord
Q_REQUIRED_RESULT virtual bool mapIsGeographic() const = 0;
virtual void geographicToUtm(const double referenceLon, QList<QPointF> &points) const = 0; ///< tanslate to proper utm coordinate system
virtual void utmToGeographic(const double referenceLon, QList<QPointF> &points) const = 0; ///< translate back to goegraphic coordiante system
//@}
/*! \name For statistic or tests */
//@{
virtual int projectionCounter() const = 0;
virtual void resetProjectionCounter() = 0;
//@}
};
//------------------------------------------------------------------------------
} // namespace SituationMap
+146
View File
@@ -0,0 +1,146 @@
/**
**
** @RDE_HEADER@
** Simple DropEventManager to manage drop events in SituationMap Map Widget
** $Id$
** $HeadURL$
** $Author$
**
** -----------------------------------------------------------------------------------------------
**
** Hardware-Environment: Intel-PC
** Software-Environment: Windows 7, Linux, Qt 5.4. ArcGIS 10.2.5
**
** Language ........: C++ 11
**
** -----------------------------------------------------------------------------------------------
**
** Author ...........: Jörg Turla, SPD G, Tel. 3132
**
** -----------------------------------------------------------------------------------------------
**
** Notes .........:
**
** 18.12.2015, JT : First edition for use with Qt5
**
** -----------------------------------------------------------------------------------------------
*/
#pragma once
#include <Common/referenced.h>
#include <QtCore/QPoint>
class QMimeData;
namespace SituationMap
{
/**
@class DropEventManager drop_event_manager.h
@brief Drop event manager interface class.
@see SituationMap::Map, PBase::PDropHandler
To process drop events the map window has to decide accepting a drop when it gets a drag enter event or not, depending on the type of mime data. Later
when receiving a drop event the dropped data has to be processed. The DropEventManager class provides information of mime data type to decide handling
the type of drop event or not. The function mimeFormatString() should return a uniquely defined string. To handle a special drop event the map will call
the manageDrop function. Both functions have to be implemented in the derived class.
Following example shows how to implement a drop event mamager.
@code
#include <Map/drop_event_manager.h>
class DropEventManager : public SituationMap::DropEventManager
{
public:
DropEventManager() = default;
virtual ~DropEventManager()
{
// delete all dropHandler
for (auto key : m_dropHandlerMap.keys())
{
delete m_dropHandlerMap[key];
m_dropHandlerMap[key] = nullptr;
}
} // ~DropEventManager()
QString mimeFormatString() const { return QLatin1String("DropHandlerPtr"); }
void manageDrop( QPoint windowPos, const QMimeData * mimeData ) override
{
bool ok = false;
qulonglong dropHandlerKey = mimeData->data(mimeFormatString()).toULongLong(&ok);
if (ok)
{
QMap<qulonglong,PBase::PDropHandler*>::iterator dropHandler;
dropHandler = m_dropHandlerMap.find( dropHandlerKey );
if (dropHandler != m_dropHandlerMap.end())
{
(*dropHandler)->doDrop( windowPos.x(), windowPos.y(), mimeData );
}
}
} // manageDrop( const QMimeData * mimeData )
qulonglong add( PBase::PDropHandler * dropHandler )
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// DropEvewntManager get ownership of dropHandler and delete them in dtor.
// See dtor above.
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
qulonglong key = qulonglong(dropHandler);
if (dropHandler)
{
m_dropHandlerMap[key] = dropHandler;
}
return key;
} // add(PBase::PDropHandler * dropHandler)
protected:
QMap<qulonglong,PBase::PDropHandler*> m_dropHandlerMap;
}; // DropEventManager
void installDropEventManager()
{
m_dropEventManager = new DropEventManager();
m_map -> installDropEventManager( m_dropEventManager );
}
@endcode
*/
class DropEventManager : public Referenced
{
public:
DropEventManager() = default;
~DropEventManager() = default;
DropEventManager(const DropEventManager *) = delete;
/*
The function \c mimeFormatString() returns a uniquely defined string to identify type of mime data. The string will be used to call \c QMimeData::hasFormat()
@see QMimeData
*/
virtual QString mimeFormatString() const = 0;
/*
The function \c manageDrop() will be called to process drop events
@param windowPos Mouse cursor from drop event
@param mimeData Data of drop event to process.
*/
virtual void manageDrop(QPoint windowPos, const QMimeData *mimeData) = 0;
}; // DropEventManager
} // namespace SituationMap
+67
View File
@@ -0,0 +1,67 @@
/**
* @RDE_HEADER@
* FillStyle
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "fill_style.h"
// ESRI
namespace SituationMap
{
FillStyle::FillStyle(const QColor &fillColor, FillPattern fillPattern)
: m_fillColor(fillColor)
, m_fillPattern(fillPattern)
{
}
FillStyle::FillStyle(FillPattern fillPattern)
: m_fillPattern(fillPattern)
{
}
QColor FillStyle::fillColor() const
{
return m_fillColor;
}
void FillStyle::setFillColor(const QColor &fillColor)
{
m_fillColor = fillColor;
}
SituationMap::FillPattern FillStyle::fillPattern() const
{
return m_fillPattern;
}
void FillStyle::setFillPattern(const SituationMap::FillPattern &fillPattern)
{
m_fillPattern = fillPattern;
}
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const FillStyle &value)
{
QString str;
str.append(QStringLiteral(" fillPattern='%1'").arg(static_cast<int>(value.fillPattern())));
str.append(QStringLiteral(" fillColor='%1'").arg(value.fillColor().name(QColor::HexArgb)));
stream << str.toStdString();
return stream;
}
} // namespace SituationMap
+112
View File
@@ -0,0 +1,112 @@
/**
* @RDE_HEADER@
* FillStyle
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <situation_map_export.h>
// Qt
#include <QColor>
//----------------------------------------------------------------------------
namespace SituationMap
{
//----------------------------------------------------------------------------
/**
* @brief The FillStyle class contains parameter to fill an area with color and pattern.
*/
class SITUATIONMAP_EXPORT FillStyle final
{
public:
/*! \name Construction, Destruction */
//@{
/**
* @brief Constructor
*/
FillStyle() = default;
/**
* @brief Constructor
*/
FillStyle(const QColor &fillColor, FillPattern fillPattern);
/**
* @brief Constructor
*/
explicit FillStyle(FillPattern fillPattern);
/**
* @brief Destructor
*/
~FillStyle() = default;
//@}
/** \name FillColor
* Set and get methods.
*/
//@{
QColor fillColor() const;
void setFillColor(const QColor &fillColor);
//@}
/** \name FillPattern
* Set and get methods.
*/
FillPattern fillPattern() const;
void setFillPattern(const FillPattern &fillPattern);
//@}
/**
* @brief operator== Compare two objects
* @param other to be compared with
* @return true if identical, otherwise false.
*/
bool operator==(const FillStyle &other) const
{
return ((this->m_fillColor == other.m_fillColor) &&
(this->m_fillPattern == other.m_fillPattern)
);
}
/**
* @brief operator!= Compare two objects
* @param other to be compared with
* @return true if NOT identical, otherwise false.
*/
bool operator!=(const FillStyle &other) const
{
return !(*this == other);
}
private:
QColor m_fillColor = QColor(125, 125, 125, 125); // gray
FillPattern m_fillPattern = FillPattern::Solid;
};
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const FillStyle &value);
} // namespace SituationMap
+114
View File
@@ -0,0 +1,114 @@
/**
* @RDE_HEADER@
* Construction of MapObjects
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "abstract_map_object.h"
#include "situation_map_utils.h"
#include <Common/ref_pointer.h>
#include <situation_map_export.h>
#include <Common/situation_map_logging.h>
#include <typeindex>
//----------------------------------------------------------------------------
namespace SituationMap
{
// forward
class Map;
class ObjectFactory;
/**
* @brief The GenericObjectFactoryBase class define the interface for GenericObjectFactory.
*/
class SITUATIONMAP_EXPORT GenericObjectFactoryBase
{
public:
/*! \name Construction, Destruction */
//@{
/**
* @brief Contructor.
* (In case of base class for GenericObjectFactory, map stays null)
*/
GenericObjectFactoryBase()
: m_logger(getLogger("GenericObjectFactoryBase"))
{}
/**
* @brief Destruktor
*/
virtual ~GenericObjectFactoryBase() = default;
//@}
GenericObjectFactoryBase(const GenericObjectFactoryBase &other) = delete;
GenericObjectFactoryBase &operator=(GenericObjectFactoryBase &other) = delete;
virtual RefPointer<AbstractMapObject> makeObj(const QString &debugInfo = QString()) = 0;
virtual std::type_index getTypeIndexOfImplementation() = 0;
private:
LOGGER_T m_logger; ///< Interface of the Logging-Facility
};
//----------------------------------------------------------------------------
// Generic Object Factory
//----------------------------------------------------------------------------
/**
* @brief The GenericObjectFactory class to create concrete MapObjects
*/
template <typename IMPL_TYPE>
class GenericObjectFactory final : public GenericObjectFactoryBase
{
public:
/*! \name Construction, Destruction */
//@{
/**
* @brief Contructor.
*/
GenericObjectFactory() = default;
/**
* @brief Destructor.
*/
~GenericObjectFactory() = default;
//@}
protected:
/**
* @brief Create MapObject.
* @param debugInfo for the MapObject.
* @return RefPointer with object.
*/
RefPointer<AbstractMapObject> makeObj(const QString &debugInfo = QString()) override
{
AbstractMapObject *obj = new IMPL_TYPE(debugInfo);
return RefPointer<AbstractMapObject>(obj);
}
/**
* @brief Get type_index of associated implementation.
* @return type_index this GenericObjectFactory::makeObj() will create.
* @internal Will be used within ObjectFactory::interfaceToImplementation.
*/
std::type_index getTypeIndexOfImplementation() override
{
return std::type_index(typeid(IMPL_TYPE));
}
};
} // namespace SituationMap
+181
View File
@@ -0,0 +1,181 @@
/**
* @RDE_HEADER@
* PlanModel - Renderer
* $Id$
* $HeadURL$
* $Author$
*/
#include "geometry_model_renderer.h"
#include <QFile>
#include <QTime>
namespace SituationMap
{
GeometryModelRenderer::GeometryModelRenderer(Map *map, const QString &layerName, GeometryModel &geoModel, QObject *parent)
: QObject(parent)
, m_stats()
, m_nodesPickable(true)
, m_enableRedraw(true)
, m_map(map)
, m_layerName(layerName)
, m_geometryModel(geoModel)
, m_logger(getLogger("GeometryModelRenderer"))
, m_loggerStats(getLogger("GeometryModelRenderer.Stats"))
{
if (!m_map)
ERROR_LOG(m_logger) << LOGFUNCTION << " undefined map";
if (m_layerName.isEmpty())
ERROR_LOG(m_logger) << LOGFUNCTION << " empty map layer name";
} // GeometryModelRenderer::GeometryModelRenderer(QWidget *parent, bool showUI)
void GeometryModelRenderer::resetStats()
{
m_stats.m_drawCount = 0;
m_stats.m_drawElementsRecursiveCount = 0;
m_stats.m_drawEllipseCount = 0;
m_stats.m_drawLineCount = 0;
m_stats.m_drawPolylineCount = 0;
m_stats.m_drawRectangleCount = 0;
m_stats.m_drawSplineCount = 0;
m_stats.m_drawSymbolCount = 0;
m_stats.m_drawTextCount = 0;
m_stats.m_drawNodeCount = 0;
m_stats.m_msEllipse = 0;
m_stats.m_msLine = 0;
m_stats.m_msPolyline = 0;
m_stats.m_msRectangle = 0;
m_stats.m_msSpline = 0;
m_stats.m_msSymbol = 0;
m_stats.m_msText = 0;
m_stats.m_msNode = 0;
m_stats.m_msEllipseMax = 0;
m_stats.m_msLineMax = 0;
m_stats.m_msPolylineMax = 0;
m_stats.m_msRectangleMax = 0;
m_stats.m_msSplineMax = 0;
m_stats.m_msSymbolMax = 0;
m_stats.m_msTextMax = 0;
m_stats.m_msNodeMax = 0;
m_stats.m_msEllipseMin = 0;
m_stats.m_msLineMin = 0;
m_stats.m_msPolylineMin = 0;
m_stats.m_msRectangleMin = 0;
m_stats.m_msSplineMin = 0;
m_stats.m_msSymbolMin = 0;
m_stats.m_msTextMin = 0;
m_stats.m_msNodeMin = 0;
} // void GeometryModelRenderer::resetStats()
void GeometryModelRenderer::printStats()
{
if (! m_loggerStats.isInfoEnabled())
return;
int sum = m_stats.m_msEllipse
+ m_stats.m_msLine
+ m_stats.m_msPolyline
+ m_stats.m_msRectangle
+ m_stats.m_msSpline
+ m_stats.m_msSymbol
+ m_stats.m_msText
+ m_stats.m_msNode;
QStringList stats;
stats.append(QStringLiteral("%1 %2 %3 %4 %5 %6")
.arg(QLatin1String("Op"), 10)
.arg(QLatin1String("Count"), 10)
.arg(QLatin1String("Total"), 10)
.arg(QLatin1String("Min"), 10)
.arg(QLatin1String("Max"), 10)
.arg(QLatin1String("Avg"), 10));
stats.append(QStringLiteral("%1 %2 %3")
.arg(QLatin1String("Draw Geometry"), 10)
.arg(m_stats.m_drawCount, 10)
.arg(sum, 10));
stats.append(QStringLiteral("%1 %2")
.arg(QLatin1String("Recursive"), 10)
.arg(m_stats.m_drawElementsRecursiveCount, 10));
stats.append(QStringLiteral("%1 %2 %3 %4 %5 %6")
.arg(QLatin1String("Ellipse"), 10)
.arg(m_stats.m_drawEllipseCount, 10)
.arg(m_stats.m_msEllipse, 10)
.arg(m_stats.m_msEllipseMin, 10)
.arg(m_stats.m_msEllipseMax, 10)
.arg((double)m_stats.m_msEllipse / (double)m_stats.m_drawEllipseCount, 10));
stats.append(QStringLiteral("%1 %2 %3 %4 %5 %6")
.arg(QLatin1String("Line"), 10)
.arg(m_stats.m_drawLineCount, 10)
.arg(m_stats.m_msLine, 10)
.arg(m_stats.m_msLineMin, 10)
.arg(m_stats.m_msLineMax, 10)
.arg((double)m_stats.m_msLine / (double)m_stats.m_drawLineCount, 10));
stats.append(QStringLiteral("%1 %2 %3 %4 %5 %6")
.arg(QLatin1String("Polyline"), 10)
.arg(m_stats.m_drawPolylineCount, 10)
.arg(m_stats.m_msPolyline, 10)
.arg(m_stats.m_msPolylineMin, 10)
.arg(m_stats.m_msPolylineMax, 10)
.arg((double)m_stats.m_msPolyline / (double)m_stats.m_drawPolylineCount, 10));
stats.append(QStringLiteral("%1 %2 %3 %4 %5 %6")
.arg(QLatin1String("Rectangle"), 10)
.arg(m_stats.m_drawRectangleCount, 10)
.arg(m_stats.m_msRectangle, 10)
.arg(m_stats.m_msRectangleMin, 10)
.arg(m_stats.m_msRectangleMax, 10)
.arg((double)m_stats.m_msRectangle / (double)m_stats.m_drawRectangleCount, 10));
stats.append(QStringLiteral("%1 %2 %3 %4 %5 %6")
.arg(QLatin1String("Spline"), 10)
.arg(m_stats.m_drawSplineCount, 10)
.arg(m_stats.m_msSpline, 10)
.arg(m_stats.m_msSplineMin, 10)
.arg(m_stats.m_msSplineMax, 10)
.arg((double)m_stats.m_msSpline / (double)m_stats.m_drawSplineCount, 10));
stats.append(QStringLiteral("%1 %2 %3 %4 %5 %6")
.arg(QLatin1String("Symbol"), 10)
.arg(m_stats.m_drawSymbolCount, 10)
.arg(m_stats.m_msSymbol, 10)
.arg(m_stats.m_msSymbolMin, 10)
.arg(m_stats.m_msSymbolMax, 10)
.arg((double)m_stats.m_msSymbol / (double)m_stats.m_drawSymbolCount, 10));
stats.append(QStringLiteral("%1 %2 %3 %4 %5 %6")
.arg(QLatin1String("Text"), 10)
.arg(m_stats.m_drawTextCount, 10)
.arg(m_stats.m_msText, 10)
.arg(m_stats.m_msTextMin, 10)
.arg(m_stats.m_msTextMax, 10)
.arg((double)m_stats.m_msText / (double)m_stats.m_drawTextCount, 10));
stats.append(QStringLiteral("%1 %2 %3 %4 %5 %6")
.arg(QLatin1String("Node"), 10)
.arg(m_stats.m_drawNodeCount, 10)
.arg(m_stats.m_msNode, 10)
.arg(m_stats.m_msNodeMin, 10)
.arg(m_stats.m_msNodeMax, 10)
.arg((double)m_stats.m_msNode / (double)m_stats.m_drawNodeCount, 10));
INFO_LOG(m_loggerStats) << "GeometryModelRenderer Timing Statistics:\n"
<< stats.join(QLatin1String("\n")).toStdString();
} // void GeometryModelRenderer::printStats()
} // namepace SituationMap
+197
View File
@@ -0,0 +1,197 @@
/**
* @RDE_HEADER@
* GeometryModel - Renderer
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include <GeometryModel/geometry_model.h>
#include "situation_map_export.h"
#include <Map/situation_map_types.h>
#include <Map/map.h>
#include <Common/situation_map_logging.h>
// Qt
#include <QElapsedTimer>
#include <QObject>
#include <QPointer>
class PESettings;
class QDomElement;
class QTime;
namespace SituationMap
{
class AbstractMapObject;
using LOGGER_T = SituationMap::LOGGER_T;
/**
* @brief The GeometryModelRenderer class is an interface for the redndering of a geometry model.
*/
class SITUATIONMAP_EXPORT GeometryModelRenderer : public QObject
{
Q_OBJECT
public:
/*! \name Construction, Destruction */
//@{
explicit GeometryModelRenderer(Map *map, const QString &layerName, GeometryModel &geoModel, QObject *parent = nullptr);
virtual ~GeometryModelRenderer() = default;
//@}
/**
Returns unique id of map object associated with node.
@param node node of geometry model
*/
virtual UniqueMapId getIdFromNode(const GeometryModel::Node &node) const = 0;
/*! \name Rendering */
//@{
/**
* Render to map and update layer if model changes.
* \sa setNodesPickable()
*/
virtual bool render() = 0;
/**
* @brief Render single node
* @param node to render
* @return True on success, otherwise false.
* \sa setNodesPickable()
*/
virtual bool renderNode(const GeometryModel::Node &node) = 0;
/**
* @brief Render one drawable
* @param drawable to render
* @return True on success, otherwise false.
* \sa setNodesPickable()
*/
virtual bool render(QPixmap &drawable) = 0;
virtual GeometryModel::Node getAssociatedNode(const AbstractMapObject *mapObject) = 0;
/**
* @brief Get flag 'nodesPickable'
* @return flag 'nodesPickable'
*/
virtual bool getNodesPickable() const = 0;
/**
* @brief Set flag 'nodesPickable'. Should be set BEFORE render is called (and objects creation).
* @param New state
*/
virtual void setNodesPickable(bool nodesPickable) = 0;
/**
* @brief Get flag 'editorMode'
* @return value of flag 'editorMode'
*/
virtual bool editorMode() const = 0;
/**
* @brief Set flag 'editorMode' to switch on additional graphic elements
* @return value of flag 'editorMode'
*
* If the editor mode ist switched on, some additional graphic is drawn e.g. anchor points of text lines. Per default the editor mode is switched off.
*/
virtual void setEditorMode(bool on) = 0;
//@}
protected:
//! Create unique SIM-ID for GDW
//! \param useID: Use this for creating a previously created simID again
// static GDW::SimObjectId createSimID(int useID = -1);
//! Print the timing-stats to the info-channel
void printStats();
protected:
//! Collect Timing- and Draw-Statistic in this Struct
struct States
{
QElapsedTimer m_timer;
// Count method-calls
int m_drawCount = 0;
int m_drawElementsRecursiveCount = 0;
int m_drawParticipantSymbolCount = 0;
int m_drawDictionarySymbolCount = 0;
int m_drawEllipseCount = 0;
int m_drawLineCount = 0;
int m_drawPolylineCount = 0;
int m_drawRectangleCount = 0;
int m_drawSplineCount = 0;
int m_drawSymbolCount = 0;
int m_drawTextCount = 0;
int m_drawNodeCount = 0;
// Total time of method use in milliseconds
int m_msDictionarySymbol = 0;
int m_msEllipse = 0;
int m_msLine = 0;
int m_msPolyline = 0;
int m_msRectangle = 0;
int m_msSpline = 0;
int m_msSymbol = 0;
int m_msText = 0;
int m_msNode = 0;
// max time of method use in milliseconds
int m_msDictionarySymbolMax = 0;
int m_msEllipseMax = 0;
int m_msLineMax = 0;
int m_msPolylineMax = 0;
int m_msRectangleMax = 0;
int m_msSplineMax = 0;
int m_msSymbolMax = 0;
int m_msTextMax = 0;
int m_msNodeMax = 0;
// min time of method use in milliseconds
int m_msDictionarySymbolMin = 0;
int m_msEllipseMin = 0;
int m_msLineMin = 0;
int m_msPolylineMin = 0;
int m_msRectangleMin = 0;
int m_msSplineMin = 0;
int m_msSymbolMin = 0;
int m_msTextMin = 0;
int m_msNodeMin = 0;
}; // States
States m_stats;
void resetStats();
bool m_nodesPickable; //! PlanEditor -> true, Displaying -> false
bool m_enableRedraw; //! Bool to temporarily disable redraws (on multiple changes to GeometryModel)
QPointer<Map> m_map;
QString m_layerName;
GeometryModel &m_geometryModel; //!< The current Plan
protected:
//! Interface to the Logging-Facility
LOGGER_T m_logger;
LOGGER_T m_loggerStats;
}; // GeometryModelRenderer
}
+50
View File
@@ -0,0 +1,50 @@
/**
* @RDE_HEADER@
* Interface for Grid
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
#include "situation_map_types.h"
#include <situation_map_export.h>
#include <QColor>
//----------------------------------------------------------------------------
namespace SituationMap
{
/**
* @brief The class Grid enables access to adjust the grid.
* Some GridTypes are supported. See GridType.
*
*/
class SITUATIONMAP_EXPORT Grid
{
public:
Grid() = default; ///< Contructor
virtual ~Grid() = default; ///< Destructor
// based on 10.2.5:
virtual GridType gridType() = 0;
virtual void setGridType(GridType gridType) = 0;
virtual bool isVisible() = 0;
virtual void setVisible(bool visible) = 0;
virtual int levelCount() = 0;
virtual bool isLabelVisible() = 0;
virtual void setLabelVisible(bool visible) = 0;
};
} // namespace SituationMap
//----------------------------------------------------------------------------
+440
View File
@@ -0,0 +1,440 @@
/**
* @RDE_HEADER@
* Interface for LayerFactory (Construction of MapObjects)
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <Common/situation_map_logging.h>
#include <arcgis/arcgisversion.h> // This file is created by RME, not ESRI
// Qt
//----------------------------------------------------------------------------
namespace SituationMap
{
class Map;
class LayerParameter;
class LocationToElevationHelper;
/**
* @brief The LayerFactory manages logical layer.
* Each logical layer is composed of one or more technical layers. If requested from instances of
* AbstractMapObject the associated technical layers are created on demand. This approachs is
* choosen to reduce the number of layers and to avoid empty layer.
* (It is thinkable to merge different logical layers to one technical layer.)
*
* \section LayerTypeOverview LayerType and logical respectively technical layernames
| Usage | LayerType | Logical layername | Technical layername |
| :--------------| : ----------| : ---------------------- | : ------------------------------------ |
| Map | Basemap | ArcGISTiled... | e.g. ArcGISTiledMapService |
| JumpPoints | JumpPoint | "JumpPoints" | GraphicsLayer |
| Overlays | Overlay | Overlay_... | GraphicsLayer and/or MessageGroupLayer |
| Participants | Operational | e.g AES, Participants | GraphicsLayer and/or MessageGroupLayer |
| Viewshed | Tools | "Tools" | GraphicsLayer and/or MessageGroupLayer |
| Rubberband | Rubberband | "RubberbandLayer" | GraphicsLayer and/or MessageGroupLayer |
* \sa LayerType
* \n
* \section HowToDifferentiateBasemaps How to differentiate different basemaps
* The basemaps are typically initialized using a list of urls and the required SymbologyType.
* The urls are added to the map, whereat the first layer/url is setting the projection.
* \n\n The \b access to layers (basemap as well as operational layers) is done using a string called \b layername.
* \n All basemaps have a common prefix: 'basemapLayernamePrefix', which can be accessed/modified using basemapLayernamePrefix() / setBasemapLayernamePrefix().
* \n The final layername has a continuous number, starting with zero (0): 'basemapLayernamePrefix\%number'
* \n
* \n E.g: mapServiceUrlList = "url0,url1" will lead to:
| # url | pattern | concrete layername |
| :------| : ----------------------- | : --------------------------------- |
| url0 | basemapLayernamePrefix%0 | "ArcGISTiledLayer_URL_0" |
| url1 | basemapLayernamePrefix%1 | "ArcGISTiledLayer_URL_1" |
*/
class LayerFactory
{
public:
/*! \name Construction, Destruction */
//@{
LayerFactory() = default; ///< Constructor
virtual ~LayerFactory() = default; ///< Destructor
//@}
/*! \name Initializing of Basemap Layer
* \ref HowToDifferentiateBasemaps
*/
//@{
/**
* @brief initializeBasemapBuiltIn is for Demos only! (alternative to initializeBasemaps).
* @param tpkFile file to be used.
* @return True on success, otherwise false.
* @note only for special cases.
*/
virtual bool initializeBasemapBuiltIn(const QString &tpkFile) = 0;
virtual bool isUsingBaseMapBuiltIn() const = 0;
/**
* @brief Get basemapLayernamePrefix to construct the layername of the basemaps.
* @return basemapLayernamePrefix
* default: 'ArcGISTiledMapServiceLayer_URL_' (first basemap -> 'ArcGISTiledMapServiceLayer_URL_0')
* @see\ref HowToDifferentiateBasemaps
*/
virtual QString basemapLayernamePrefix() const = 0;
/**
* @brief Set basemapLayernamePrefix
* @param basemapLayernamePrefix to be set.
* @see\ref HowToDifferentiateBasemaps
*/
virtual void setBasemapLayernamePrefix(const QString &basemapLayernamePrefix) = 0;
/**
* @brief Get prefix/name for participant layer
* @return participant layername
*/
virtual QString participantLayername() const = 0;
/**
* @brief Get RenderingMode for participant layer
* @return RenderingMode for participants
*/
virtual RenderingMode participantLayerRenderingMode() const = 0;
/**
* @brief Get SurfacePlacement for participant layer
* @return SurfacePlacement for participants
*/
virtual SurfacePlacement participantLayerSurfacePlacement() const = 0;
/**
* @brief Set ParticipantLayername: layername, RenderingMode and SurfacePlacement
* @param participantLayername like ('Participants:Dynamic:Relative')
*/
/**
* @brief Set ParticipantLayername: layername, RenderingMode and SurfacePlacement
* @param participantLayername like ('Participants:Dynamic:Relative')
* @param renderingMode mode to be used
* @param surfacePlacement placement to be used
*/
virtual void setParticipantLayer(const QString &participantLayername,
RenderingMode renderingMode,
SurfacePlacement surfacePlacement) = 0;
/**
* @brief addBasemap will add a basemap upon the topmost basemap.
* @param layername layer name to be used.
* @param mapServiceUrl to be added
* @param basemapType to be added
* @param displayName to be used.
* @param description to be used.
* @param previewImage to be used.
* @return True on success, otherwise false.
* @sa initializeBasemaps
*/
virtual bool addBasemap(const QString &layername,
const QUrl &mapServiceUrl,
const BasemapType basemapType,
const double minScale = -1,
const double maxScale = -1,
const QString &displayName = QString(),
const QString &description = QString(),
const QImage &previewImage = QImage()) = 0;
/**
* @brief Remove a basemap.
* @param layername to be removed.
* @return True on success, otherwise false.
*/
virtual bool removeBasemap(const QString &layername) = 0;
//@}
/*! \name Scene Object Layer */
//@{
// virtual bool initializeSceneObjectLayers(const QStringList &sceneObjectServiceUrls) = 0;
virtual bool addSceneObjectLayer(const QString &layername,
const QUrl &sceneLayerServiceUrl,
const double altitudeOffset = 0,
const QString &displayName = QString(),
const QString &description = QString(),
const QImage &previewImage = QImage()) = 0;
virtual bool isSceneObjectLayerVisible() const = 0;
virtual void setSceneObjectLayerVisible(bool visible) = 0;
//@}
/*! \name Elevation */
//@{
virtual bool initializeElevationSources(const QStringList &sceneElevationServiceUrls) = 0;
//@}
/*! \name Initializing of Operational Layer*/
//@{
/**
* @brief Add an operational layer
* @param layerName to add
* @param displayName to use
* @return True on success, otherwise false.
*/
virtual bool addOperationalLayer(const QString &layerName,
const QString &displayName,
RenderingMode renderMode = RenderingMode::Dynamic,
SurfacePlacement surfacePlacement = SurfacePlacement::Relative) = 0;
/**
* @brief Remove an operational layer.
* @param layername to be removed.
* @return True on success, otherwise false.
*/
virtual bool removeOperationalLayer(const QString &layername) = 0;
/**
* @brief Check if OperationalLayer exists
* @param layername to be checked
* @return True on success, otherwise false.
*/
virtual bool hasOperationalLayer(const QString &layername) const = 0;
//@}
/**
* @brief Add an OverlayLayer to map.
* @param logicalLayerName to add
* @param displayName to use
* @return True on success, otherwise false.
*/
virtual bool addOverlayLayer(const QString &logicalLayerName,
const QString &displayName,
bool isSnapshot = false) = 0;
/**
* @brief Remove an OverlayLayer.
* @param layername to be removed.
* @return True on success, otherwise false.
*/
virtual bool removeOverlayLayer(const QString &logicalLayerName) = 0;
virtual QString snapshotOverlayLayername() const = 0;
virtual QString toolLayer() = 0; ///< Mame of tool layer.
virtual QString layernameForCubes() const = 0;
virtual void setLayernameForCubes(const QString &logicalName) = 0;
virtual bool hasLayernameForCubes() const = 0;
/**
* @brief assignUniqueValueRendererForCubes (displaying the building ownership)
* @param logicalName where the renderer should be assigned to
* @return True on success, otherwise false.
*/
virtual bool assignUniqueValueRendererForCubes() = 0;
struct UniqueValueData
{
QString label; // more or less optional
QString value; // concrete value like 'Partyname_Red'
QImage img;
};
virtual bool assignUniqueValueRenderer(const QString &layername,
const QString &fieldName,
const QVector<UniqueValueData> &uvDataCont) = 0;
// For BoobyTraps
struct UniqueValueDataAesCentral
{
QString label; // more or less optional
QVariantList values; // concrete values like 'Partyname_Red'
enum class TYPE {SPHERE, CONE};
TYPE type{TYPE::SPHERE};
QColor col;
float radius{1.0};
float height{1.0};
};
static QString toString(UniqueValueDataAesCentral::TYPE _type)
{
switch (_type) {
case UniqueValueDataAesCentral::TYPE::SPHERE:
return QStringLiteral("SPHERE");
break;
case UniqueValueDataAesCentral::TYPE::CONE:
return QStringLiteral("CONE");
break;
default:
break;
}
return QStringLiteral("UniqueValueDataAesCentral::TYPE::error");
}
virtual bool assignUniqueValueRendererAesCentral(const QString &layername,
const QStringList &fieldNames,
const QVector<UniqueValueDataAesCentral> &uvDataCont) = 0;
// For Areas (AreaEffect)
virtual bool assignUniqueValueRendererAesCentral3DExtrusion(const QString &layername,
const QStringList &fieldNames,
const QVector<UniqueValueDataAesCentral> &uvDataCont) = 0;
/**
* @brief Initialize layer - only for UnitTests.
* @return True on success, otherwise false.
*/
virtual bool initializeUnitTestLayer() = 0;
/*! \name Map access */
//@{
virtual Map *map() const = 0;
//@}
/*! \name Layer access */
//@{
virtual int count() const = 0; ///< Number of layers
virtual QStringList layernames() const = 0; ///< List of layernames (basemap, operational, rubberband....
virtual QStringList layernames(const LayerType &layerType) const = 0; ///< List of layernames (basemap | operational | rubberband....)
/**
* @brief rubberbandLayer get rubberbandlayer
* @return rubberbandlayer
*/
virtual QString rubberbandLayer() const = 0;
/*! \name EmergencyCall (at least relevant for GUEZ) */
//@{
virtual QString emergencyCallLayer(bool getJustTheName = false) = 0;
virtual bool emergencyCallLayerExists() const = 0;
virtual bool switchEmergencyCallLayerOn() = 0; // usefull for Live
virtual bool switchEmergencyCallLayerOff() = 0; // usefull for Replay
//@}
/**
* @brief Check new LayerOrder
* @param orderedLayernames to be checked
* @return True on success, otherwise false.
*/
virtual bool checkLayerOrder(const QStringList &orderedLayernames) = 0;
/**
* @brief Provide new order of layers. Attention: All LayerType::Basemap are below other types.
* @param orderedLayernames new order
* @return True on success, otherwise false.
*/
virtual bool orderLayerTo(const QStringList &orderedLayernames) = 0;
/**
* @brief Get the LayerType of a logical layer.
* @param layername requested layername.
* @return LayerType of logical layer.
*/
virtual LayerType layerType(const QString &layername) const = 0;
/**
* @brief Get the LayerParameter of a logical layer.
* @param layername requested layername.
* @return LayerParameter of logical layer.
*/
virtual LayerParameter layerParameter(const QString &layername) const = 0;
/**
* @brief Set the LayerParameter of a logical layer.
* @param layername requested layername.
* @param layerParameter to be set.
* @return True on success, otherwise false.
*/
virtual bool setLayerParameter(const QString &layername, const LayerParameter &layerParameter) = 0;
/**
* @brief Set the layer parameter contrast of all logical layer from given layer type.
* @param layerType requested layer type.
* @param opacity to be set. value range: 0..100; 100 everything is visible
* @return True on success, otherwise false.
*/
virtual bool setLayerOpacity(LayerType layerType, int opacity) = 0;
/**
* @brief Set the layer parameter brightness of all logical layer from given layer type.
* @param layerType requested layer type.
* @param brightness to be set. value range: -100..100
* @return True on success, otherwise false.
*/
virtual bool setLayerBrightness(LayerType layerType, int brightness) = 0;
/**
* @brief Set the layer parameter contrast of all logical layer from given layer type.
* @param layerType requested layer type.
* @param contrast to be set. value range: -100..100
* @return True on success, otherwise false.
*/
virtual bool setLayerContrast(LayerType layerType, int contrast) = 0;
/**
* @brief Set the layer parameter gamma of all logical layer from given layer type.
* @param layerType requested layer type.
* @param gamma to be set.
* @return True on success, otherwise false.
*/
virtual bool setLayerGamma(LayerType layerType, int gamma) = 0;
/**
* @brief Set the layers of the given type(s) visible or invisible
* @param layerTypes layer types to be modified
* @param visbile set visible (true) or hidden (false).
*/
virtual void setLayersVisible(const QVector<LayerType> &layerTypes, bool visible) = 0;
//@}
#if ACRGIS_VERSION < 0x640500 // 100.5.0 / Update 5
// deprecated in V100.5, replaced by GeoView::setSelectionProperties()
/*! \name Selection */
//@{
virtual QColor selectionColor() const = 0; ///< Get current selectionColor.
/**
* @brief Set selectionColor.
* @param selectionColor value to be set.
*/
virtual void setSelectionColor(const QColor &selectionColor) = 0;
//@}
#endif // ACRGIS_VERSION
/*! \name Elevation */
//@{
virtual bool elevationAvailable() const = 0;
virtual QPointer<LocationToElevationHelper> locationToElevation() const = 0;
//@}
};
} // namespace SituationMap
//----------------------------------------------------------------------------
+152
View File
@@ -0,0 +1,152 @@
/**
* @RDE_HEADER@
* Class LayerParameter
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "layer_parameter.h"
// Qt
#include <QJsonObject>
//----------------------------------------------------------------------------
namespace SituationMap
{
LayerParameter::LayerParameter()
{
resetView();
}
void LayerParameter::resetView()
{
visible = true;
opacity = 100;
brightness = 0;
contrast = 0;
gamma = 0;
}
bool LayerParameter::operator==(const LayerParameter &other) const
{
return ((this->visible == other.visible)
&& (this->opacity == other.opacity)
&& (this->brightness == other.brightness)
&& (this->contrast == other.contrast)
&& (this->gamma == other.gamma)
&& (this->minScale == other.minScale)
&& (this->maxScale == other.maxScale)
&& (this->basemapType == other.basemapType)
&& (this->displayName == other.displayName)
&& (this->description == other.description)
&& (this->previewImage == other.previewImage)
&& (this->url == other.url)
&& (this->svcDescription == other.svcDescription)
);
}
bool LayerParameter::operator!=(const LayerParameter &other) const
{
return !(*this == other);
}
LayerParameter LayerParameter::read(const QJsonObject &json)
{
LayerParameter lp;
// skip reading, values should be taken from new/current sources
// maybe mapUrls (and its name, description) has changed in the meantime...
// if (json.contains(QLatin1String("displayname")))
// lp.displayName = json[QLatin1String("displayname")].toString();
// if (json.contains(QLatin1String("description")))
// lp.description = json[QLatin1String("description")].toString();
if (json.contains(QLatin1String("visible")))
lp.visible = json[QLatin1String("visible")].toBool();
if (json.contains(QLatin1String("opacity")))
lp.opacity = json[QLatin1String("opacity")].toInt();
if (json.contains(QLatin1String("brightness")))
lp.brightness = json[QLatin1String("brightness")].toInt();
if (json.contains(QLatin1String("contrast")))
lp.contrast = json[QLatin1String("contrast")].toInt();
if (json.contains(QLatin1String("gamma")))
lp.gamma = json[QLatin1String("gamma")].toInt();
if (json.contains(QLatin1String("minScale")))
lp.minScale = json[QLatin1String("minScale")].toDouble();
if (json.contains(QLatin1String("maxScale")))
lp.maxScale = json[QLatin1String("maxScale")].toDouble();
if (json.contains(QLatin1String("basemapType")))
lp.basemapType = static_cast<BasemapType>(json[QLatin1String("basemapType")].toInt());
// maybe some more!?
return lp;
}
QJsonObject LayerParameter::toJsonObject() const
{
QJsonObject json;
json[QLatin1String("displayname")] = displayName;
json[QLatin1String("description")] = description;
json[QLatin1String("visible")] = visible;
json[QLatin1String("opacity")] = opacity;
json[QLatin1String("brightness")] = brightness;
json[QLatin1String("contrast")] = contrast;
json[QLatin1String("gamma")] = gamma;
json[QLatin1String("minScale")] = minScale;
json[QLatin1String("maxScale")] = maxScale;
json[QLatin1String("basemapType")] = static_cast<int>(basemapType);
// maybe some more!?
return json;
}
QString LayerParameter::toString() const
{
QString str;
str.append(QStringLiteral("visible=%1").arg(visible));
str.append(QStringLiteral(" opacity=%1").arg(opacity));
str.append(QStringLiteral(" brightness=%1").arg(brightness));
str.append(QStringLiteral(" contrast=%1").arg(contrast));
str.append(QStringLiteral(" gamma=%1").arg(gamma));
str.append(QStringLiteral(" minScale=%1").arg(minScale));
str.append(QStringLiteral(" maxScale=%1").arg(maxScale));
str.append(QStringLiteral(" basemapType=%1").arg((int)basemapType));
str.append(QStringLiteral(" displayName='%1'").arg(displayName));
str.append(QStringLiteral(" description='%1'").arg(description));
str.append(QStringLiteral(" previewImage.isNull=%1").arg(previewImage.isNull()));
str.append(QStringLiteral(" url='%1'").arg(url.toString()));
str.append(QStringLiteral(" svcDescription='%1'").arg(svcDescription));
return str;
}
std::ostream &operator<< (std::ostream &stream,
const LayerParameter &value)
{
stream << value.toString().toUtf8().data();
return stream;
}
} // namespace SituationMap
+85
View File
@@ -0,0 +1,85 @@
/**
* @RDE_HEADER@
* Class LayerParameter
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <Common/situation_map_logging.h>
#include <situation_map_export.h>
// Qt
#include <QString>
#include <QUrl>
class QJsonObject;
//----------------------------------------------------------------------------
namespace SituationMap
{
//----------------------------------------------------------------------------
/**
* @brief The LayerParameter struct contains parameter of a layer
* like visibility, opacity, brightness ....
*/
class SITUATIONMAP_EXPORT LayerParameter
{
public:
static const uint UNDEFINED_SCALE = 0; // neg. value are not defined/allowed (will be ignored by Esri -> errorprone)
public:
LayerParameter();
~LayerParameter() = default;
void resetView();
bool minScaleValid() const { return (minScale >= 0); }
bool maxScaleValid() const { return (maxScale >= 0); }
bool minMaxScaleValid() const { return minScaleValid() && maxScaleValid(); }
bool operator==(const LayerParameter &other) const;
bool operator!=(const LayerParameter &other) const;
static LayerParameter read(const QJsonObject &json);
QJsonObject toJsonObject() const;
QString toString() const;
bool visible = true;
int opacity = 100; ///< value range: 0..100; 100 everything is visible
int brightness = 0; ///< value range: -100 .. 100
int contrast = 0; ///< value range: -100 .. 100
int gamma = 0; ///< value range: -100 .. 100
// Context Basemaplayer: value of -1 is the indicator, that the layer is NOT loaded yet:
double minScale = -1; ///< big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001 ; '0' without function
double maxScale = -1; ///< small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001 ; '0' without function
BasemapType basemapType = BasemapType::Undefined;
QString displayName;
QString description;
QImage previewImage;
// following member won`t be 'set/written' to EsriLayer:
QUrl url;
QString svcDescription;
};
//----------------------------------------------------------------------------
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const LayerParameter &value);
} // namespace SituationMap
Q_DECLARE_METATYPE(SituationMap::LayerParameter)
+70
View File
@@ -0,0 +1,70 @@
/**
* @RDE_HEADER@
* LineStyle
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "line_style.h"
// ESRI
namespace SituationMap
{
LineStyle::LineStyle(const QColor &lineColor, int lineWidth, LinePattern linePattern)
: m_lineColor(lineColor)
, m_lineWidth(lineWidth)
, m_linePattern(linePattern)
{
}
QColor LineStyle::lineColor() const
{
return m_lineColor;
}
void LineStyle::setLineColor(const QColor &lineColor)
{
m_lineColor = lineColor;
}
int LineStyle::lineWidth() const
{
return m_lineWidth;
}
void LineStyle::setLineWidth(int lineWidth)
{
m_lineWidth = lineWidth;
}
SituationMap::LinePattern LineStyle::linePattern() const
{
return m_linePattern;
}
void LineStyle::setLinePattern(const SituationMap::LinePattern &linePattern)
{
m_linePattern = linePattern;
}
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const LineStyle &value)
{
QString str;
str.append(QStringLiteral(" lineColor='%1'").arg(value.lineColor().name(QColor::HexArgb)));
stream << str.toStdString();
return stream;
}
} // namespace SituationMap
+107
View File
@@ -0,0 +1,107 @@
/**
* @RDE_HEADER@
* LineStyle
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <situation_map_export.h>
// Qt
#include <QColor>
//----------------------------------------------------------------------------
namespace SituationMap
{
/**
* @brief The LineStyle class contains parameter to draw a line like color, width and pattern.
*/
class SITUATIONMAP_EXPORT LineStyle final
{
public:
/*! \name Construction, Destruction */
//@{
/**
* @brief Constructor
*/
LineStyle() = default;
/**
* @brief Constructor
*/
explicit LineStyle(const QColor &lineColor, int lineWidth = 1, LinePattern linePattern = LinePattern::Solid);
/**
* @brief Destructor
*/
~LineStyle() = default;
//@}
/*! \name Set and get for member.*/
//@{
QColor lineColor() const;
void setLineColor(const QColor &lineColor);
int lineWidth() const;
void setLineWidth(int lineWidth);
LinePattern linePattern() const;
void setLinePattern(const LinePattern &linePattern);
//@}
/**
* @brief operator== Compare two objects
* @param other to be compared with
* @return true if identical, otherwise false.
*/
bool operator==(const LineStyle &other) const
{
return ((this->m_lineColor == other.m_lineColor) &&
(this->m_lineWidth == other.m_lineWidth) &&
(this->m_linePattern == other.m_linePattern)
);
}
/**
* @brief operator!= Compare two objects
* @param other to be compared with
* @return true if NOT identical, otherwise false.
*/
bool operator!=(const LineStyle &other) const
{
return !(*this == other);
}
private:
QColor m_lineColor = Qt::black;
int m_lineWidth = 1;
SituationMap::LinePattern m_linePattern = LinePattern::Solid;
};
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const LineStyle &value);
} // namespace SituationMap
+51
View File
@@ -0,0 +1,51 @@
/**
* @RDE_HEADER@
* Interface for LocationDisplay
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
#include "situation_map_types.h"
#include <situation_map_export.h>
#include <QColor>
//----------------------------------------------------------------------------
namespace SituationMap
{
/**
* @brief The class LocationDisplay enables access to the LocationDisplay.
*/
class SITUATIONMAP_EXPORT LocationDisplay
{
public:
LocationDisplay() = default; ///< Contructor
virtual ~LocationDisplay() = default; ///< Destructor
/**
* @brief setCurrentLocation
* @param currentLocation to be displayed
* @param horizontalAccuracy The horizontal accuracy in meters. Positive values or NaN are supported
* @param velocity The location's velocity in meters per second, 0 => no heading visible
* @param course The location's course in degrees (clockwise), 0 being true North.
* @return true on success, otherwise false
*/
virtual bool setCurrentLocation(const Point3D &currentLocation,
double horizontalAccuracy = std::nan(""),
double velocity = 0,
double course = 0,
bool lastKnown = false
) = 0;
virtual bool setOutdated(bool lastKnown) = 0;
virtual bool start() = 0;
virtual void stop() = 0;
virtual bool isStarted() = 0;
};
} // namespace SituationMap
//----------------------------------------------------------------------------
+107
View File
@@ -0,0 +1,107 @@
/**
* @RDE_HEADER@
* Interface for Map
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "map.h"
#include "abstract_map_object.h"
#include <MapImpl/map_impl.h>
#include <MapImpl/grid_impl.h>
#include "map_notifier.h"
namespace SituationMap
{
int AbstractMapObject::s_scaleHasVisibilityValue = 0;
Map::Map(QWidget *parent)
: QWidget(parent)
{}
bool Map::applyLicense(const QString &licenseStr, const QStringList &extensions)
{
return MapImpl::applyLicense(licenseStr, extensions);
}
bool Map::applyNetworkCacheSettings(const EsriNetworkCacheSettings &esriNetworkCacheSettings)
{
return MapImpl::applyNetworkCacheSettings(esriNetworkCacheSettings);
}
EsriNetworkCacheSettings Map::networkCacheSettings()
{
return MapImpl::networkCacheSettings();
}
Map *Map::create(QWidget *parent)
{
return new SituationMap::MapImpl(parent);
}
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
QString toString(const SituationMap::Mode &value)
{
switch (value)
{
case SituationMap::Mode::Mode_2D:
return QLatin1String("Mode_2D");
case SituationMap::Mode::Mode_3D:
return QLatin1String("Mode_3D");
case SituationMap::Mode::Undefined:
return QLatin1String("Mode_Undefined");
} // switch
return QLatin1String("ModeERROR");
}
std::ostream &operator<< (std::ostream &stream,
const SituationMap::Mode &value)
{
stream << toString(value);
return stream;
}
QString toString(const SituationMap::NavigationConstraint &value)
{
switch (value)
{
case SituationMap::NavigationConstraint::Undefined:
return QLatin1String("NavigationConstraint_Undefined");
case SituationMap::NavigationConstraint::None:
return QLatin1String("NavigationConstraint_None");
case SituationMap::NavigationConstraint::StayAbove:
return QLatin1String("NavigationConstraint_StayAbove");
} // switch
return QLatin1String("NavigationConstraintERROR");
}
std::ostream &operator<< (std::ostream &stream,
const SituationMap::NavigationConstraint &value)
{
stream << toString(value);
return stream;
}
std::ostream &operator<< (std::ostream &stream,
const AbstractMapObject &value)
{
stream << value.toString();
return stream;
}
} // namespace SituationMap
+960
View File
@@ -0,0 +1,960 @@
/**
* @RDE_HEADER@
* Interface for Map
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "layer_factory.h"
#include "situation_map_types.h"
#include <Common/referenced.h>
#include <Common/ref_pointer.h>
#include <situation_map_export.h>
#include <QPointer>
// forward
class QGraphicsView;
//----------------------------------------------------------------------------
/**
* The main namespace for the SituationMap.
* See also AdvancedSymbology.
*/
namespace SituationMap
{
class Grid;
class SideBar;
class ObjectContainer;
class CoordTranslationFunctor;
class PartyIdToColorFunctor;
class GeometryModel;
class GeometryModelRenderer;
class OverviewMapHandler;
class Measurement;
class TerrainProfile;
class Viewshed;
class Camera;
class Viewpoint2D;
struct OperatorMapSettings;
class MapNotifier;
class ObjectIndicator;
class LocationDisplay;
class PixelBasedTextBoxHandler;
class PixelTextBoxData;
// MapObjects
class AbstractMapObject;
class ObjectFactory;
class OverlayHandler;
class DropEventManager;
namespace RB { class RubberbandFactory; }
/**
* @brief The class Map represents a map display.
* \section Common
* It wraps the map engine of ESRI and is therefore the main class within this namespace.
*
* A Map contains a set of layers that can be navigated by your application or by a user.
* You can access and adjust properties of the Map such as its
* scale, rotation, layer order and user interface behaviour.
* Some of these property adjustments are delegated to (sub-)classes like
* Grid, LayerFactory and ObjectFactory.
* To create a Map, use Map::create() and pass a parent.
*
* The Map is ready to use when a) its SpatialReference is initialized and
* b) has a (full)extent inherented from the first Layer added.
* The first part (a) is done by LayerFactory::initializeBasemaps().
* The second part (b) is more or less up to you:
* Most of the times, the (full)extent of the first Layer added is not what you want.
* Therefore you should specify an extent using a Map::setExtent or Map::setCenterPoint.
* !!! Due to docking widgets etc it`s recommended to use centerpoint and scale. !!!
*
* <b> To initialize a usable Map, think of using the MapInitializer and MapSettings.
* They are designed for easy initialisation.</b>
*
* Otherwise the following order is recommended:
*
* \code
*
// 0. License:
if (!SituationMap::Map::applyLicense())
FATAL_LOG(m_logger) << LOGFUNCTION << " applyLicense failed";
// 1. Map
d->m_map = SituationMap::Map::create(this);
// 2. SymbologyType
d->m_map->setSymbologyType(AdvancedSymbology::SymbologyType::MIL2525C)
// 3. init (choose 2d or 3D)
d->m_map->init(SituationMap::Mode::Mode_2D)
// 4. Layer
// initializeBasemapBuiltIn OR initializeBasemaps
d->m_map->layerFactory().initializeBasemaps(QStringList());
d->m_map->layerFactory().initializeOperationalLayers(QStringList()
<< QLatin1String("AES")
<< QLatin1String("Participants") );
// 5. Grid
d->m_map->grid().setGridType(SituationMap::GridType::MGRS);
d->m_map->grid().setVisible(true);
// 6. Initialize objectFactory
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::MapObjectIndicator), new SituationMap::GenericObjectFactory<SituationMap::MapObjectIndicatorImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Polygon), new SituationMap::GenericObjectFactory<SituationMap::PolygonImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Polyline), new SituationMap::GenericObjectFactory<SituationMap::PolylineImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Text), new SituationMap::GenericObjectFactory<SituationMap::TextImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Participant), new SituationMap::GenericObjectFactory<SituationMap::ParticipantImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::AreaFire), new SituationMap::GenericObjectFactory<SituationMap::AreaFireImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::BiologicalAgent), new SituationMap::GenericObjectFactory<SituationMap::BiologicalAgentImpl>() );
// 7. IdGenerator & ObjectContainer:
// QSharedPointer<SituationMap::IdGenerator> idGen( new SituationMap::IdGenerator );
// QSharedPointer<SituationMap::ObjectContainerCTC> objectCont1( new SituationMap::ObjectContainerCTC(idGen) );
// QSharedPointer<SituationMap::ObjectContainerCTC> objectCont2( new SituationMap::ObjectContainerCTC(idGen) );
// d->m_map->setObjectContainer( objectCont1 );
// 8: CoordTransFunctor
d->m_map->initializeCoordTranslationFunctor();
// 10. BasePoint, extent, rotation
connect(d->m_map, &SituationMap::Map::extentChanged, this, [this]() {
DEBUG_LOG(m_logger) << LOGFUNCTION << " extent changed: ";
} );
// Map has to be ready before extent, center and something can be set:
connect(d->m_map, &SituationMap::Map::mapReady, [this]() {
INFO_LOG(m_logger) << LOGFUNCTION << " mapReady: ";
// Recommendation: use 'Center' and 'Scale' to set the extent
d->m_map->setCenterPoint(QPointF(92750, 80500)); // QPointF(92750, 80525) -> Rennplatz - Bremen
d->m_map->setScale(500000);
double rotationDegree = 0;
DEBUG_LOG(m_logger) << " set rotationDegree to=" << rotationDegree;
d->m_map->setRotation(rotationDegree);
} );
// 11. Add widget
d->m_mainLayout->addWidget(d->m_map, 1, 0);
// 20: optional:
// Tools:
d->m_map->viewshed().setViewshedUrl();
// 50. turn over to application (if required):
*
* \endcode
*
* \section secMapObjects MapObjects
* Of course a map needs objects to be shown on the Map. That can be a polyline or polygon but also simulation-specific classes like a Participant.
* AbstractMapObject is the base class for these kind of objects.
* You need the ObjectFactory to create them.
* \n The AbstractMapObject and it deriving classes are documentated as well as there according implementation classes.
* If you are interested in the graphical elements an AbstractMapObject consists of you should look at the Foo<b>Impl</b> class.
*
* \section secOutputOperator Output operators 'operator<<'
* This library define a couple enums, structure and so on. Most of the time \c operator<< is declared for convenience.
* So you can simply write:
*
* \code
* #include <AdvancedSymbology/symbol_dictionary.h>
* AdvancedSymbology::SymbologyType symType = AdvancedSymbology::SymbologyType::APP6B;
* std::cout << " SymbologyType is" << symType << "!" << std::endl;
* INFO_LOG(m_logger) << LOGFUNCTION << " SymbologyType is" << symType << "!";
* \endcode
* Output: \c SymbologyType \c is \c APP6B!
*
* This operator is also declared for \b QPoint and \b QPointF. This is done in the namespace SituationMap to not pollute the global namespace.
* \n To get access to these two operators you can
* - simple write \code using namespace SituationMap; // be careful and think about the consequences! \endcode
* - write your own operator in the requested namespace and delegate to an existing one like:
* \code
* std::ostream& operator<< (std::ostream& stream, const QPoint& value)
* {
* return SituationMap::operator<<(stream, value);
* }
* \endcode
*
* \section secCoordinationTransformation Coordination Transformation
* All Coordinate of the SitationMapInterface are based on the EPSG code '4236' which means 'WGS84'
* For example a geo coordinate is x/lon 0.15.. y/lat 0.927 - angle in rad.
*
* Geo coordinates are converted into map coordinate using the CoordTranslationFunctor and his methods mapToGeographic and geographicToMap.
* These methods include are using Esri::ArcGISRuntime::GeometryEngine::project().
*
*/
class SITUATIONMAP_EXPORT Map : public QWidget, public Referenced
{
Q_OBJECT
public:
using RefPointerMapObjectList = QVector<RefPointer<AbstractMapObject>>;
/*! \name Construction, Destruction */
//@{
protected:
/**
* @brief Constructor.
* @param parent
*/
explicit Map(QWidget *parent = nullptr);
public:
virtual bool init(const Mode mapMode_2D3D) = 0;
virtual bool load() = 0;
virtual Mode mode() const = 0;
virtual void setParent(QWidget *parent, bool beginDestroy) = 0;
/**
* @brief Destructor.
*/
virtual ~Map() = default;
/**
* @brief Copy constructor - deleted
* @param other
*/
Map(const Map &other) = delete;
/**
* @brief Assignment constructor - deleted
* @param other
*/
Map &operator=(const Map &other) = delete;
//@}
/*! \name Configuration */
/**
* @brief animationDuration to be used as default duration if no duration is specified.
* Example: setCenterPoint
*/
//@{
virtual double animationDuration() const = 0;
virtual void setAnimationDuration(double durationSec) = 0;
virtual double rocketDuration() const = 0;
virtual void setRocketDuration(double durationSec) = 0;
virtual void addMapWidget() = 0;
virtual bool setTextBox(const PixelTextBoxData &ptbd, bool enableGeometryModifications = true) = 0;
virtual bool removeTextBox() = 0;
virtual bool isPositionStringVisible() const = 0;
virtual void showPositionString(bool visible = true) = 0;
virtual void setPositionStringColor(const QColor &foregroundColor, const QColor &backgroundColor) = 0;
virtual void setReplay(bool b) = 0;
virtual bool isReplay() const = 0;
virtual void setPartitionTime(const qint64 &time) = 0;
virtual bool isExerciseTimeStringVisible() const = 0;
virtual void showExerciseTimeString(bool visible = false) = 0;
virtual void setExerciseTimeStringColor(const QColor &foregroundColor, const QColor &backgroundColor) = 0;
virtual bool isTimeStringVisible() const = 0;
virtual void setTimeString(const QString &timeString) = 0;
virtual void showTimeString(bool visible = true) = 0;
virtual void setTimeStringColor(const QColor &foregroundColor, const QColor &backgroundColor) = 0;
virtual bool isCompassVisible() const = 0;
virtual void showCompass(bool visible = true) = 0;
virtual void addSideBar() = 0;
virtual void removeSideBar() = 0;
virtual QPointer<SideBar> sideBar() = 0;
static bool applyLicense(const QString &licenseStr, const QStringList &extensions = QStringList());
static bool applyNetworkCacheSettings(const EsriNetworkCacheSettings &esriNetworkCacheSettings);
static EsriNetworkCacheSettings networkCacheSettings();
/**
* @brief Create a Map instance.
* @param parent Parent widget to be used.
* @return Created Map.
*/
static Map *create(QWidget *parent = nullptr);
/** brief Gets whether the Map is loaded.
* @return True if loaded.
*/
virtual bool isLoaded() const = 0;
virtual QGraphicsView *getQGraphicsView() const = 0;
/**
* @brief Map is Ready?
* @return True if Map is ready, otherwise false.
*/
virtual bool isReady() const = 0;
/**
* @brief Get current drawStatus
* @return current drawStatus
*/
virtual DrawStatus drawStatus() const = 0;
/**
* @brief Get current wkid.
* @return Current wkid.
*/
virtual int wkid() const = 0;
/**
* @brief Retrieve current Map Settings (for current Operator)
* @return current Operator Map Settings
* @cond Map has to be ready
*/
virtual OperatorMapSettings operatorMapSettings() const = 0;
/**
* @brief Restore OperatorMapSettings
* @param oms OperatorMapSettings to be restored
* @return True on success, otherwise false.
* @cond Map has to be ready
*/
virtual bool restoreOperatorMapSettings(const OperatorMapSettings &oms) = 0;
//@}
/*! \name BaseSurface Below Ground, introduced with V100.5.0 */
//@{
virtual NavigationConstraint navigationConstraint() const = 0;
virtual bool setNavigationConstraint(SituationMap::NavigationConstraint NavigationConstraint) = 0;
virtual float baseSurfaceOpacity() const = 0;
virtual bool setBaseSurfaceOpacity(float surfaceOpacity) = 0;
//@}
/*! \name OverviewMap */
//@{
virtual OverviewMapHandler &overviewMapHandler() const = 0;
//@}
/*! \name Layer */
//@{
/**
* @brief Get access to LayerFactory.
* @return Reference to the LayerFactory.
*/
virtual LayerFactory &layerFactory() const = 0;
virtual int technicalLayerCount() const = 0;
//@}
/*! \name Grid */
//@{
virtual Grid &grid() const = 0;
//@}
/*! \name Symbology and Symbol Dictionary */
//@{
virtual bool setSymbologyType(AdvancedSymbology::SymbologyType symbologyType) = 0;
virtual AdvancedSymbology::SymbologyType symbologyType() = 0;
virtual AdvancedSymbology::SymbolDictionary &symbolDictionary() const = 0;
virtual bool isSymbolDictionaryLoaded() const = 0;
//@}
/*! \name Object Creation (create MapObjects using an ObjectFactory)
* Don`t forget to register the interfaces and the desired implementations like:
*
* \code
* SituationMap::ObjectFactory::registerMe(typeid(SituationMap::MapObjectIndicator), new SituationMap::GenericObjectFactory<SituationMap::MapObjectIndicatorImpl>() );
* \endcode
*/
//@{
/**
* @brief Get access to ObjectFactory.
* @return Reference to the ObjectFactory.
*/
virtual ObjectFactory &objectFactory() = 0;
/**
* @brief Set ObjectContainer to share an ObjectContainer.
* (and in most case its IdContainer) the ObjectContainer can be shared between
* multiple Map instances.
* @param objectContainer set ObjectContainer to be used.
*/
virtual void setObjectContainer(QSharedPointer<ObjectContainer> objectContainer) = 0;
/**
* @brief setPartyIdToColorFunctor to convert a partyId to a associated color
* @param partyIdToColor new functor
*/
virtual void setPartyIdToColorFunctor(QSharedPointer<PartyIdToColorFunctor> partyIdToColor) = 0;
/**
* @brief Provide PartyIdToColorFunctor to get information about partyId's and associated colors
* @return Reference to PartyIdToColorFunctor
*/
virtual PartyIdToColorFunctor &partyIdToColorFunctor() const = 0;
//@}
/**
* @brief Get access to OverlayHandler to show overlays created using the PlanEditor.
* @return Reference to the OverlayHandler.
*/
virtual OverlayHandler &overlayHandler() const = 0;
/*! \name JumpPoints... */
//@{
virtual bool addJumpPoint(const QString &name, const Point3D &originGeo, double mapScale = -1) = 0;
virtual bool removeJumpPoint(const QString &name) = 0;
virtual QStringList jumpPointNames() const = 0;
//@}
/*! \name Map Extent, Center with Scale, ViewPoint */
//@{
/**
* @brief Initialize (activate) CoordTranslationFunctor.
*/
virtual void initCoordTranslationFunctor() = 0;
/**
* @brief Get Access to the coordTranslationFunctor.
* @return coordTranslationFunctor.
*/
virtual CoordTranslationFunctor *coordTranslationFunctor() const = 0;
// virtual void setCoordTranslationFunctor(CoordTranslationFunctor* ctFuntor);
virtual Viewpoint2D initialViewpoint() const = 0;
/**
* @brief setInitialViewpoint set initial viewpoint
* @param initialViewpoint
* @note rotation is skipped here
*/
virtual void setInitialViewpoint(const Viewpoint2D &initialViewpoint) = 0;
virtual Viewpoint2D viewpoint2D() const = 0;
/**
* @brief setViewpoint2D set new viewpoint
* @param viewpoint new viewpoint (evaluates position, scale and rotation)
* @param durationSeconds the duration of the animation in seconds.
*/
virtual void setViewpoint2D(const Viewpoint2D &viewpoint, float durationSeconds = -1.0) = 0;
virtual void setViewpoint2DAndWait(const Viewpoint2D &viewpoint) = 0;
virtual QPointF centerPoint() const = 0;
virtual void setCenterPoint(const QPointF &center, double scale = -1.0, float durationSeconds = -1.0) = 0; ///< lon/lat in radian
/**
* @brief scale
* @return scale value.
*/
virtual double scale() const = 0;
/**
* @brief Set new scale without animation
* @param absoluteScale new value (scale must be greater than zero)
*/
virtual void setScale(double absoluteScale) = 0;
/**
* @brief Get the rotation angle.
* @return Rotation angle.
*/
virtual double rotation() const = 0;
/**
* @brief Set Rotation of Map.
* @param absoluteAngleDegrees new rotation angle.
*/
virtual void setRotation(double absoluteAngleDegrees) = 0;
virtual QRectF extent() const = 0;
virtual void setExtent(const QRectF &extent) = 0;
virtual void setExtent(double xmin, double ymin, double xmax, double ymax) = 0; ///< lon/lat in radian
virtual void zoomToArea(const QVector<QPointF> &coords, int paddingInDIPS) = 0;
virtual void setTrainingsAreaExtent(const QVector<QPointF> &trainingsAreaExtent) = 0; ///< for compass context menue: zoom to area
// virtual QRectF fullExtent() const = 0;
//@}
/*! \name Map Scale
* Annotation:
* \n MinScale and maxScale are initialized by the basemap first loaded.
* These values can be overwritte using setMinScale() and setMaxScale().
* \n Attention:
* setMinScale() limits zoom out
* setMaxScale() limits zoom in
*/
//@{
/**
* @brief Get pixelSize
* @return size of pixel [Meter]
*/
virtual double pixelSizeMeter() = 0;
/**
* @brief Get pixelSize
* @return size of pixel [geographics]
*/
virtual double pixelSizeGeographic() = 0;
/**
* @brief Set MinScale to limit zoom out
* @param minScaleToLimitZoomOut new value, use value '0' to clear.
*/
virtual void setMinScale(double minScaleToLimitZoomOut) = 0;
/**
* @brief get current minScale
* @return minScale
*/
virtual double minScale() const = 0;
/**
* @brief Set MaxScale to limit zoom in
* @param maxScaleToLimitZoomIn new value, use value '0' to clear.
*/
virtual void setMaxScale(double maxScaleToLimitZoomIn) = 0;
/**
* @brief Get current maxScale
* @return maxScale
*/
virtual double maxScale() const = 0;
//@}
/**
* @brief Creates a rectangle rubberband to let the user define an area to set the new extent.
*/
virtual bool scaleByArea() const = 0;
/*! \name 3D */
//@{
virtual Camera camera() const = 0;
virtual void setCamera(const Camera &camera, float durationSeconds = -1.0) = 0;
//@}
/*! \name Coordinate conversions from window to simulation or map world */
//@{
/**
* @brief Converts map coordinate to pixel coordinate of viewport window.
* @param mapCoord coordinate
* @return pixel coordinate of viewport window
*/
virtual QPointF mapCoordinateToViewPortWindowPoint(const QPointF &mapCoord) const = 0;
virtual QPointF mapCoordinateToViewPortWindowPoint3D(const Point3D &mapCoord) const = 0;
/**
* @brief Converts pixel coordinate of viewport window to map coordinate.
* @param pixelCoord coordinate of viewport window
* @return map coordinate
*/
virtual QPointF viewPortWindowPointToMapCoordinate(const QPointF &pixelCoord) const = 0;
/**
* @brief Converts pixel coordinate of viewport window to 3D map coordinate.
* @param pixelCoord coordinate of viewport window
* @return 3D map coordinate (x, y, elevation)
*/
virtual Point3D viewPortWindowPointToMapCoordinate3D(const QPointF &pixelCoord) const = 0;
/**
* @brief Converts geo coordinate to pixel coordinate of viewport window.
* @param geoCoordinate coordinate
* @return pixel coordinate of viewport window
* @see coordTranslationFunctor, CoordTranslationFunctor
*/
virtual QPointF geoCoordinateToViewPortWindowPoint(const QPointF &geoCoordinate) const = 0;
virtual QPointF geoCoordinateToViewPortWindowPoint3D(const Point3D &geoCoordinate) const = 0;
/**
* @brief Converts pixel coordinate of viewport window to geo coordinate.
* @param pixelCoord coordinate of viewport window
* @return geo coordinate
* @see coordTranslationFunctor, CoordTranslationFunctor
*/
virtual QPointF viewPortWindowPointToGeoCoordinate(const QPointF &pixelCoord) const = 0;
/**
* @brief Converts pixel coordinate of viewport window to 3D geo coordinate.
* @param pixelCoord coordinate of viewport window
* @return 3D geo coordinate (longitude, latitude, elevation)
* @see coordTranslationFunctor, CoordTranslationFunctor
*/
virtual Point3D viewPortWindowPointToGeoCoordinate3D(const QPointF &pixelCoord) const = 0;
//@}
virtual QString geoToMgrsString(const QPointF &geoPos) const = 0;
virtual QString mapToMgrsString(const QPointF &mapPos) const = 0;
/**
* @brief Creating of GeometryModelRenderer instances
* @param layerName Name of layer to render to.
* @param geometryModel Instance of GeometryModel to render
* @param parent QObject parent
* @see GeometryModel, GeometryModelRenderer
*/
virtual GeometryModelRenderer *createGeometryModelRenderer(const QString &layerName, GeometryModel *geometryModel, QObject *parent = nullptr) = 0;
/*! \name Rubberbands */
//@{
/**
* @brief Get access to rubberband factory
* @return Reference to the RubberbandFactory
*/
virtual RB::RubberbandFactory &rubberbandFactory() const = 0;
//@}
/*! \name Pick objects by area*/
//@{
virtual bool pickMapObjectsArea() const = 0;
//@}
/*! \name EventHandling */
//@{
/**
* @brief Install a class instance to manage drop events
*
* To Process drop event an instance of class DropEventManager has to be installed. If a drop event has been reached the
* manageDrop function is called. It is possible to install multiple drop event manager. The order of calling the manageDrop
* function is undefined.
*
* @param demgr Pointer to class instance of DropEventManager
*
* see deinstallDropEventManager, DropEventManager
*/
virtual void installDropEventManager(DropEventManager *demgr) = 0;
/**
* @brief Removes installed drop event manager
* @param demgr Pointer to class instance of DropEventManager
* @see installDropEventManager, DropEventManager
*/
virtual void deinstallDropEventManager(DropEventManager *demgr) = 0;
//@}
/*! \name ObjectIndicator */
//@{
/**
* @brief ObjectIndicator
*/
virtual ObjectIndicator &objectIndicator() = 0;
//@}
/*! \name LocationDisplay */
//@{
/**
* @brief LocationDisplay
*/
virtual LocationDisplay &locationDisplay() = 0;
//@}
/*! \name PixelBasedTextBox */
//@{
/**
* @brief PixelBasedTextBox
*/
virtual PixelBasedTextBoxHandler &pixelBasedTextBoxHandler() = 0;
//@}
/*! \name Rocket */
//@{
/**
* @brief start rocket (zoom out and zoom in to show surrounding area)
*/
virtual void startRocket() = 0;
virtual bool rocketIsRunning() const = 0;
//@}
/*! \name Tools */
//@{
/**
* @brief Get access to Measurement
* @return Reference to the Measurement
*/
virtual Measurement &measurement() = 0;
/**
* @brief Get access to TerrainProfile
* @return Reference to the TerrainProfile
*/
virtual TerrainProfile &terrainProfile() = 0;
/**
* @brief Get access to Viewshed
* @return Reference to the Viewshed
*/
virtual Viewshed &viewshed() = 0;
//@}
/*! \name Symbol scale */
//@{
/**
* @brief Get current symbol scale
* @note This may take a while since AbstractMapObject::updateView() has to be called for ALL objects!!!
* @return current symbol scale
*/
virtual double symbolScale() const = 0;
/**
* @brief Set and apply new symbolScale
* @param symbolScale to apply
*/
virtual void setSymbolScale(double symbolScale) = 0;
//@}
/*! \name Screenshot etc. */
//@{
virtual QImage toImageSync() = 0;
virtual QUuid toImage() = 0;
/*!
@brief Stores currently visible content of the map as PDF file
The current visible content off the map is written as PDF structure to a file. This process is
asynchron. When writing the PDF file has been finished the signal pdfCompleted is emitted.
@see pdfCompleted
*/
virtual bool toPdf(const QString &outputFilename,
const QString &title,
const QString &footerLeft,
const QString &footerCenter,
const QString &footerRight,
const QColor &textColor = QColor()) = 0;
//@}
/*!
Is installing an event filter to viewport of view map window.
@param eventFilter QObject to filter events.
*/
virtual void installViewPortEventFilter(QObject *eventFilter) = 0;
/*!
Is removing an event filter from viewport of view map window.
@param eventFilter QObject to filter events.
*/
virtual void removeViewPortEventFilter(QObject *eventFilter) = 0;
/**
* @brief createMapNotifier to simply connect actions on mapReady and similar.
* @return MapNotifier (will be destroyed if map is destroyed)
*/
virtual QPointer<MapNotifier> createMapNotifier() const = 0;
signals:
/// Signal emits when the spatial reference has been initialized and the Map is ready to receive requests.
void mapReady();
/// Signal emits when the Map is ready AND the associated SymbolDictionary is loaded AND loading of all elevationSources is finished.
void mapReadyAndSymbolDictionaryLoaded();
/// Signal emits at the beginning of the destructor (to enable destruction of FunctionDialog and its object first)
void beginDestroy();
/// Signal emits when adding a layer fails.
void layerAddError(const QString &layername, const QString &error);
/// Signal emits when extent of the %Map has changed (e.g. by zoom or scale)
void extentChanged(); // extentChanged
/// Signal emits when extent of the %Map change finished (and a small timeout has expired)
void extentChangedDelayed(); // extentChanged
/// Signal emits when the Map's bounding rectangle size has changed (e.g. window size changed)
void rectChanged();
/// Signal emits when the partyColors have changed (and a small timeout has expired)
void partysChangedDelayed();
/// Signal emits when the Map rotates.
void rotationChanged(double absoluteAngleDegrees);
/// Signal emits when all elevationSource are loaded successfully.
void allElevationSourcesLoaded();
/// Signal emits when baseSurfaceOpacity changes.
void navigationConstraintChanged(NavigationConstraint NavigationConstraint);
/// Signal emits when baseSurfaceOpacity changes.
void baseSurfaceOpacityChanged(float opacity);
/// Signal emits when the layer generation completes.
void layerCreateComplete(const QString &layername);
/// Signal emits when the layer creation fails.
void layerCreateError(const QString &layername, const QString &error);
/// Signal emits when the layer order changes.
void layerOrderChanged();
/// Signal emits when some parameter of a layer changes.
void layerParameterChanged(const QString &layername,
const LayerParameter &newLayerParameter);
/// Signal emits when at least one VisualComponent changes (to update GUI)
void visualComponentChanged(const VisualComponent &visualComponent);
/**
* Signal emits when the user clicks on map objects (based on EventMouseNavigator)
*
* @param idList Reference to a list filled with ids of objects.
* @param viewportPosition Position of click in viewport window.
*/
void mapObjectIdsClicked(const QList<UniqueMapId> &idList, const QPointF &viewportPosition);
/**
* Signal emits when the user clicks on map objects (based on EventMouseNavigator)
*
* @param mapObjList Reference to a list filled with pointer to map objects.
* @param viewportPosition Position of click in viewport window.
*/
void mapObjectsClicked(const RefPointerMapObjectList &mapObjList, const QPointF &viewportPosition);
/**
* Signal emits when the user calls pickMapObjectsArea
* @param idList Reference to a list filled with ids of objects.
*/
void mapObjectIdsPickedByArea(const QList<UniqueMapId> &idList);
/**
* Signal emits when the user calls pickMapObjectsArea
* @param idList Reference to a list filled with pointer to map objects.
*/
void mapObjectsPickedByArea(const RefPointerMapObjectList &mapObjList);
void escapePressed();
/**
* Signal emits when the user clicks right mouse button (based on EventMouseNavigator). Be carefull because there
* are two different signals with this name but with different parameter. To get the right function pointer for
* connect a cast has to be used. For example:
* \code
*
* connect( d->m_map
* , (void (SituationMap::Map::*)(const QList<SituationMap::UniqueMapId> &&,const QPoint& ))(&SituationMap::Map::contextMenuClicked)
* , this
* , &SitMap::onMapContextClicked );
*
* \endcode
*
* @param[in] mapObjList Reference to a list filled with pointer to map objects.
* @param[in] viewportPosition Position of click in viewport window.
*/
void contextMenuClicked(const RefPointerMapObjectList &mapObjList, const QPointF &viewportPosition);
/// Signal emits to indicate mouseMoves (MouseMoveLayer has to be enabled!)
// void mouseMovedEvent(const QPointF& screenPos); // MouseMoveLayer has to be enabled!!!
/*!
Signal emits to indicate changes of mouse cursor position.
@param x window coordinate in x direction
qparam y window coordinate in y direction
*/
void mouseWindowPositionChanged(int x, int y);
/*!
Signal emits to indicate changes of mouse cursor position in map coordinates.
*/
void mouseMapPositionChanged(const Point3D &mapPos, bool isValid);
/*!
Signal emits to indicate changes of mouse cursor position in sim coordinates.
@see CoordTranslationFunctor
*/
void mouseGeoPositionChanged(const Point3D &geoPos, bool isValid);
void symbolScaleChanged(double symbolScale);
void rocketFinished();
void imageCompleted(const QUuid &taskId, const QImage &image);
/*!
Signal emits to indicate finishing of PDF creation process
@see toPdf
*/
void pdfCompleted(const QString &filePath);
}; // Map
SITUATIONMAP_EXPORT QString toString(const Mode &value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Mode &value);
} // namespace SituationMap
Q_DECLARE_METATYPE(SituationMap::Mode)
File diff suppressed because it is too large. Load diff
+350
View File
@@ -0,0 +1,350 @@
/**
* @RDE_HEADER@
* MapInitializer
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "map.h"
#include "map_settings.h"
#include <Map/viewpoint2D.h>
#include <Common/situation_map_logging.h>
#include <situation_map_export.h>
// Qt
#include <QString>
#include <QJsonObject>
//----------------------------------------------------------------------------
namespace SituationMap
{
//----------------------------------------------------------------------------
class SITUATIONMAP_EXPORT BaseUrl
{
public:
BaseUrl(const QString &url = QString(),
double minScale = -1, double maxScale = -1);
QString url() const { return m_url; }
void setUrl(const QString &url) { m_url = url; }
QString name() const { return m_name; }
void setName(const QString &name) { m_name = name; }
QString description() const { return m_description; }
void setDescription(const QString &description) { m_description = description; }
BasemapType basemapType() const { return m_basemapType; }
void setBasemapType(const BasemapType &basemapType) { m_basemapType = basemapType; }
double minScale() const { return m_minScale; }
void setMinScale(double minScale) { m_minScale = minScale; }
double maxScale() const { return m_maxScale; }
void setMaxScale(double maxScale) { m_maxScale = maxScale; }
double altitudeOffset() const { return m_altitudeOffset; }
void setAltitudeOffset(double altitudeOffset) { m_altitudeOffset = altitudeOffset; }
static BaseUrl read(const QJsonObject &json);
QJsonObject toJsonObject() const;
private:
QString m_url;
QString m_name;
QString m_description;
BasemapType m_basemapType = BasemapType::Undefined;
double m_minScale = -1;
double m_maxScale = -1;
double m_altitudeOffset{0.0}; // relevant for slpk (used at AHTC)
};
//----------------------------------------------------------------------------
class SITUATIONMAP_EXPORT MapSettingsJson
{
public:
MapSettingsJson() = default;
QJsonObject toJsonObject() const;
bool fromJsonObject(const QJsonObject &json);
void setMapUrls(const QVector<BaseUrl> &urls) { m_mapUrls = urls; }
void setSceneUrls(const QVector<BaseUrl> &urls) { m_sceneUrls = urls; }
void setSceneObjectUrls(const QVector<BaseUrl> &urls) { m_sceneObjectUrls = urls; }
void setElevationUrls(const QVector<BaseUrl> &urls) { m_elevationUrls = urls; }
const QVector<BaseUrl> &getMapUrls() const { return m_mapUrls; }
const QVector<BaseUrl> &getSceneUrls() const { return m_sceneUrls; }
const QVector<BaseUrl> &getSceneObjectUrls() const { return m_sceneObjectUrls; }
const QVector<BaseUrl> &getElevationUrls() const { return m_elevationUrls; }
private:
QVector<BaseUrl> m_mapUrls;
QVector<BaseUrl> m_sceneUrls;
QVector<BaseUrl> m_sceneObjectUrls;
QVector<BaseUrl> m_elevationUrls;
};
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
/**
* @brief The MapInitializer class is based on the template method idiom.
* <b> It´s designed for easy initializing of a SituationMap::Map. </b>
*
* Typical usage could look like:
*
* \code
*
// Part I: derive from MapInitializer:
class myMapInitializer : public SituationMap::MapInitializer
{
using BaseClass SituationMap::MapInitializer;
public:
explicit myMapInitializer(SituationMap::Map &map
, SituationMap::MapSettings &mapSettings
, const QString &debugName)
:BaseClass(map, mapSettings, debugName) {}
bool initializeObjectFactory() override
{
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::MapObjectIndicator), new SituationMap::GenericObjectFactory<SituationMap::MapObjectIndicatorImpl>() );
...
return true;
}
protected slots:
virtual void onMapReady()
{
BaseClass::onMapReady();
// own things should be added here
}
};
//-----------------------------------------------------------------------------
// Part II: Connect Map, MapSetting using MapInitializer:
d->m_map = SituationMap::Map::create(this);
d->m_mainLayout->addWidget(d->m_map, 1, 0);
connect(d->m_map, &SituationMap::Map::mapObjectsClicked, this, &SitMap::onMapObjectClicked );
QString iniFilePath = QCoreApplication::applicationDirPath(); // /../build-product/bin
iniFilePath.append(QLatin1String("/situation_map_defaults.ini"));
d->m_mapSettings = QSharedPointer<SituationMap::MapSettings> ( new SituationMap::MapSettings(iniFilePath) );
d->m_mapInitializer = QSharedPointer<myMapInitializer>
( new myMapInitializer(*d->m_map, *d->m_mapSettings, QLatin1String("SitMapExample")) );
if (d->m_mapInitializer->hasErrors())
{
FATAL_LOG(m_logger) << LOGFUNCTION << " MapInitializer-filename='" << d->m_mapInitializer->filename()
<< "'' has following errors: "
<< " exists = " << exists()
<< " accessError = " << d->m_mapInitializer->accessError()
<< " formatError = " << d->m_mapInitializer->formatError();
return;
} else {
if (d->m_mapInitializer->initMap())
{
INFO_LOG(m_logger) << LOGFUNCTION << " MapInitializer::initMap() ok";
} else {
ERROR_LOG(m_logger) << LOGFUNCTION << " MapInitializer::initMap() failed";
}
}
*
* \endcode
*
* If you are using <b>more than on map</b>, you should think about the IdGenerator and ObjectContainer.
* \n Sharing \b one IdGenerator by all maps is recommended to avoid misusing a UniqueMapId between different maps.
* \n But ist also strongly recommended that every map has it own ObjectContainer.
* To achieve this you could write:
*
* \code
* // IdGenerator & ObjectContainer:
QSharedPointer<SituationMap::IdGenerator> idGen( new SituationMap::IdGenerator );
QSharedPointer<SituationMap::ObjectContainerCTC> objectCont1( new SituationMap::ObjectContainerCTC(idGen) );
d->m_map1->setObjectContainer( objectCont1 );
QSharedPointer<SituationMap::ObjectContainerCTC> objectCont2( new SituationMap::ObjectContainerCTC(idGen) );
d->m_map2->setObjectContainer( objectCont2 );
\endcode
* This can be a) prior, b) within or c) after the MapInitializer. It depends on the circumstances.
* It seems to be easiest to do prior the MapInitalizer.
*
*
* \section secLifetime Lifetime of the MapInitializer
* Unfortunatly the MapInitializer must not be destroyed after call to initMap().
* \n The signal mapReady is - what a surprise - fired later. And parameters like centerPoint, scale and so on requires the map to be ready!
* Therefore it is forbidden to create the MapInitializer on the stack.
*/
class SITUATIONMAP_EXPORT MapInitializer : public QObject
{
Q_OBJECT
public:
/*! \name Construction, Destruction */
//@{
protected:
/**
* @brief MapInitializer must be created on the heap. See \ref secLifetime.
* @param map
* @param mapSettings
* @param debugName
* @param parent
*/
explicit MapInitializer(Map &map
, MapSettings &mapSettings
, const QString &debugName
, QObject *parent = nullptr);
public:
/**
* @brief set MapSettingsJson haveing priority compared to mapSettings
* @param mapSettingJson
*/
void setMapSettingsJson(const MapSettingsJson &mapSettingJson);
/**
* @brief ~MapInitializer destructor
*/
virtual ~MapInitializer();
/**
* @brief Copy constructor - deleted
* @param other
*/
MapInitializer(const MapInitializer &other) = delete;
/**
* @brief Assignment constructor - deleted
* @param other
*/
MapInitializer &operator=(const MapInitializer &other) = delete;
//@}
/*! \name Error handling*/
//@{
QString filename() const;
bool hasErrors() const;
bool exists() const;
bool accessError() const;
bool formatError() const;
//@}
/*! \name 'template method' defining the skeleton of an algorithm. */
//@{
/**
* @brief initMap is the 'template method'.
* It defines a skeleton of an algorithm, here the initialization of the map.
* @param mapMode to be choosen
* @return True on success, otherwise false.
*/
virtual bool initMap(Mode mapMode = Mode::Mode_2D);
//@}
Viewpoint2D viewPoint() const { return m_viewPoint; }
void setViewPoint(const Viewpoint2D &viewPoint) { m_viewPoint = viewPoint; }
protected:
/*! \name 'Placeholder' or 'concrete methods' (to be overloaded if necessary)
* They are called by the 'template method' (here initMap).
*/
//@{
virtual bool applyLicense();
virtual bool applyNetworkCache();
virtual bool setSymbologyType();
virtual bool setBasemapLayernamePrefix();
virtual bool setParticipantLayername();
// The following method may be overwritten to ease using a UI element
virtual AdvancedSymbology::SymbologyType symbologyType() const;
virtual bool initalizeLocalMapFile();
virtual bool initializeBasemaps(Mode mapMode); // mode to use mapUrls or sceneUrls
virtual bool initializeBasemapsQSettings(Mode mapMode); // mode to use mapUrls or sceneUrls
virtual bool initializeBasemapsJson(const QVector<BaseUrl> &baseUrls); // use mapUrls or sceneUrls
virtual bool initializeSceneObjectLayers();
virtual bool initializeSceneObjectLayersJson();
virtual bool initializeElevationSources();
virtual bool initializeElevationSourcesQSettings();
virtual bool initializeElevationSourcesJson();
virtual bool initialzeInitialViewpoint();
virtual bool initializeOperationalLayers();
virtual bool initializeUniqueValueRendererForCubes();
virtual bool initializeExtraSymbolDirectory();
virtual bool initializeAnimations();
virtual bool initializeGrid();
virtual bool initializeObjectFactory();
virtual bool initializeRubberFactory();
virtual bool setObjectContainer();
virtual bool initializeCoordTranslationFunctor();
virtual bool initializeMapWidgets();
virtual bool initializeSideBar();
virtual bool setViewshedUrl();
//@}
protected slots:
/**
* @brief onMapReady is implemented and called if the map fires mapReady.
* The implementation is setting centerPoint, scale and min/max scale using the values of MapSettings.
*
* <b> This method has to be overloaded to make clear the order of this content and the application-specific portion. </b>
*/
virtual void onMapReady();
protected:
Mode m_mapMode = Mode::Undefined;
Map &m_map;
MapSettingsJson m_mapSettingJson;
MapSettings &m_mapSettings;
QString m_debugName;
Viewpoint2D m_viewPoint;
LOGGER_T m_logger; ///< Interface of the Logging-Facility
};
} // namespace SituationMap
+84
View File
@@ -0,0 +1,84 @@
/**
* @RDE_HEADER@
* MapNotifier
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "map_notifier.h"
#include "map.h"
// Qt
namespace SituationMap
{
QPointer<MapNotifier> MapNotifier::createMapNotifier(Map *map, QObject *parent)
{
if (!map)
return nullptr;
if (!parent)
return nullptr;
MapNotifier *ptr = new MapNotifier(parent);
ptr->setMap(map);
return ptr;
}
void MapNotifier::run()
{
if (m_map.isNull())
{
qCritical() << "no map";
return;
}
//
// signal mapReady
//
if (m_map->isReady())
onMapReady();
else
connect(m_map.data(), &SituationMap::Map::mapReady,
this, &MapNotifier::onMapReady, Qt::UniqueConnection);
//
// signal mapReadyAndSymbolDictionaryLoaded
//
if (m_map->isReady() && m_map->isSymbolDictionaryLoaded())
onMapReadyAndSymbolDictionaryLoaded();
else
connect(m_map.data(), &SituationMap::Map::mapReadyAndSymbolDictionaryLoaded,
this, &MapNotifier::onMapReadyAndSymbolDictionaryLoaded, Qt::UniqueConnection);
}
void MapNotifier::setMap(Map *map)
{
m_map = map;
}
const QPointer<Map> MapNotifier::map()
{
return m_map;
}
void MapNotifier::onMapReady()
{
// qCritical() << "emit mapReady()";
emit mapReady();
}
void MapNotifier::onMapReadyAndSymbolDictionaryLoaded()
{
// qCritical() << "emit mapReadyAndSymbolDictionaryLoaded(), this=" << this;
emit mapReadyAndSymbolDictionaryLoaded();
}
} // namespace SituationMap
+60
View File
@@ -0,0 +1,60 @@
/**
* @RDE_HEADER@
* MapNotifier
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <situation_map_export.h>
// Qt
#include <QObject>
#include <QPointer>
#include <QTimer>
namespace SituationMap
{
//forward
class Map;
class SITUATIONMAP_EXPORT MapNotifier final : public QObject
{
Q_OBJECT
using BaseClass = QObject;
protected:
using BaseClass::BaseClass;
void setMap(Map *map);
public:
static QPointer<MapNotifier> createMapNotifier(Map *map, QObject *parent);
void run();
const QPointer<Map> map();
Q_SIGNALS:
void mapReady();
void mapReadyAndSymbolDictionaryLoaded();
protected Q_SLOTS:
void onMapReady();
void onMapReadyAndSymbolDictionaryLoaded();
private:
Q_DISABLE_COPY(MapNotifier)
QPointer<Map> m_map;
};
} // namespace SituationMap
+498
View File
@@ -0,0 +1,498 @@
/**
* @RDE_HEADER@
* Interface of AbstractMapObject
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "map_settings.h"
#include "situation_map_utils.h" // fromString(GridType...)
#include "grid.h"
//Qt
#include <QFile>
//----------------------------------------------------------------------------
namespace SituationMap
{
MapSettings::MapSettings(const QString &inifile_ABSOLUTE_Path, QObject *parent)
: QObject(parent)
, m_settings(inifile_ABSOLUTE_Path, QSettings::IniFormat)
, m_logger(getLogger("MapSettings"))
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
DEBUG_LOG(m_logger) << LOGFUNCTION << " filename='" << m_settings.fileName();
if (hasErrors())
{
ERROR_LOG(m_logger) << LOGFUNCTION << " filename='" << m_settings.fileName()
<< "'' has following errors: "
<< " exists = " << exists()
<< " accessError = " << accessError()
<< " formatError = " << formatError();
}
else
{
DEBUG_LOG(m_logger) << LOGFUNCTION << " filename='" << m_settings.fileName()
<< "' has no errors ";
// set default symbology type
AdvancedSymbology::SymbolDictionary::setDefaultSymbologyType(symbologyType());
}
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
MapSettings::~MapSettings()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
QString MapSettings::filename() const { return m_settings.fileName(); }
bool MapSettings::hasErrors() const { return !exists() || m_settings.status() != QSettings::Status::NoError; }
bool MapSettings::exists() const
{
QFile file(filename());
return file.exists();
}
bool MapSettings::accessError() const { return m_settings.status() == QSettings::Status::AccessError; }
bool MapSettings::formatError() const { return m_settings.status() == QSettings::Status::FormatError; }
QString MapSettings::licenseStr() const
{
return m_settings.value(QLatin1String("license/licenseString")).toString();
}
QStringList MapSettings::licenseExtensions()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
QStringList sl;
int size = m_settings.beginReadArray(QLatin1String("license"));
sl.reserve(size);
for (int i = 0; i < size; ++i)
{
m_settings.setArrayIndex(i);
const QString &val = m_settings.value(QLatin1String("extensionString")).toString();
sl.append(val);
}
m_settings.endArray();
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return sl;
}
EsriNetworkCacheSettings MapSettings::networkCacheSettings()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
EsriNetworkCacheSettings encs;
encs.enabled = m_settings.value(QLatin1String("esriNetworkCache/enabled"), false).toBool();
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return encs;
}
QString MapSettings::symbologyTypeStr() const
{
return m_settings.value(QLatin1String("symbology/type")).toString();
}
AdvancedSymbology::SymbologyType MapSettings::symbologyType() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
QString typeStr = symbologyTypeStr();
AdvancedSymbology::SymbologyType symType = AdvancedSymbology::SymbologyType::None;
AdvancedSymbology::fromString(symType, typeStr);
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return symType;
}
QString MapSettings::extraSymbolDirectory() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
QString extraDir = m_settings.value(QLatin1String("symbology/extraSymbols")).toString();
TRACE_LOG(m_logger) << LOGFUNCTION << " END, extraDir='" << extraDir << "'";
return extraDir;
}
QString MapSettings::basemapLayernamePrefix()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
QString val = m_settings.value(QLatin1String("mapUrls/basemapLayernamePrefix")).toString();
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return val;
}
QVector<QPair<QString, QString>> MapSettings::mapUrlsWithNames()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
int size = m_settings.beginReadArray(QLatin1String("mapUrls"));
QVector<QPair<QString, QString>> mapUrls;
mapUrls.reserve(size);
for (int i = 0; i < size; ++i)
{
m_settings.setArrayIndex(i);
const QString &val = m_settings.value(QLatin1String("url")).toString();
const QString &name = m_settings.value(QLatin1String("name")).toString();
mapUrls.append(QPair<QString, QString>(val,name));
DEBUG_LOG(m_logger) << val << " Name: " << name << " END";
}
m_settings.endArray();
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return mapUrls;
}
QStringList MapSettings::mapUrls()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
QStringList mapUrls;
int size = m_settings.beginReadArray(QLatin1String("mapUrls"));
mapUrls.reserve(size);
for (int i = 0; i < size; ++i)
{
m_settings.setArrayIndex(i);
const QString &val = m_settings.value(QLatin1String("url")).toString();
mapUrls.append(val);
}
m_settings.endArray();
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return mapUrls;
}
QStringList MapSettings::sceneUrls()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
QStringList sceneUrls;
int size = m_settings.beginReadArray(QLatin1String("sceneUrls"));
sceneUrls.reserve(size);
for (int i = 0; i < size; ++i)
{
m_settings.setArrayIndex(i);
const QString &val = m_settings.value(QLatin1String("url")).toString();
sceneUrls.append(val);
}
m_settings.endArray();
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return sceneUrls;
}
QVector<QPair<QString, QString>> MapSettings::sceneUrlsWithNames()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
const int size = m_settings.beginReadArray(QLatin1String("sceneUrls"));
QVector<QPair<QString, QString>> sceneUrls;
sceneUrls.reserve(size);
for (int i = 0; i < size; ++i)
{
m_settings.setArrayIndex(i);
const QString &val = m_settings.value(QLatin1String("url")).toString();
const QString &name = m_settings.value(QLatin1String("name")).toString();
sceneUrls.append(QPair<QString, QString>(val,name));
}
m_settings.endArray();
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return sceneUrls;
}
QStringList MapSettings::sceneObjectUrls()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
QStringList sceneUrls;
int size = m_settings.beginReadArray(QLatin1String("sceneObjectUrls"));
sceneUrls.reserve(size);
for (int i = 0; i < size; ++i)
{
m_settings.setArrayIndex(i);
const QString &val = m_settings.value(QLatin1String("url")).toString();
sceneUrls.append(val);
}
m_settings.endArray();
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return sceneUrls;
}
QStringList MapSettings::elevationUrls()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
QStringList elevationUrls;
int size = m_settings.beginReadArray(QLatin1String("elevationUrls"));
elevationUrls.reserve(size);
for (int i = 0; i < size; ++i)
{
m_settings.setArrayIndex(i);
const QString &val = m_settings.value(QLatin1String("url")).toString();
elevationUrls.append(val);
}
m_settings.endArray();
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return elevationUrls;
}
QStringList MapSettings::operationalLayers()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
QStringList operationalLayers;
int size = m_settings.beginReadArray(QLatin1String("operationalLayer"));
operationalLayers.reserve(size);
for (int i = 0; i < size; ++i)
{
m_settings.setArrayIndex(i);
const QString &val = m_settings.value(QLatin1String("operationalLayer")).toString();
operationalLayers.append(val);
}
m_settings.endArray();
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return operationalLayers;
}
QString MapSettings::participantLayername()
{
return m_settings.value(QLatin1String("operationalLayer/participantLayername")).toString();
}
QString MapSettings::operationalLayerForCubes()
{
return m_settings.value(QLatin1String("operationalLayer/operationalLayerForCubes")).toString();
}
QString MapSettings::localMapFile()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
QString val = m_settings.value(QLatin1String("mapUrls/localMapFile")).toString().trimmed();
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return val;
}
QString MapSettings::centerPointMgrs() const
{
return m_settings.value(QLatin1String("map/center"), QLatin1String("32UMD8000085000")).toString();
}
double MapSettings::zoomFactorBase() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
bool ok = false;
double value = m_settings.value(QLatin1String("map/zoomFactorBase")).toDouble(&ok);
return (ok) ? value : -1;
}
double MapSettings::scale() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return m_settings.value(QLatin1String("map/initialScale")).toDouble();
}
double MapSettings::minScale() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return m_settings.value(QLatin1String("map/scaleMin")).toDouble();
}
double MapSettings::maxScale() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return m_settings.value(QLatin1String("map/scaleMax")).toDouble();
}
double MapSettings::scaleHasVisibility() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return m_settings.value(QLatin1String("map/scaleHasVisibility")).toDouble();
}
QString MapSettings::gridStr() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return m_settings.value(QLatin1String("map/gridType")).toString();
}
GridType MapSettings::gridType() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
QString gridString = gridStr();
GridType gridType = GridType::NoType;
fromString(gridType, gridString);
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return gridType;
}
double MapSettings::animationDuration() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return m_settings.value(QLatin1String("map/animationDuration")).toDouble();
}
double MapSettings::rocketDuration() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return m_settings.value(QLatin1String("map/rocketDuration")).toDouble();
}
bool SituationMap::MapSettings::addMapWidgets() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return m_settings.value(QLatin1String("widgets/addMapWidgets"), false).toBool();
}
bool MapSettings::addSideBar() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return m_settings.value(QLatin1String("widgets/addSideBar"), false).toBool();
}
QString MapSettings::viewshedUrl() const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return m_settings.value(QLatin1String("viewshed/viewshedUrl")).toString();
}
static QColor s2c(const QString &colorString)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Creating a QColor from string. The string has one of the following formats:
*
* - #RGB (each of R, G, and B is a single hex digit)
* - #RRGGBB
* - #AARRGGBB (Since 5.2)
* - #RRRGGGBBB
* - #RRRRGGGGBBBB
* - A name from the list of colors defined in the list of SVG color keyword names provided by the
* World Wide Web Consortium; for example, "steelblue" or "gainsboro". These color names work on all platforms.
* Note that these color names are not the same as defined by the Qt::GlobalColor enums, e.g. "green" and
* Qt::green does not refer to the same color.
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
return QColor(colorString);
} // s2c( const QString & colorString )
QColor MapSettings::rubberbandDrawColor() const { return s2c(m_settings.value(QLatin1String("rubberband/drawColor"), QLatin1String("black")).toString()); }
QColor MapSettings::rubberbandFillColor() const { return s2c(m_settings.value(QLatin1String("rubberband/fillColor"), QLatin1String("#32969696")).toString()); }
QColor MapSettings::rubberbandHandleDrawColor() const { return s2c(m_settings.value(QLatin1String("rubberband/handleDrawColor"), QLatin1String("black")).toString()); }
QColor MapSettings::rubberbandHandleFillColor() const { return s2c(m_settings.value(QLatin1String("rubberband/handleFillColor"), QLatin1String("yellow")).toString()); }
QColor MapSettings::rubberbandSelectionColor() const { return s2c(m_settings.value(QLatin1String("rubberband/selectionColor"), QLatin1String("red")).toString()); }
QColor MapSettings::rubberbandFrameColor() const { return s2c(m_settings.value(QLatin1String("rubberband/frameColor"), QLatin1String("black")).toString()); }
QColor MapSettings::rubberbandFrameFillColor() const { return s2c(m_settings.value(QLatin1String("rubberband/frameFillColor"), QLatin1String("#32969600")).toString()); }
int MapSettings::rubberbandFrameHandleMargin() const { return m_settings.value(QLatin1String("rubberband/frameHandleMargin"), 10).toInt(); }
QPoint MapSettings::rubberbandPreviewOffset() const { return m_settings.value(QLatin1String("rubberband/previewOffset"), QPoint(32, 32)).toPoint(); }
unsigned int MapSettings::rubberbandPreviewSize() const { return m_settings.value(QLatin1String("rubberband/previewSize"), 32).toUInt(); }
unsigned int MapSettings::rubberbandPickingRatio() const { return m_settings.value(QLatin1String("rubberband/pickingRatio"), 0).toUInt(); }
unsigned int MapSettings::rubberbandLineHandleWidth() const { return m_settings.value(QLatin1String("rubberband/lineHandleWidth"), 2).toUInt(); }
QString MapSettings::toString() const
{
MapSettings *THIS = const_cast<MapSettings *>(this);
std::ostringstream stream;
stream << "symbologyTypeStr: " << this->symbologyTypeStr() << std::endl;
stream << "symbologyType: " << this->symbologyType() << std::endl;
stream << "mapUrls: " << THIS->mapUrls().join(QLatin1String(";")) << std::endl;
stream << "operationalLayers: " << THIS->operationalLayers().join(QLatin1String(";")) << std::endl;
stream << "centerPointMgrs: " << this->centerPointMgrs() << std::endl;
stream << "scale: " << this->scale() << std::endl;
stream << "minSscale: " << this->minScale() << std::endl;
stream << "maxScale: " << this->maxScale() << std::endl;
stream << "zoomFactorBase: " << this->zoomFactorBase() << std::endl;
stream << "gridStr: " << this->gridStr() << std::endl;
stream << "gridType: " << this->gridType() << std::endl;
stream << "viewShedUrl: " << this->viewshedUrl() << std::endl;
stream << "rubberbandDrawColor: " << rubberbandDrawColor().name() << std::endl;
stream << "rubberbandFillColor: " << rubberbandFillColor().name() << std::endl;
stream << "rubberbandHandleDrawColor: " << rubberbandHandleDrawColor().name() << std::endl;
stream << "rubberbandHandleFillColor: " << rubberbandHandleFillColor().name() << std::endl;
stream << "rubberbandSelectionColor: " << rubberbandSelectionColor().name() << std::endl;
stream << "rubberbandFrameColor: " << rubberbandFrameColor().name() << std::endl;
stream << "rubberbandFrameFillColor: " << rubberbandFrameFillColor().name() << std::endl;
stream << "rubberbandFrameHandleMargin: " << rubberbandFrameHandleMargin() << std::endl;
stream << "rubberbandPreviewOffset: " << rubberbandPreviewOffset() << std::endl;
stream << "rubberbandPreviewSize: " << rubberbandPreviewSize() << std::endl;
stream << "rubberbandLineHandleWidth: " << rubberbandLineHandleWidth() << std::endl;
return QLatin1String(stream.str().c_str());
}
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const MapSettings &value)
{
stream << value.toString();
return stream;
}
} // namespace SituationMap
+151
View File
@@ -0,0 +1,151 @@
/**
* @RDE_HEADER@
* Interface of AbstractMapObject
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <Common/situation_map_logging.h>
#include <situation_map_export.h>
#include <Symbology/symbol_dictionary.h>
// Qt
#include <QString>
#include <QSettings>
//----------------------------------------------------------------------------
namespace SituationMap
{
/**
* @brief The MapSettings class is reading some values from an ini file using the QSettings.
* The main use case is the class MapInitializer.
*/
class SITUATIONMAP_EXPORT MapSettings : public QObject
{
Q_OBJECT
public:
/*! \name Construction, Destruction */
//@{
/**
* @brief Constructor
* @param inifile_ABSOLUTE_Path to read
*/
explicit MapSettings(const QString &inifile_ABSOLUTE_Path, QObject *parent = nullptr);
/**
* @brief ~MapSettings destructor
*/
virtual ~MapSettings();
//@}
/**
* @brief Get filename
* @return filename
*/
QString filename() const;
/*! \name Functions for error handling */
//@{
bool hasErrors() const;
bool exists() const;
bool accessError() const;
bool formatError() const;
//@}
/*! \name Get values */
//@{
QString licenseStr() const;
QStringList licenseExtensions();
EsriNetworkCacheSettings networkCacheSettings();
QString symbologyTypeStr() const;
AdvancedSymbology::SymbologyType symbologyType() const;
QString extraSymbolDirectory() const;
QString basemapLayernamePrefix();
QString localMapFile();
QVector<QPair<QString, QString>> mapUrlsWithNames();
QStringList mapUrls();
QStringList sceneUrls();
QVector<QPair<QString, QString>> sceneUrlsWithNames();
QStringList sceneObjectUrls();
QStringList elevationUrls();
QStringList operationalLayers();
QString participantLayername();
QString operationalLayerForCubes();
QString centerPointMgrs() const;
double scale() const;
double minScale() const;
double maxScale() const;
double scaleHasVisibility() const;
double zoomFactorBase() const;
QString gridStr() const;
GridType gridType() const;
double animationDuration() const;
double rocketDuration() const;
bool addMapWidgets() const;
bool addSideBar() const;
QString viewshedUrl() const;
QColor rubberbandDrawColor() const;
QColor rubberbandFillColor() const;
QColor rubberbandHandleDrawColor() const;
QColor rubberbandHandleFillColor() const;
QColor rubberbandSelectionColor() const;
QColor rubberbandFrameColor() const;
QColor rubberbandFrameFillColor() const;
int rubberbandFrameHandleMargin() const;
QPoint rubberbandPreviewOffset() const;
unsigned int rubberbandPreviewSize() const;
unsigned int rubberbandPickingRatio() const;
unsigned int rubberbandLineHandleWidth() const;
//@}
QString toString() const;
protected:
QSettings m_settings;
LOGGER_T m_logger; ///< Interface of the Logging-Facility
};
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
/**
* @brief Output operator
* @param stream used to stream into.
* @param value to be streamed.
* @return appended stream.
*/
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const MapSettings &value);
} // namespace SituationMap
+44
View File
@@ -0,0 +1,44 @@
/**
* @RDE_HEADER@
* Interface-Implementation of DangerArea
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include <situation_map_export.h>
// Qt
#include <QPointF>
#include <QString>
//----------------------------------------------------------------------------
namespace SituationMap
{
/**
* @brief The Measurement class.
*/
class SITUATIONMAP_EXPORT Measurement
{
public:
Measurement() = default; ///< Contructor
virtual ~Measurement() = default; ///< Destructor
Measurement(const Measurement &other) = delete;
Measurement &operator=(Measurement &other) = delete;
virtual long measureLength() = 0;
virtual void clear() = 0;
};
} // namespace SituationMap
+54
View File
@@ -0,0 +1,54 @@
/**
* @RDE_HEADER@
* Interface for Storing of MapObjects
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "object_container.h"
namespace SituationMap
{
ObjectContainer::ObjectContainer(const QSharedPointer<IdGenerator> &idGenerator)
: m_idGenerator(idGenerator)
, m_logger(getLogger("ObjectContainer"))
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
ObjectContainer::~ObjectContainer()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
QSharedPointer<IdGenerator> ObjectContainer::idGenerator() const
{
return m_idGenerator;
}
//----------------------------------------------------------------------------
IdGenerator::IdGenerator()
: m_logger(getLogger("IdGenerator"))
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
IdGenerator::~IdGenerator()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
} // namespace SituationMap
+204
View File
@@ -0,0 +1,204 @@
/**
* @RDE_HEADER@
* Interface for Storing of MapObjects
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "abstract_map_object.h"
#include <Common/situation_map_logging.h>
// Qt
#include <QMap>
#include <QSharedPointer>
#include <typeindex>
//----------------------------------------------------------------------------
namespace SituationMap
{
//forward
template<class> class RefPointer;
/**
* @brief The IdGenerator class generates a new UniqueMapId in a very simple manner.
*/
class SITUATIONMAP_EXPORT IdGenerator // final
{
public:
static const UniqueMapId INVALID_ID = SituationMap::INVALID_MAP_ID;
IdGenerator();
virtual ~IdGenerator(); // leave virtual to let UnitTestInternal succeed
IdGenerator(const IdGenerator &other) = delete;
IdGenerator &operator=(IdGenerator &other) = delete;
/**
* @brief Get next UniqueMapId
* @return Next UniqueMapId
*/
UniqueMapId getNextId()
{
DEBUG_LOG(m_logger) << LOGFUNCTION << " nextId=" << m_counter;
return m_counter++;
}
/**
* @brief Check validity
* @param id to be checked
* @return True if id is not equal INVALID_ID
* @note Prefer SituationMap::isUniqueMapIdValid() due to runtime aspects.
*/
static bool idIsValid(const UniqueMapId &id)
{
return isUniqueMapIdValid(id); // same as ( id != INVALID_ID );
}
UniqueMapId nextFreeId() const { return m_counter; }
protected:
LOGGER_T m_logger; ///< Interface of the Logging-Facility
UniqueMapId m_counter = 0;
};
//----------------------------------------------------------------------------
/**
* @brief The ObjectContainer class maps UniqueMapId to MapObjects.
* It uses an external IdGenerator to generate a next UniqueMapId returned
* while inserting.
*/
class SITUATIONMAP_EXPORT ObjectContainer
{
public:
using UniqueObjectId = UniqueMapId;
using Object = AbstractMapObject;
/*! \name Construction, Destruction */
//@{
/**
* @brief Constructor of ObjectContainer.
* @param idGenerator to be used
* (can be shared among different ObjectContainer instances).
*/
explicit ObjectContainer(const QSharedPointer<IdGenerator> &idGenerator);
/**
* @brief Destructor. Will delete the IdGenerator when it goes
* out of scope, if no other QSharedPointer objects are referencing it.
*/
virtual ~ObjectContainer();
ObjectContainer(const ObjectContainer &other) = delete;
ObjectContainer &operator=(ObjectContainer &other) = delete;
/**
* @brief Get current IdGenerator.
* @return Current IdGenerator.
*/
virtual QSharedPointer<IdGenerator> idGenerator() const;
//@}
/*! \name Insert, Remove, Clear */
//@{
/**
* @brief insertObject.
* @param object to be inserted.
* @return UniqueId of inserted object.
*/
virtual UniqueObjectId insertObject(Object *object) = 0;
virtual UniqueObjectId insertObject(ObjectContainer::Object *object, const ObjectContainer::UniqueObjectId &uid) = 0;
/**
* @brief Remove object from the container.
* @param id to be removed.
* @return True on success, otherwise false.
*/
virtual bool removeObject(const UniqueObjectId &id) = 0;
/**
* @brief Clear the container (and remove objects from the view)
*/
virtual void clear() = 0;
//@}
/*! \name Access */
//@{
/**
* @brief getObject.
* @param id to access.
* @return Object if found, otherwise null.
*/
virtual Object *getObject(const UniqueObjectId &id) const = 0;
/**
* @brief Retrieves all UniqueIds.
* @return Get all UniqueIds.
*/
virtual QList<UniqueObjectId> getAllKeys() const = 0;
/**
* @brief Get all objects of any type.
* @return All objects.
*/
virtual QList<Object *> getAllObjects() const = 0;
/**
* @brief Get all objects of a certain type.
* @param type requested type.
* @return All objects fo requested type
*/
virtual QList<Object *> getAllObjects(const std::type_index &type) const = 0;
/**
* @brief Get mutable Iterator
* @return mutable Iterator
*/
virtual QMutableMapIterator<UniqueObjectId, RefPointer<Object>> mutableIterator() = 0;
//@}
/*! \name Check */
//@{
/**
* @brief Check existence.
* @param id to be checked.
* @return True if exists, otherwise false.
*/
virtual bool containsObject(const UniqueObjectId &id) const = 0;
//@}
/*! \name Count */
//@{
virtual qint64 countObjects() const = 0;
//@}
protected:
QSharedPointer<IdGenerator> m_idGenerator;
LOGGER_T m_logger; ///< Interface of the Logging-Facility
};
} // namespace SituationMap
+222
View File
@@ -0,0 +1,222 @@
/**
* @RDE_HEADER@
* Construction of MapObjects
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "object_factory.h"
#include <MapImpl/abstract_map_object_impl.h>
#include <MapImpl/map_impl.h>
// ESRI
// Qt
#include <QCoreApplication>
namespace SituationMap
{
static FactoryMap &factoryMap()
{
static FactoryMap s_factoryMap;
return s_factoryMap;
}
static void cleanupFactoryMap()
{
// stored objects will be deleted by QSharedPointer:
factoryMap().clear();
}
FactoryMap &MapSingleton::getFactoryMap()
{
if (factoryMap().isEmpty())
qAddPostRoutine(cleanupFactoryMap);
return factoryMap();
}
//----------------------------------------------------------------------------
void ObjectFactory::setObjectContainer(const QSharedPointer<ObjectContainer> &objectContainer)
{
m_objectContainer = objectContainer;
}
bool ObjectFactory::initMapObject(AbstractMapObject *obj, Map *map, UniqueMapId uid, const QString &logicalLayerName)
{
bool success = false;
if (obj && map)
{
AbstractMapObjectImpl *objImpl = dynamic_cast<AbstractMapObjectImpl *>(obj);
MapImpl *mapImpl = dynamic_cast<MapImpl *>(map);
if (objImpl)
{
success = objImpl->init(mapImpl, logicalLayerName);
if (!success)
{
ERROR_LOG(m_logger) << LOGFUNCTION << " obj->init() failed";
return false;
}
if (m_objectContainer)
{
UniqueMapId uniqueId = m_objectContainer->insertObject(objImpl,uid);
objImpl->setUniqueId(uniqueId);
DEBUG_LOG(m_logger) << LOGFUNCTION << " insertObject: "
<< " uniqueId='" << uniqueId << "'"
<< " countObjects=" << m_objectContainer->countObjects()
<< " debugInfo='" << obj->debugInfo() << "'"
<< " logicalLayerName='" << logicalLayerName << "'";
}
else
ERROR_LOG(m_logger) << LOGFUNCTION << " no objectContainer";
// apply symbolScale:
objImpl->setScale(map->symbolScale());
}
}
else
ERROR_LOG(m_logger) << LOGFUNCTION << " initMapObject failed";
return success;
} // ObjectFactory::initMapObject
AbstractMapObject *ObjectFactory::idToMapObject(const UniqueMapId &uniqueId) const
{
if (m_objectContainer)
{
// if objectContainer stores type 'Referenced':
// obj = dynamic_cast<AbstractMapObject*> ( m_objectContainer->getObject(uniqueId) );
// or use static_cast to speed up.
return m_objectContainer->getObject(uniqueId);
}
return nullptr;
}
std::type_index ObjectFactory::interfaceToImplementation(const std::type_index &interface_IN, bool *bOk)
{
// 1. INTERFACE_TYPE -> GenericObjectFactory<IMPL_TYPE> -> type_index(IMPL_TYPE) via getFactoryMap
const std::type_index &keyRequestedInterface = interface_IN;
const QLatin1String name(interface_IN.name());
// DEBUG_LOG(m_logger) << LOGFUNCTION << " IFtype=" << name ;
if (MapSingleton::getFactoryMap().contains(keyRequestedInterface))
{
if (bOk)
*bOk = true;
return MapSingleton::getFactoryMap().value(keyRequestedInterface)->getTypeIndexOfImplementation();
}
return std::type_index(typeid(this)); // at least one parameter is expected :-(
}
bool ObjectFactory::isUniqueIdValid(const UniqueMapId &uniqueMapId)
{
return isUniqueMapIdValid(uniqueMapId);
} // ObjectFactory::isUniqueIdValid
qint32 ObjectFactory::count() const
{
if (m_objectContainer)
return m_objectContainer->countObjects();
FATAL_LOG(m_logger) << LOGFUNCTION
<< " no objectContainer!!!";
return -1;
}
QList<RefPointer<AbstractMapObject> > ObjectFactory::getAllObjects() const
{
if (m_objectContainer)
{
const QList<ObjectContainer::Object *> objList = m_objectContainer->getAllObjects();
QList<RefPointer<AbstractMapObject> > refPtrList;
refPtrList.reserve(objList.size());
for (ObjectContainer::Object *obj : objList)
refPtrList.append(RefPointer<AbstractMapObject>(obj));
return refPtrList;
}
ERROR_LOG(m_logger) << LOGFUNCTION
<< " no objectContainer!!!";
return QList<RefPointer<AbstractMapObject> > ();
}
QList<UniqueMapId> ObjectFactory::getAllKeys() const
{
if (m_objectContainer)
return m_objectContainer->getAllKeys();
ERROR_LOG(m_logger) << LOGFUNCTION
<< " no objectContainer!!!";
return QList<UniqueMapId> ();
}
bool ObjectFactory::contains(const UniqueMapId &uniqueMapId) const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START, requested for uniqueMapId=" << uniqueMapId;
if (m_objectContainer)
return m_objectContainer->containsObject(uniqueMapId);
ERROR_LOG(m_logger) << LOGFUNCTION << " no objectContainer!!!";
TRACE_LOG(m_logger) << LOGFUNCTION << " END, requested for uniqueMapId=" << uniqueMapId;
return false;
} // ObjectFactory::contains
RefPointer<AbstractMapObject> ObjectFactory::get(const UniqueMapId &uniqueMapId) const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " get requested for uniqueMapId=" << uniqueMapId;
// lookup in internal container:
if (m_objectContainer)
{
AbstractMapObject *mapObj = idToMapObject(uniqueMapId);
if (!mapObj)
ERROR_LOG(m_logger) << LOGFUNCTION << " Requested object for uniqueMapId=" << uniqueMapId << " doesn't exist.";
return RefPointer<AbstractMapObject>(mapObj);
}
ERROR_LOG(m_logger) << LOGFUNCTION << " no objectContainer!!!";
return RefPointer<AbstractMapObject>();
}
void ObjectFactory::clearObjects()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
if (m_objectContainer)
m_objectContainer->clear();
else
ERROR_LOG(m_logger) << LOGFUNCTION << " no objectContainer!!!";
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
}
void ObjectFactory::clearRegister()
{
// stored objects will be deleted by QSharedPointer:
MapSingleton::getFactoryMap().clear();
}
bool ObjectFactory::isMapReady() const
{
return m_map && m_map->isReady();
}
} // namespace SituationMap
+406
View File
@@ -0,0 +1,406 @@
/**
* @RDE_HEADER@
* Construction of MapObjects
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "generic_object_factory.h"
#include "object_container.h"
#include "abstract_map_object.h"
#include "situation_map_utils.h"
#include <Common/ref_pointer.h>
#include <situation_map_export.h>
#include <Common/situation_map_logging.h>
// Qt
#include <QMap>
#include <typeindex>
//----------------------------------------------------------------------------
namespace SituationMap
{
// forward
class Map;
using FactoryMapKey = std::type_index;
using FactoryMapData = QSharedPointer<GenericObjectFactoryBase>;
using FactoryMap = QMap<FactoryMapKey, FactoryMapData>;
/**
* @brief The MapSingleton struct maps between
* INTERFACE (type_index) and GenericObjectFactory
* It´s a singleton. Therefore this map has to be set only once per process until it is cleared.
*/
struct SITUATIONMAP_EXPORT MapSingleton
{
static FactoryMap &getFactoryMap();
};
/**
* @brief The ObjectFactory class is basically responsible for creation of all objects of type AbstractMapObject.
* The complete range of tasks includes:
* - creates objects of type AbstractMapObject and deriving classes
* - initialize (call init() ofAbstractMapObject) and
* - store them (within ObjectContainer)
* - stores an ObjectContainer (with its IdGenerator)
*
* <b>Example:
*
* \code
// Pre-condition :
// Initialize objectFactory:
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Participant),
new SituationMap::GenericObjectFactory<SituationMap::ParticipantImpl>() );
// : Pre-condition
...
SituationMap::ObjectFactory& objFac = d->m_map->objectFactory();
// use an LOGICAL layer (not basemap)
QString layername("ParticipantLayerName");
SituationMap::RefPointer<SituationMap::Participant> objPtr;
objPtr = objFac.create<SituationMap::Participant>("ParticipantLayerName", // use an LOGICAL layer (not basemap)
"ParticipantId1" // debugInfo (may contain SimId)
);
* \endcode
*
* \sa Map
*/
class SITUATIONMAP_EXPORT ObjectFactory
{
public:
/*! \name Construction, Destruction */
//@{
/**
* @brief Contructor.
* @param map to be used..
*/
explicit ObjectFactory(Map *map)
: m_logger(getLogger("ObjectFactory"))
, m_map(map) {}
virtual ~ObjectFactory() = default; ///< Destructor
ObjectFactory(const ObjectFactory &other) = delete;
ObjectFactory &operator=(ObjectFactory &other) = delete;
/**
* @brief Set the ObjectContainer to be used.
* @param objectContainer to be used.
*/
void setObjectContainer(const QSharedPointer<ObjectContainer> &objectContainer);
//@}
/**
* @brief Translate uniqueMapId to native AbstractMapObject.
* @param uniqueId to get.
* @return AbstractMapObject if found, otherwise null.
*/
AbstractMapObject *idToMapObject(const UniqueMapId &uniqueId) const;
Map* map() { return m_map; }
protected:
/**
* @brief Initialize MapObject.
* @param obj MapObject to be initialized.
* @param map Map to which the mapObject belongs to.
* @param logicalLayerName (logical) layer on which the object should be created.
* @return True on success; otherwise false.
*/
bool initMapObject(AbstractMapObject *obj, Map *map, UniqueMapId uid, const QString &logicalLayerName);
friend class MapImpl; // to support MapImpl::doClickMapObject
/**
* @brief Translate type_index of
* the interface class to the corresponding type_index of implementation class.
* @param interface_IN Type to be translated.
* @param bOk true is found, otherwise false.
* @return requested type_index of implementation class.
*/
std::type_index interfaceToImplementation(const std::type_index &interface_IN, bool *bOk = nullptr);
public:
//----------------------------------------------------------------------------
// create by (interface) type
//----------------------------------------------------------------------------
/*! \name Create */
//@{
/**
* @brief Create MapObject of required type.
* @param uniqueMapId Define the uniqueId of MapObject, be careful to use a valid and unused id
* @param logicalLayerName (logical) layer on which the object should be created.
* @param debugInfo Set debugInfo
* @return MapObject of required type on success; otherwise null.
*/
template<typename INTERFACE_TYPE>
RefPointer<INTERFACE_TYPE> create(const UniqueMapId &uniqueMapId,
const QString &logicalLayerName, // external: via type
const QString &debugInfo = QString())
{
DEBUG_LOG(m_logger) << LOGFUNCTION << " create requested for ..."
<< ", debugInfo='" << debugInfo << "'"
<< ", logicalLayerName='" << logicalLayerName << "'";
if (!isMapReady())
{
FATAL_LOG(m_logger) << LOGFUNCTION << " create failed"
<< ", map not ready yet"
<< ", debugInfo='" << debugInfo << "'";
return RefPointer<INTERFACE_TYPE>();
}
if (logicalLayerName.isEmpty())
{
FATAL_LOG(m_logger) << LOGFUNCTION << " create failed"
<< ", logicalLayerName is empty"
<< ", debugInfo='" << debugInfo << "'";
return RefPointer<INTERFACE_TYPE>();
}
std::type_index key(typeid(INTERFACE_TYPE));
const QString &name = QString::fromLatin1(key.name());
DEBUG_LOG(m_logger) << LOGFUNCTION << " create requested for ... name='" << name << "'"
<< ", debugInfo='" << debugInfo << "'";
if (MapSingleton::getFactoryMap().contains(key))
{
RefPointer<INTERFACE_TYPE> obj(MapSingleton::getFactoryMap().value(key)->makeObj(debugInfo));
if (obj.valid() && initMapObject(obj.get(), m_map, uniqueMapId, logicalLayerName))
{
return obj; // the caller will receive the requested type :-)
}
ERROR_LOG(m_logger) << LOGFUNCTION << " init failed, name='" << name << "'";
obj->removeMySelf(); // cleanup
return RefPointer<INTERFACE_TYPE>();
}
FATAL_LOG(m_logger) << LOGFUNCTION << " create failed, name= '" << name << "'"
<< ", factoryMap.size() = " << MapSingleton::getFactoryMap().count();
return RefPointer<INTERFACE_TYPE>();
}
/**
* @brief Create MapObject of required type.
* @param logicalLayerName (logical) layer on which the object should be created.
* @param debugInfo Set debugInfo
* @return MapObject of required type on success; otherwise null.
*/
template<typename INTERFACE_TYPE>
RefPointer<INTERFACE_TYPE> create(const QString &logicalLayerName, // external: via type
const QString &debugInfo = QString())
{
return create<INTERFACE_TYPE>(SituationMap::INVALID_MAP_ID, logicalLayerName, debugInfo);
}
//@}
/*! \name Count */
//@{
/**
* @brief Number of objects.
* @return Current number of objects.
*/
qint32 count() const;
//@}
/*! \name Check */
//@{
/**
* @brief Check uniqueMapId.
* @param uniqueMapId to be checked.
* @return Returns true if uniqueId is valid; otherwise returns false.
* @note Prefer SituationMap::isUniqueMapIdValid() due to runtime aspects.
*/
static bool isUniqueIdValid(const UniqueMapId &uniqueMapId);
/**
* @brief Check the existence <B>not</B> regarding the type.
* @param uniqueId to lookup.
* @return Returns true if container contains an occurrence; otherwise returns false.
*/
bool contains(const UniqueMapId &uniqueMapId) const;
/**
* @brief Check the existence <B>regarding</B> the type.
* @param uniqueMapId to lookup.
* @return Returns true if container contains an occurrence; otherwise returns false.
*/
template<typename INTERFACE_TYPE>
bool contains(const UniqueMapId &uniqueMapId)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " contains requested for uniqueMapId=" << uniqueMapId;
bool containsId = contains(uniqueMapId);
if (containsId)
{
// 1 typeid Interface to typeid Impl:
bool bOk = false;
std::type_index keyRequestedImpl = interfaceToImplementation(typeid(INTERFACE_TYPE), &bOk);
if (bOk)
{
// 2. retrieve out of internal container:
AbstractMapObject *mapObj = idToMapObject(uniqueMapId);
if (!mapObj)
return false;
// 3. compare retrieved objectTYPE with requested (IMPL)TYPE:
// std::type_index(typeid(*baseClass)) == std::type_index(typeid(*subClass))
containsId = std::type_index(typeid(*mapObj)) == keyRequestedImpl;
}
else
{
FATAL_LOG(m_logger) << LOGFUNCTION << " contains failed, name= '" << typeid(INTERFACE_TYPE).name() << "'"
<< " factoryMap.size() = " << MapSingleton::getFactoryMap().count();
}
}
return containsId;
} // ObjectFactory::contains
//@}
/*! \name Access */
//@{
/**
* @brief Get all UniqueIds.
* @return All UniqueIds.
*/
QList<UniqueMapId> getAllKeys() const;
/**
* @brief Get all Objects.
* @return Container with all objects.
*/
QList < RefPointer<AbstractMapObject> > getAllObjects() const;
/**
* @brief Get access the object.
* @param uniqueId to lookup.
* @return Pointer to AbstractMapObject (Base class).
*/
RefPointer<AbstractMapObject> get(const UniqueMapId &uniqueMapId) const;
/**
* @brief Get access to object <B>regarding</B> the type.
* @param uniqueId to lookup.
* @return Pointer to object (adaquate type).
*/
template<typename INTERFACE_TYPE>
RefPointer<INTERFACE_TYPE> get(const UniqueMapId &uniqueMapId) const
{
TRACE_LOG(m_logger) << LOGFUNCTION << " get requested for uniqueMapId=" << uniqueMapId;
// lookup in internal container:
RefPointer<AbstractMapObject> mapObj = get(uniqueMapId);
return RefPointer<INTERFACE_TYPE>(mapObj); // implicit dynamic_cast
}
/*! \name Clear */
//@{
/**
* @brief Clear all objects within associated ObjectContainer
*/
void clearObjects();
/**
* @brief Clear static register of GenericObjectFactory
* (created using registerMe())
*/
static void clearRegister();
//@}
/*! \name Register */
//@{
template <typename IMPL_TYPE>
friend class RegisterFactory; // to support 'REGISTER_TYPE'
static void registerMe(const std::type_index &key, GenericObjectFactoryBase *factory)
{
LOGGER_T logger = getLogger("ObjectFactory");
DEBUG_LOG(logger) << LOGFUNCTION
<< " IF '" << key.name() << "'"
<< " to IMPL '" << factory->getTypeIndexOfImplementation().name() << "')";
MapSingleton::getFactoryMap()[key] = FactoryMapData(factory);
}
//@}
private:
LOGGER_T m_logger; ///< Interface of the Logging-Facility
Map *m_map = nullptr;
QSharedPointer<ObjectContainer> m_objectContainer;
bool isMapReady() const;
};
//----------------------------------------------------------------------------
// Option for registration
//----------------------------------------------------------------------------
/**
* @brief The RegisterFactory class for registering the types to be created by ObjectFactory.
*/
template <typename IMPL_TYPE>
class SITUATIONMAP_EXPORT RegisterFactory final
{
public:
/**
* @brief Constructor.
* @param key type_index to be registered
*/
explicit RegisterFactory(const std::type_index &key)
{
GenericObjectFactoryBase *genericFactory = new GenericObjectFactory<IMPL_TYPE>;
ObjectFactory::registerMe(key, genericFactory);
}
~RegisterFactory() = default;
// create by (interface) type
// can be used to register by put that macro at the end of the implementation (cpp)
#define REGISTER_TYPE(interfaceType, implType) \
namespace { \
static RegisterFactory<implType> s_factory( typeid(interfaceType) ); \
};
};
} // namespace SituationMap
+66
View File
@@ -0,0 +1,66 @@
/**
* @RDE_HEADER@
* Interface of ObjectIndicator
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <situation_map_export.h>
// Qt
#include <QPointF>
//----------------------------------------------------------------------------
namespace SituationMap
{
/**
* @brief The ObjectIndicator class creating a ObjectIndicator.
*/
class SITUATIONMAP_EXPORT ObjectIndicator
{
protected:
ObjectIndicator() = default; ///< Contructor
virtual ~ObjectIndicator() = default; ///< Destructor
public:
ObjectIndicator(const ObjectIndicator &other) = delete;
ObjectIndicator &operator=(ObjectIndicator &other) = delete;
/*! \name Specific data*/
//@{
/**
* @brief Get uniqueId of mapObjectToPointTo
* @return uniqueId of the object to be pointed to.
*/
virtual UniqueMapId mapObjectToPointTo() = 0;
/**
* @brief Set uniqueId of object should to be pointed to.
* @param uniqueId of the object to be pointed to.
*/
virtual void setMapObjectToPointTo(const UniqueMapId &uniqueId, bool selected = false, int lifetimeMsec = -1) = 0;
virtual void setPointToPointTo(const QPointF &targetGeo, int lifetimeMsec = -1) = 0;
/**
* @brief Remove the indicator
* @return True on success, otherwise false.
*/
virtual void remove() = 0;
//@}
};
} // namespace SituationMap
+267
View File
@@ -0,0 +1,267 @@
/**
* @RDE_HEADER@
* Operator Map Settings
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "operator_map_settings.h"
//Qt
#include <QListIterator>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
//----------------------------------------------------------------------------
namespace SituationMap
{
bool OperatorMapSettings::isEmpty() const
{
return mode == Mode::Undefined;
}
bool OperatorMapSettings::getLayerParameter(const QString &layername, LayerParameter& layerParameterOut) const
{
const QVector<QPair<QString, LayerParameter>>::const_iterator it =
std::find_if(orderedLayers.cbegin(), orderedLayers.cend(),
[&layername](const QPair<QString, SituationMap::LayerParameter> &pair) { return pair.first == layername; } );
if (it == orderedLayers.end())
return false;
layerParameterOut = (*it).second;
return true;
}
bool OperatorMapSettings::updateLayerParameter(const QString &layername, const LayerParameter& layerParameter)
{
QVector<QPair<QString, LayerParameter>>::iterator it =
std::find_if(orderedLayers.begin(), orderedLayers.end(),
[&layername](const QPair<QString, SituationMap::LayerParameter> &pair) { return pair.first == layername; } );
if (it == orderedLayers.end())
return false;
// update
(*it).second = layerParameter;
return false;
}
QJsonObject OperatorMapSettings::toJsonObject() const
{
QJsonObject obj;
// mode
obj[QLatin1String("mode")] = static_cast<int>(mode);
obj[QLatin1String("viewpoint")] = viewpoint.toJsonObject();
obj[QLatin1String("camera")] = camera.toJsonObject();
// below ground:
obj[QLatin1String("navigationConstraint")] = static_cast<int>(navigationConstraint);
obj[QLatin1String("baseSurfaceOpacity")] = static_cast<double>(baseSurfaceOpacity);
// orderedLayers
{
QJsonArray jArray;
for (const QPair<QString, LayerParameter> &pair : qAsConst(orderedLayers))
{
const QString &layername = pair.first;
const LayerParameter &lp = pair.second;
QJsonObject objTemp = lp.toJsonObject();
objTemp[QLatin1String("layername")] = layername;
jArray.append(objTemp);
}
obj[QLatin1String("orderedLayers")] = jArray;
}
// orderedOverlays
{
QJsonArray jArray;
for (const int overlayId : orderedOverlays)
{
QJsonObject objTemp;
objTemp[QLatin1String("overlayId")] = overlayId;
jArray.append(objTemp);
}
obj[QLatin1String("orderedOverlays")] = jArray;
}
// MapWidgetSettings
obj[QLatin1String("mapWidgetSettings")] = mapWidgetSettings.toJsonObject();
// symbolScale
obj[QLatin1String("symbolScale")] = symbolScale;
// jumpPoints
{
QJsonArray jArray;
for (const JumpPointData &jpd : jumpPoints)
jArray.append(jpd.toJsonObject());
obj[QLatin1String("jumpPoints")] = jArray;
}
return obj;
}
QByteArray OperatorMapSettings::toJson() const
{
// final - toJson
QJsonDocument jDoc(toJsonObject());
return jDoc.toJson();
}
bool OperatorMapSettings::fromJson(const QByteArray &json)
{
QJsonParseError parseError;
QJsonDocument jDoc(QJsonDocument::fromJson(json, &parseError));
if (parseError.error != QJsonParseError::NoError)
{
qCritical() << " QJsonParseError->errorString: '" << parseError.errorString() << "'"
<< ", offset: " << parseError.offset;
return false;
}
return fromJsonObject(jDoc.object());
}
bool OperatorMapSettings::fromJsonObject(const QJsonObject &json)
{
// mode
mode = static_cast<Mode>(json[QLatin1String("mode")].toInt(int(Mode::Undefined)));
// viewpoint
viewpoint = Viewpoint2D::read(json[QLatin1String("viewpoint")].toObject());
// camera
camera = Camera::read(json[QLatin1String("camera")].toObject());
// below ground:
navigationConstraint = static_cast<SituationMap::NavigationConstraint>(json[QLatin1String("navigationConstraint")].toInt(int(SituationMap::NavigationConstraint::Undefined)));
baseSurfaceOpacity = static_cast<float>(json[QLatin1String("baseSurfaceOpacity")].toDouble(1.0));
// orderedLayers
{
const QJsonArray jArray = json[QLatin1String("orderedLayers")].toArray();
orderedLayers.clear();
orderedLayers.reserve(jArray.size());
for (const auto &val : jArray)
{
const QJsonObject &objTemp = val.toObject();
const QString &layername = objTemp[QLatin1String("layername")].toString();
if (layername.isEmpty())
continue;
const LayerParameter &lp = LayerParameter::read(objTemp);
orderedLayers.append(QPair<QString, LayerParameter>(layername, lp));
} // for
}
// orderedOverlays
{
const QJsonArray jArray = json[QLatin1String("orderedOverlays")].toArray();
orderedOverlays.clear();
orderedOverlays.reserve(jArray.size());
for (const auto &val : jArray)
{
const QJsonObject &objTemp = val.toObject();
const int overlayId = objTemp[QLatin1String("overlayId")].toInt();
orderedOverlays.append(overlayId);
} // for
}
// MapWidgetSettings
mapWidgetSettings = MapWidgetSettings::read(json[QLatin1String("mapWidgetSettings")].toObject());
// symbolScale
symbolScale = json[QLatin1String("symbolScale")].toDouble(1.0);
// range symbolScaleMinimum,symbolScaleMaximum is checked later at MapImpl::setSymbolScale()
// jumpPoints
{
const QJsonArray jArray = json[QLatin1String("jumpPoints")].toArray();
jumpPoints.clear();
jumpPoints.reserve(jArray.size());
for (const auto &val : jArray)
{
const QJsonObject &objTemp = val.toObject();
const JumpPointData &jpd = JumpPointData::read(objTemp);
jumpPoints.append(jpd);
} // for
}
return true;
}
//
// MapWidgetSettings
//
MapWidgetSettings MapWidgetSettings::read(const QJsonObject &json)
{
MapWidgetSettings mws;
if (json.contains(QLatin1String("gridVisibility"))) mws.gridVisibility = json[QLatin1String("gridVisibility")].toBool();
if (json.contains(QLatin1String("positionStringVisibility"))) mws.positionStringVisibility = json[QLatin1String("positionStringVisibility")].toBool();
if (json.contains(QLatin1String("timeStringVisibility"))) mws.timeStringVisibility = json[QLatin1String("timeStringVisibility")].toBool();
// [GUEZE-2921] add missing exerciseTimeString:
if (json.contains(QLatin1String("exerciseTimeStringVisibility"))) mws.exerciseTimeStringVisibility = json[QLatin1String("exerciseTimeStringVisibility")].toBool();
if (json.contains(QLatin1String("compassVisibility"))) mws.compassVisibility = json[QLatin1String("compassVisibility")].toBool();
if (json.contains(QLatin1String("overviewMapVisibility"))) mws.overviewMapVisibility = json[QLatin1String("overviewMapVisibility")].toBool();
return mws;
}
QJsonObject MapWidgetSettings::toJsonObject() const
{
QJsonObject json;
json[QLatin1String("gridVisibility")] = gridVisibility;
json[QLatin1String("positionStringVisibility")] = positionStringVisibility;
json[QLatin1String("timeStringVisibility")] = timeStringVisibility;
json[QLatin1String("exerciseTimeStringVisibility")] = exerciseTimeStringVisibility; // [GUEZE-2921] add missing exerciseTimeString
json[QLatin1String("compassVisibility")] = compassVisibility;
json[QLatin1String("overviewMapVisibility")] = overviewMapVisibility;
return json;
}
//
// JumpPointData
//
JumpPointData JumpPointData::read(const QJsonObject &json)
{
JumpPointData jpd;
jpd.key = json[QLatin1String("key")].toString();
if (json.contains(QLatin1String("originGeoLon")) && json.contains(QLatin1String("originGeoLat")))
{
jpd.originGeo.setX(json[QLatin1String("originGeoLon")].toDouble());
jpd.originGeo.setY(json[QLatin1String("originGeoLat")].toDouble());
jpd.originGeo.setZ(json[QLatin1String("originGeoZ")].toDouble());
}
jpd.mapScale = json[QLatin1String("mapScale")].toDouble(jpd.mapScale);
return jpd;
}
QJsonObject JumpPointData::toJsonObject() const
{
return {
{QLatin1String("key"), key},
{QLatin1String("originGeoLon"), originGeo.x()},
{QLatin1String("originGeoLat"), originGeo.y()},
{QLatin1String("originGeoZ"), originGeo.z()},
{QLatin1String("mapScale"), mapScale}
};
}
} // namespace SituationMap
+110
View File
@@ -0,0 +1,110 @@
/**
* @RDE_HEADER@
* Operator Map Settings
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <Map/camera.h>
#include <Map/layer_parameter.h>
#include <Map/viewpoint2D.h>
#include <situation_map_export.h>
// Qt
#include <QList>
#include <QPair>
#include <QString>
#include <QVector>
class QJsonObject;
//----------------------------------------------------------------------------
namespace SituationMap
{
//----------------------------------------------------------------------------
struct MapWidgetSettings
{
bool gridVisibility = true;
bool positionStringVisibility = true;
bool timeStringVisibility = false;
bool exerciseTimeStringVisibility = false;
bool compassVisibility = true;
bool overviewMapVisibility = false;
static MapWidgetSettings read(const QJsonObject &json);
QJsonObject toJsonObject() const;
};
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
struct JumpPointData
{
QString key;
Point3D originGeo;
double mapScale = 0.0;
static JumpPointData read(const QJsonObject &json);
QJsonObject toJsonObject() const;
};
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
struct SITUATIONMAP_EXPORT OperatorMapSettings
{
Mode mode = Mode::Undefined;
Viewpoint2D viewpoint;
Camera camera;
NavigationConstraint navigationConstraint = NavigationConstraint::Undefined; // navigateBelowGround, since V100.5.0
float baseSurfaceOpacity = 100.0; // since V100.5.0
QVector<QPair<QString, LayerParameter>> orderedLayers;
QList<int> orderedOverlays; // QList due to the usage of keys()
MapWidgetSettings mapWidgetSettings;
double symbolScale = 1.0;
// int symbolOpacity = 100; // of all? of participants? of ???
QVector<JumpPointData> jumpPoints;
// ToDo: add bool buildingOwnership
QJsonObject toJsonObject() const;
bool fromJsonObject(const QJsonObject &json);
QByteArray toJson() const;
bool fromJson(const QByteArray &json);
bool isEmpty() const;
// convenience:
bool getLayerParameter(const QString &layername, LayerParameter& layerParameterOut) const;
bool updateLayerParameter(const QString &layername, const LayerParameter& layerParameter);
};
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
} // namespace SituationMap
+95
View File
@@ -0,0 +1,95 @@
/**
* @RDE_HEADER@
* Interface of AbstractMapObject
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_export.h"
// Qt
#include <QMap>
//----------------------------------------------------------------------------
namespace SituationMap
{
class Map;
/**
* @brief The OverlayHandler class handles overlays produced by the PlanEditor.
*/
class SITUATIONMAP_EXPORT OverlayHandler
{
public:
OverlayHandler() = default; ///< Contructor
virtual ~OverlayHandler() = default; ///< Destructor
static OverlayHandler *create(Map *map);
/*! \name Adding / Updating */
//@{
/**
* @brief Add an Overlay.
* @param key to associate the overlay with. Should not be less than 0.
* @param name to use (displayname)
* @param overlayContent to insert.
* @param isSnapshot to ensure correct layer order.
* @return True on success, otherwise false.
*/
virtual bool setOverlay(int key, const QString &name, const QByteArray &overlayContent, bool isSnapshot = false) = 0;
virtual QByteArray content(int key) const = 0;
virtual double minScale(int key) const = 0;
virtual bool setMinScale(int key, double minScale) = 0;
virtual double maxScale(int key) const = 0;
virtual bool setMaxScale(int key, double maxScale) = 0;
virtual double opacity(int key) const = 0;
virtual bool setOpacity(int key, double opacity) = 0;
//@}
virtual bool reorderOverlays(const QVector<int> &orderOfIds) = 0;
/*! \name Visibility */
//@{
virtual bool setOverlayVisibility(int key, bool visibility) = 0;
virtual bool overlayVisibility(int key) const = 0;
//@}
/*! \name Removing */
//@{
/**
* @brief Remove an Overlay
* @param key to be remove()
* @return True on success, otherwise false.
*/
virtual bool removeOverlay(int key) = 0;
virtual int removeAllOverlays() = 0;
//@}
/*! \name Retrieving */
//@{
virtual int overlayCount() const = 0;
virtual QList<int> overlays() const = 0;
virtual bool containsOverlay(int key) const = 0;
// QString getOverlay(int key);
//@}
};
} // namespace SituationMap
+61
View File
@@ -0,0 +1,61 @@
/**
* @RDE_HEADER@
* Interface for OverviewMapHandler
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "layer_factory.h"
#include "situation_map_types.h"
#include "operator_map_settings.h"
#include <Common/referenced.h>
#include <Common/ref_pointer.h>
#include <situation_map_export.h>
// Qt
// forward
//----------------------------------------------------------------------------
namespace SituationMap
{
// forward
class Map;
/**
* @brief The OverviewMapHandler class is able to create an OverviewMap.
* By now, it´s possible to create an OverviewMap onto the (Main)Map.
*/
class SITUATIONMAP_EXPORT OverviewMapHandler
{
public:
/*! \name Construction, Destruction */
//@{
OverviewMapHandler() = default; ///< Contructor
virtual ~OverviewMapHandler() = default; ///< Destructor
virtual void createBuiltInOverviewMap() = 0;
virtual void removeBuiltInOverviewMap() = 0;
virtual QWidget *builtInOverviewMapWidget() = 0;
virtual void removeAll() = 0;
//@}
};
} // namespace SituationMap
+211
View File
@@ -0,0 +1,211 @@
/**
* @RDE_HEADER@
* Interface-Implementation of Map
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "party_id_to_color_functor.h"
//Qt
#include <qapplication.h>
#include <qstyle.h>
namespace SituationMap
{
PartyIdToColorFunctor::PartyIdToColorFunctor()
: QObject()
{
int lightColorAlpha = 125;
QColor col, lightColor;
col = lightColor = Qt::cyan; lightColor.setAlpha(lightColorAlpha);
m_colorMap.insert(1, PartyData(QStringLiteral("Party-Cyan"), AdvancedSymbology::Role::Unknown, col, lightColor));
// col = lightColor = Qt::blue; lightColor.setAlpha(lightColorAlpha);
// m_colorMap.insert(2, PartyData(QStringLiteral("Party-Blue"), AdvancedSymbology::Role::Friend, col, lightColor));
// col = lightColor = Qt::green; lightColor.setAlpha(lightColorAlpha);
// m_colorMap.insert(3, PartyData(QStringLiteral("Party-Green"), AdvancedSymbology::Role::Unknown, col, lightColor));
// col = lightColor = Qt::red; lightColor.setAlpha(lightColorAlpha);
// m_colorMap.insert(4, PartyData(QStringLiteral("Party-Red"), AdvancedSymbology::Role::HostileFaker, col, lightColor));
// col = lightColor = Qt::yellow; lightColor.setAlpha(lightColorAlpha);
// m_colorMap.insert(5, PartyData(QStringLiteral("Party-Yellow"), AdvancedSymbology::Role::Unknown, col, lightColor));
// as fallback:
m_invalidPartyData.m_name = QLatin1Char('-');
static const int pmSize = QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);
QPixmap pm(pmSize, pmSize);
pm.fill(Qt::transparent);
m_invalidPartyData.m_icon = pm;
}
void PartyIdToColorFunctor::clear()
{
m_colorMap.clear();
emit partyChanged(-1);
}
void PartyIdToColorFunctor::setParty(int partyId, const PartyData &partyData)
{
auto &val = m_colorMap[partyId];
if (val == partyData)
return;
val = partyData;
static const int pmSize = QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);
QPixmap pm(pmSize, pmSize);
pm.fill(partyData.m_color);
val.m_icon = pm;
emit partyChanged(partyId);
}
void PartyIdToColorFunctor::removeParty(int partyId)
{
if (!m_colorMap.contains(partyId))
return;
m_colorMap.remove(partyId);
emit partyChanged(partyId);
}
void PartyIdToColorFunctor::setColorMap(const ColorMap &colorMap)
{
m_colorMap = colorMap;
emit partyChanged(-1);
}
PartyIdToColorFunctor::ColorMap PartyIdToColorFunctor::colorMap() const
{
return m_colorMap;
}
QVector<int> PartyIdToColorFunctor::partyIds() const
{
QVector<int> ret;
ret.reserve(m_colorMap.size());
for (auto it = m_colorMap.begin(); it != m_colorMap.end(); ++it)
ret += it.key();
return ret;
}
QVector<QColor> PartyIdToColorFunctor::partyColors(bool useLightColor) const
{
QVector<QColor> colVector;
colVector.reserve(m_colorMap.size());
for (const auto &item : m_colorMap)
colVector.append(useLightColor ? item.m_lightColor : item.m_color);
return colVector;
}
PartyIdToColorFunctor::PartyData PartyIdToColorFunctor::partyId(int partyId) const
{
auto it = m_colorMap.find(partyId);
if (it == m_colorMap.end())
return m_invalidPartyData; // used at SituationMap::MapObjectModel::data (fill ComboBoxData/LtsWidgets::ComboboxFilterContent)
return it.value();
}
QString PartyIdToColorFunctor::partyIdToName(int partyId) const
{
auto it = m_colorMap.find(partyId);
if (it == m_colorMap.end())
return QString();
const PartyData &pData = it.value();
return pData.m_name;
}
AdvancedSymbology::Role PartyIdToColorFunctor::partyIdToRole(int partyId, bool identityAssumed) const
{
auto it = m_colorMap.find(partyId);
if (it == m_colorMap.end())
return AdvancedSymbology::Role::Unknown;
const PartyData &pData = it.value();
if (identityAssumed)
{
switch (pData.m_role)
{
case AdvancedSymbology::Role::Unknown:
return AdvancedSymbology::Role::Pending;
case AdvancedSymbology::Role::Friend:
return AdvancedSymbology::Role::AssumedFriend;
case AdvancedSymbology::Role::HostileFaker:
return AdvancedSymbology::Role::SuspectJoker;
default:
{
// empty
}
} //switch
}
return pData.m_role;
}
QColor PartyIdToColorFunctor::partyIdToColor(int partyId, bool useLightColor) const
{
auto it = m_colorMap.find(partyId);
if (it == m_colorMap.end())
return Qt::cyan;
const PartyData &pData = it.value();
return useLightColor ? pData.m_lightColor : pData.m_color;
}
FillPattern PartyIdToColorFunctor::aesStateToPattern(AesEffectState aesState) const
{
switch (aesState)
{
case AesEffectState::Unknown:
case AesEffectState::Removed:
case AesEffectState::Expired:
case AesEffectState::Error:
return FillPattern::Null;
case AesEffectState::Paused:
case AesEffectState::Created:
return FillPattern::Vertical; // |
case AesEffectState::Prepared:
return FillPattern::BackwardDiagonal; // / BackwardDiagonal
case AesEffectState::Activated:
return FillPattern::Cross; // + Cross == Horizontal & Vertical
} // switch
return FillPattern::Null;
}
QString PartyIdToColorFunctor::PartyData::toString() const
{
return QStringLiteral(" name=%1 - role=%2 - m_color[argb]=%3 - lightColor[argb]=%4")
.arg(m_name, 20)
.arg(AdvancedSymbology::toString(m_role), 15)
.arg(m_color.name(QColor::HexArgb), 10)
.arg(m_lightColor.name(QColor::HexArgb), 10);
}
void PartyIdToColorFunctor::toString(std::stringstream &stream) const
{
QMapIterator<int, PartyData> it(m_colorMap);
while(it.hasNext())
{
it.next();
stream << " partyId=" << QStringLiteral("%1").arg(it.key(), 2) << " -> " << it.value().toString() << std::endl;
}
}
} // namespace SituationMap
+143
View File
@@ -0,0 +1,143 @@
/**
* @RDE_HEADER@
* Interface-Implementation of Map
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "abstract_effect_simulation.h"
#include <Symbology/sidc_definitions.h>
// ESRI
// Qt
#include <QColor>
#include <QIcon>
#include <QTimer>
namespace SituationMap
{
/**
* @brief The PartyIdToColorFunctor is a base class mapping from partyId
* of the Simulation World to a specific color.
*/
class SITUATIONMAP_EXPORT PartyIdToColorFunctor : public QObject
{
Q_OBJECT
public:
struct PartyData
{
explicit PartyData(const QString &name = QString(),
const AdvancedSymbology::Role role = AdvancedSymbology::Role::Unknown,
const QColor &color = QColor(),
const QColor &lightColor = QColor())
: m_name(name),
m_role(role),
m_color(color),
m_lightColor(lightColor)
{}
PartyData(const QColor &color, const QColor &lightColor)
: m_role(AdvancedSymbology::Role::Unknown),
m_color(color),
m_lightColor(lightColor)
{}
bool operator==(const PartyData &o) const
{
return m_name == o.m_name &&
m_role == o.m_role &&
m_color == o.m_color &&
m_lightColor == o.m_lightColor;
}
QString toString() const;
QString m_name;
AdvancedSymbology::Role m_role; // aka identity / affiliation
QColor m_color;
QColor m_lightColor;
QIcon m_icon;
};
using ColorMap = QMap<int, PartyData>;
public:
/*! \name Construction, Destruction */
//@{
PartyIdToColorFunctor();
virtual ~PartyIdToColorFunctor() = default;
//@}
/*! \name Initialization, Administration*/
//@{
virtual void clear();
virtual void setParty(int partyId, const PartyData &partyData);
virtual void removeParty(int partyId);
virtual void setColorMap(const ColorMap &colorMap);
virtual ColorMap colorMap() const;
virtual QVector<int> partyIds() const;
virtual QVector<QColor> partyColors(bool useLightColor = false) const;
//@}
/*! \name Get structure */
//@{
virtual PartyData partyId(int partyId) const;
//@}
/*! \name Determine Name */
//@{
virtual QString partyIdToName(int partyId) const;
//@}
/*! \name Determine Role (aka identity / affiliation) */
//@{
virtual AdvancedSymbology::Role partyIdToRole(int partyId, bool identityAssumed = false) const;
//@}
/*! \name Determine Color */
//@{
virtual QColor partyIdToColor(int partyId, bool useLightColor = false) const;
//@}
/*! \name Determine fillPattern */
//@{
virtual FillPattern aesStateToPattern(AesEffectState aesState) const;
//@}
void toString(std::stringstream &stream) const;
signals:
void partyChanged(int partyId); ///< to update all (-1) or only map objects with given party id
private:
ColorMap m_colorMap;
PartyData m_invalidPartyData;
};
//------------------------------------------------------------------------------
} // namespace SituationMap
+158
View File
@@ -0,0 +1,158 @@
/**
* @RDE_HEADER@
* Interface of PixelBasedTextBoxHandler
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <GeometryModel/geometry_pixelTextBox.h>
#include <situation_map_export.h>
// Qt
#include <QObject>
#include <QString>
#include <QPointF>
class QTextEdit;
//----------------------------------------------------------------------------
namespace SituationMap
{
static const char *const PBTB_ID_PROPERTY_NAME = "PBTB_ID_PROPERTY";
//
// PBTB_ID - PixelBasedTextBox_Identifier
//
class SITUATIONMAP_EXPORT PBTB_ID
{
public:
PBTB_ID() = default;
~PBTB_ID() = default;
explicit PBTB_ID(int parentId, long uid = -1)
: m_parentId(parentId), m_uid(uid)
{}
void init()
{
m_parentId = -1; // >0 -> planFileId
m_uid = -1;
}
static long getNextId()
{
static long s_uid{0};
++s_uid;
return s_uid;
}
bool isValid() const
{
return (m_uid > 0);
}
QString toString() const
{
return QString(QStringLiteral("'parentId_%1:uid_%2'")).arg(m_parentId).arg(m_uid);
}
static PBTB_ID fromString(QString str)
{
str.remove(QStringLiteral("'"));
const QStringList &sl = str.split(QStringLiteral(":"));
if (sl.size() != 2)
return {};
PBTB_ID idRet;
{
QString temp = sl.first();
QStringList sl2 = temp.split(QStringLiteral("_"));
if (sl2.size() == 2)
idRet.m_parentId = sl2.last().toInt();
}
{
QString temp = sl.last();
QStringList sl3 = temp.split(QStringLiteral("_"));
if (sl3.size() == 2)
idRet.m_uid = sl3.last().toLong();
}
return idRet;
}
bool operator==(const PBTB_ID &o) const
{
return m_parentId == o.m_parentId && m_uid == o.m_uid;
}
bool operator!=(const PBTB_ID &o) const
{
return !operator==(o);
}
bool operator<(const PBTB_ID &o) const
{
if (m_parentId != o.m_parentId)
return m_parentId < o.m_parentId;
return m_uid < o.m_uid;
}
int m_parentId{-1} ; // >0 -> planFileId
long m_uid{-1};
};
/**
* @brief The PixelBasedTextBoxHandler class handles the create, modify and remove of pixel-based textboxes on the QGraphicsScene on top ot the ESRI layer.
*/
class SITUATIONMAP_EXPORT PixelBasedTextBoxHandler : public QObject
{
Q_OBJECT
using BaseClass = QObject;
public:
PixelBasedTextBoxHandler() = default; ///< Contructor
virtual ~PixelBasedTextBoxHandler() = default; ///< Destructor
PixelBasedTextBoxHandler(const PixelBasedTextBoxHandler &other) = delete;
PixelBasedTextBoxHandler &operator=(PixelBasedTextBoxHandler &other) = delete;
virtual QTextEdit *createTextBox(PBTB_ID &pbtbIdRef, const PixelTextBoxData &ptbd, bool enableGeometryModifications = true) = 0;
virtual QTextEdit *updateTextBox(const PBTB_ID &pbtbId, const PixelTextBoxData &ptbd) = 0;
virtual QTextEdit *getTextBox(const PBTB_ID &pbtbId) = 0;
virtual QVector<PBTB_ID> getAllIdsOfParent(const PBTB_ID &pbtbId) const = 0;
virtual PixelTextBoxData getPixelTextBoxData(const PBTB_ID &pbtbId) const = 0;
virtual void removeSelection() = 0;
virtual bool setSelected(const PBTB_ID &pbtbId) = 0;
virtual bool removeTextBox(const PBTB_ID &pbtbId) = 0;
virtual bool removeAllTextBoxesOfParent(int parentId) = 0;
Q_SIGNALS:
void pixelBasedTextBoxDoubleClickEvent(SituationMap::PBTB_ID pbtbId);
void pixelBasedTextBoxGeometryChanged(SituationMap::PBTB_ID pbtbId);
void pixelBasedTextBoxRemoveRequestedEvent(SituationMap::PBTB_ID pbtbId);
};
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &, const PBTB_ID &);
} // namespace SituationMap
+19
View File
@@ -0,0 +1,19 @@
/**
* @RDE_HEADER@
* point3D
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
#include <LtsUtilsCore/qpoint3d.h>
//----------------------------------------------------------------------------
namespace SituationMap
{
using Point3D = LtsUtils::QPoint3D; ///< x = lon ; y = lat , z = elevation/altitude in meters
} // namespace SituationMap
+158
View File
@@ -0,0 +1,158 @@
/**
**
** @RDE_HEADER@
** Definition of transient map objects for use while rubberbanding is done
** $Id$
** $HeadURL$
** $Author$
**
** -----------------------------------------------------------------------------------------------
**
** Hardware-Environment: Intel-PC
** Software-Environment: Windows 7, Qt 5.4. ArcGIS 10.2.5
**
** Language ........: C++ 11
**
** -----------------------------------------------------------------------------------------------
**
** Author ...........: Jörg Turla, SPD G, Tel. 3132
**
** -----------------------------------------------------------------------------------------------
**
** Notes .........:
**
** 29.09.2015, JT : First edition for use with Qt5
**
** -----------------------------------------------------------------------------------------------
*/
#pragma once
#include "abstract_map_object.h"
#include "line_style.h"
#include "fill_style.h"
#include <QString>
namespace SituationMap
{
/**
@class SIDC_Symbol SIDC_Symbol.h
The class \c SIDC_Symbol creates a tactical symbol due a sidc code. In distinction to the class
\c Participant the \c SIDC_Symbol is not limited to point features. The sidc implies the kind of
geometry (point, polyline or polygon) of the symbol feature, the number of positions to construct the
symbol and the way of interpreting the positions.
\see Participant
*/
class SITUATIONMAP_EXPORT SidcSymbol : public virtual AbstractMapObject
{
public:
/**
@name Construction & Destruction
@{
*/
SidcSymbol() : AbstractMapObject() {} // Workaround VS2015 bug "= default;" --> gives a crash here
virtual ~SidcSymbol() = default;
SidcSymbol(const SidcSymbol &other) = delete;
SidcSymbol &operator=(SidcSymbol &other) = delete;
/** @} */
/** \name Positions
* Set positions of the object. Could be either a single and multi point feature.
*/
//@{
virtual PositionCont positions() const = 0;
virtual void setPositions(const PositionCont &posCont) = 0;
//@}
/** \name LineStyle
* See AbstractMapObject for details.
*/
//@{
virtual LineStyle lineStyle() const = 0;
virtual LineStyle &rLineStyle() = 0;
virtual void setLineStyle(const LineStyle &lineStyle) = 0;
//@}
/** \name FillStyle
* See AbstractMapObject for details.
*/
//@{
virtual FillStyle fillStyle() const = 0;
virtual FillStyle &rFillStyle() = 0;
virtual void setFillStyle(const FillStyle &FillStyle) = 0;
//@}
/**
* @name sidc
* Returns the code of the symbol
*/
virtual const QString &sidc() const = 0;
/**
* @name setSidc
* Defines the code of the symbol. Alternatively the \c AbstractObject::symbol and \c AbstractObject::setSymbol functions can be used.
* @see defineSymbol, AbstractObject::symbol, AbstractObject::setSymbol, SymbolData
*/
virtual void setSidc(const QString &) = 0;
/**
* @name color
* Provides the color of the symbol if set with \c setColor. Default is QColor(0,0,0,0)
* @attention In current release using user defined colors for symbols are not implemented.
* @see setColor
*/
virtual const QColor &color() const = 0;
/**
* @name setColor
* @brief Overrides the color setting of the symbol.
* Generally the color setting is defined by sidc. With \c setColor this definition will be overwritten. Valid color values
* have an alpha value greater than 0. Otherwise the sidc definition will be used. The default is QColor(0,0,0,0)
* @attention In current release using user defined colors for symbols are not implemented.
* @see color
*/
virtual void setColor(const QColor &color = QColor(0, 0, 0, 0)) = 0;
/**
* @name attributeMap
* Returns the attribute map of the symbol.
*/
virtual const QMap<QString, QVariant> &attributeMap() const = 0;
/**
* @name setAttributeMap
* Defines the attribute map of the symbol to support additional drawing attributes. An attribute is a pair of name and value.
* Attributes are used to specify additional properties like width of a corridor or radius of a circle.
* Alternatively the \c AbstractObject::symbol and \c AbstractObject::setSymbol functions can be used.
* @see defineSymbol, AbstractObject::symbol, AbstractObject::setSymbol, SymbolData
*/
virtual void setAttributeMap(const QMap<QString, QVariant> &attrMap) = 0;
/**
* @name defineSymbol
* Convenience function to define a symbol
* @attention In current release using user defined colors for symbols are not implemented. The color parameter is for further use only.
* @see setSidc, setAttributeMap, setColor, AbstractObject::symbol, AbstractObject::setSymbol, SymbolData
*/
virtual void defineSymbol(const QString &sidc,
const PositionCont &posCont,
const QMap<QString, QVariant> &attrMap,
const QColor &color = QColor(0, 0, 0, 0)) = 0;
}; /* SidcSymbol */
} // namespace SituationMap
+109
View File
@@ -0,0 +1,109 @@
/*
** -----------------------------------------------------------------------------------------------
**
** @RDE_HEADER@
** Implementation of base class for 2D rubberbands
** $Id$
** $HeadURL$
** $Author$
**
** -----------------------------------------------------------------------------------------------
**
** Hardware-Environment: Intel-PC
** Software-Environment: Windows 7, Qt 5.x. ArcGISRuntimeQt 100.2
**
** Language ........: C++ 11
**
** -----------------------------------------------------------------------------------------------
**
** Autor ...........: Nikolaus Hanekamp, SEDG, Tel. 2906
** Jörg Turla, SPDG, Tel. 3132
**
** -----------------------------------------------------------------------------------------------
**
** Notices .........:
**
** 01.02.2005, NH : Urversion
** 15.05.2018, JT : adapting GeISiR source to SituationMap
**
** -----------------------------------------------------------------------------------------------
*/
#pragma once
#include <Map/abstract_map_object.h>
namespace SituationMap
{
class ElevationMap; // Forward declaration
class SITUATIONMAP_EXPORT SightFan: public virtual AbstractMapObject
{
public:
SightFan(const SightFan &) = delete; // copy constructor
SightFan & operator = (const SightFan &) = delete; // assignment operator
SightFan() : AbstractMapObject() {;}
virtual ~SightFan() = default;
virtual void initFan( const QPointF &center
, double centHat
, double objHat
, double radius
, double innerRadius
, double startAngle
, double dAngle
, unsigned int nrFans
, double alpha ) = 0;
virtual void initFan( const Point3D &center
, double objHat
, double radius
, double innerRadius
, double startAngle
, double dAngle
, unsigned int nrFans
, double alpha ) = 0;
virtual void setCenter(const QPointF &center) = 0;
virtual void setCenter(const Point3D &center) = 0;
virtual void setCenter(const QPointF &center, double centerHat ) = 0;
virtual void setCenterHat(double centerHat) = 0;
virtual void setObjectHat(double objHat) = 0;
virtual void setRadius(double radius) = 0;
virtual void setInnerRadius(double radius) = 0;
virtual void setStartAngle(double startAngle) = 0;
virtual void setdeltaAngle(double dAngle) = 0;
virtual void setNoOfFans(double noFans) = 0;
virtual void setAlpha(double alpha) = 0;
virtual QPointF center() const = 0;
virtual double centerHat() const = 0;
virtual double objectHat() const = 0;
virtual double innerRadius() const = 0;
virtual double radius() const = 0;
virtual double startAngle() const = 0;
virtual double dAngle() const = 0;
virtual double alpha() const = 0;
virtual unsigned int noOfFans() const = 0;
virtual void move(const QPointF &center) = 0;
virtual void move(const QPointF &center, double centHat, double objHat) = 0;
virtual void show() = 0;
virtual void setFanColor(const QColor & visible, const QColor &invisible, const QColor &undefined) = 0;
virtual void setFanColorMark(float colMult) = 0;
}; // SightFan
} // SituationMap
+163
View File
@@ -0,0 +1,163 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000004959,none,7RC63PJPXJPH003AD234" ;# Bayanat Helpdesk, 21.07.2019
1\extensionString = "Exten1"
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "MIL2525D" ;# None | MIL2525D | MIL2525C | APP6B
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
#For factory
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AlHamra_Aerial_1m00_32639/MapServer#-1:125" ;# Since 2019-04-05
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AlHamra_Aerial_0m21_PreDelivery_32639/MapServer#-1:125" ;# Since 2019-05-08
#For on-site
#1\url = "http://EXCGEO02/arcgis/rest/services/AHTC/2019_06_17_AHTC_CTC_Topo_2016_32639/MapServer#-1:125" ;# Since 2019-06
#2\url = "http://EXCGEO02/arcgis/rest/services/AHTC/2019_06_17_AHTC_CTC_Aerial_2016_32639/MapServer#-1:125" ;# Since 2019-06
#3\url = "http://EXCGEO02/arcgis/rest/services/AHTC/AlHamra_Aerial_0m21_PreDelivery_32639/MapServer#-1:125" ;# Since 2019-06
#TileCacheFolder
1\url = "file:TileCacheFolder/AHTC/AHTC_2019_06_17_AHTC_CTC_Topo_2016_32639/AHTC_CTC_Topogaphic#-1:125"
2\url = "file:TileCacheFolder/AHTC/AHTC_2019_06_17_AHTC_CTC_Aerial_2016_32639/AHTC_CTC_Aerial#-1:125"
3\url = "file:TileCacheFolder/AHTC/AHTC_AlHamra_Aerial_0m21_PreDelivery_32639/Al Hamra Aerial 0m21#-1:125"
#For on-site - windows
# todo
size=3
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk')
# : For debugging only
[sceneUrls]
#For factory
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AlHamra_Aerial_1m00_WebMerc/MapServer#-1:25" ;# Since 2019-04-05
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AlHamra_Aerial_0m21_PreDelivery_WebMerc/MapServer#-1:25" ;# Since 2019-05-08
#For on-site
#1\url = "http://EXCGEO02/arcgis/rest/services/AHTC/2019_06_17_AHTC_CTC_Topo_2016_WebMerc/MapServer#-1:125" ;# Since 2019-06
#2\url = "http://EXCGEO02/arcgis/rest/services/AHTC/2019_06_17_AHTC_CTC_Aerial_2016_WebMerc/MapServer#-1:125" ;# Since 2019-06
#3\url = "http://EXCGEO02/arcgis/rest/services/AHTC/AlHamra_Aerial_0m21_PreDelivery_WebMerc/MapServer#-1:125" ;# Since 2019-06
#For on-site - windows
# todo
#TileCacheFolder
1\url = "file:TileCacheFolder/AHTC/AHTC_2019_06_17_AHTC_CTC_Topo_2016_WebMerc/AHTC_CTC_Topogaphic#-1:125"
2\url = "file:TileCacheFolder/AHTC/AHTC_2019_06_17_AHTC_CTC_Aerial_2016_WebMerc/AHTC_CTC_Aerial#-1:125"
3\url = "file:TileCacheFolder/AHTC/AHTC_AlHamra_Aerial_0m21_PreDelivery_WebMerc/Al Hamra Aerial 0m21#-1:125"
4\url = "file:slpk/2022-05-23_AHTC-Bridges_ret_geotifcp-alex.tif#-1:125" ;# according SPD-slpk with bridges
size=4
[sceneObjectUrls]
# 1\url = "URL[#<altitudeOffset>]"
#Example: >>> 1\url = "file:AHTC_LOW.slpk#0.3" <<<
1\url = "file:AHTC_LOW.slpk#0.5"
size=1
[elevationUrls]
# LZW-Compression is ok for Esri-Scene & ElevationMap
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "file:alhamra-dtm-PreDelivery.tif" ;# preDelivery - 2019-05-28
1\url = "file:Elevation.tif" ;# BFE, ~30m
2\url = "file:AHTC_utm_dgm_surface_wgs84.tif" ;# Z&M, XY converted to WGS84 (ArcGIS Pro)
size=2
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative"
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Dynamic:Draped"
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "39RXG4400060000" ;# AHTC
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 30000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+129
View File
@@ -0,0 +1,129 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000004959,none,7RC63PJPXJPH003AD234" ;# Bayanat Helpdesk, 21.07.2019
1\extensionString = ""
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None | MIL2525D | MIL2525C | APP6B | APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
#For on-site - windows
1\url = "file:AHTC_2019_06_17_AHTC_CTC_Topo_2016_32639/AHTC_CTC_Topogaphic#-1:125"
1\name = "AHTC Topographic"
2\url ="file:AHTC_2019_06_17_AHTC_CTC_Aerial_2016_32639/AHTC_CTC_Aerial#-1:125"
2\name = "AHTC Aerial"
3\url = "file:AHTC_AlHamra_Aerial_0m21_PreDelivery_32639/Al Hamra Aerial 0m21#-1:125"
3\name = "AlHamra Aerial"
size=3
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk')
# : For debugging only
[sceneUrls]
#For on-site - windows
1\url = "file:AHTC_2019_06_17_AHTC_CTC_Topo_2016_WebMerc/AHTC_CTC_Topogaphic#-1:125"
1\name = "AHTC Topographic"
2\url = "file:AHTC_2019_06_17_AHTC_CTC_Aerial_2016_WebMerc/AHTC_CTC_Aerial#-1:125"
2\name = "AHTC Aerial"
3\url = "file:AHTC_AlHamra_Aerial_0m21_PreDelivery_WebMerc/Al Hamra Aerial 0m21#-1:125"
3\name = "AlHamra Aerial"
4\url = "file:2022-05-23_AHTC-Bridges_ret_geotifcp-alex.tif#-1:125" ;# according SPD-slpk with bridges
4\name = "AlHamra Aerial NoBridges"
size=4
[sceneObjectUrls]
# 1\url = "URL[#<altitudeOffset>]"
#Example: >>> 1\url = "file:AHTC_LOW.slpk#0.3" <<<
1\url = "file:AHTC_LOW.slpk#0.5"
size=1
[elevationUrls]
1\url = "file:Elevation.tif" ;# BFE, ~30m
2\url = "file:AHTC_utm_dgm_surface_wgs84.tif" ;# Z&M, XY converted to WGS84 (ArcGIS Pro)
size=2
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Dynamic:Draped"
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
#center = "32UMD9307078331" ;#QPointF(93070, 78331) -> BT56 - Bremen
center = "32UPD7671618433" ;#QPointF(76716, 18433) -> BT39 (Schulgebaeude2b) - Schnoeggersburg
center = "39RXG4344459777"
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 4000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+177
View File
@@ -0,0 +1,177 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000189203,none,FAYRMD17J18S6HAZ4078" ;# 14.03.19, Fr. Jonischkeit: Aus 25er Pack für RME, bis Febr; also für Demo etc.
1\extensionString = "Exten1"
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Norddeutschland/Norddeutschland_32632/MapServer#-1:125" ;# Since 2017-08-25
2\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/Hemelingen_TIF_32632/MapServer" ;# Since 2017-08-25
2\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenHemelingenAerialGeoAmt_32632/MapServer#-1:125" ;# Since 2017-12-12
3\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenWerkAerialDrone_32632/MapServer#-1:125" ;# Since 2017-12-12
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AHTC_32639/MapServer"
#1\url = "http://EXCGEO01:9090/geoserver/gwc/service/tms/1.0.0/workspace1:Norddeutschland_UTM@EPSG:32632@png"
#2\url = "http://EXCGEO01:6080/arcgis/rest/services/HemelingenRDE/MapServer"
#3\url = "http://excgeo01:9090/geoserver/gwc/service/tms/1.0.0/Salchau%3ASalchau_overview@EPSG%3A32632@png"
#4\url = "http://excgeo01:9090/geoserver/gwc/service/tms/1.0.0/Salchau%3ASalchau@EPSG%3A32632@png"
#3\url = "http://EXCGEO02/arcgis/rest/services/SampleWorldCities/MapServer" ;# 'SampleWorldCities' = EsriBuiltIn-Service (->ArcGISMapImageLayer)
### arcgisonline
#1\url = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer" ;# == Basemap::topographic
#2\url = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"
#3\url = "http://server.arcgisonline.com/arcgis/rest/services/Ocean_Basemap/MapServer"
1\url = "file:TilePackage/Bremen/Norddeutschland_osm_32632.tpk#-1:125"
size=1
# Consulting:
# http://192.168.133.88:6080/arcgis/rest/services/Norddeutschland_Osm/MapServer
# ^^
# http://192.168.133.90:6080/arcgis/rest/services/BremenGeoTiffUTM/MapServer
#
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/workspace1:Norddeutschland_UTM@EPSG:32632@png
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/Bremen:Topo_Bremen@EPSG:32632@png
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/Bremen:Aerial_Hemelingen@EPSG:32632@png
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/Hemelingen_TIF_WebMerc/MapServer"
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Norddeutschland/Norddeutschland_WebMerc/MapServer#0:125" ;# Since 2017-08-25
2\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/Hemelingen_TIF_WebMerc/MapServer#0:125" ;# Since 2017-08-25
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AHTC_WebMerc_2/MapServer"
#1\url = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"
#1\url = "https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer" ;# == Basemap::topographic
1\url = "file:TilePackage/Bremen/Norddeutschland_osm_WebMerc17.tpk#0:125"
size=1
[sceneObjectUrls]
# 1\url = "URL[#<altitudeOffset>]"
#Example: >>> 1\url = "file:AHTC_LOW.slpk#0.3" <<<
#Brest
#1\url = "http://scene.arcgis.com/arcgis/rest/services/Hosted/Buildings_Brest/SceneServer/layers/0" ;# Brest/France
#1\url = "http://scene.arcgis.com/arcgis/rest/services/Hosted/Buildings_Brest/SceneServer/layers" ;# Brest/France
#1\url = "http://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/Buildings_Brest/SceneServer/layers/0" ;# Brest/France from Luke, no textures?
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Hosted/BT_56_11/SceneServer"
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Hosted/BT56_rev576/SceneServer" ;# Since 2017-08-25
1\url = "file:BT_56_UTM_EPSG_25832.slpk"
1\url = "file:GUEZ_EPSG3857.slpk" ;# Since 2019-03-26
size=1
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:srtm_38_02.tif" ;# srtm_38_02.tif -> Bremen, 50m
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Draped" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget), draped for fillPattern
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Static:Draped" ;# switch to Static (NLDEVCTRL-692 'Beheben des Speicher(-leck) Problems')
7\operationalLayer = "AESCentral:Dynamic:Draped" ;# 3D-AreaEffectSimulation, draped, SubLayer 'GraphicsLayer_3D_Absolute' is absolute
8\operationalLayer = "Participants:Dynamic:Relative"
9\operationalLayer = "Participants_1:Dynamic:Relative"
10\operationalLayer = "Participants_2:Dynamic:Relative"
11\operationalLayer = "Participants_3:Dynamic:Relative"
12\operationalLayer = "Participants_4:Dynamic:Relative"
13\operationalLayer = "Participants_5:Dynamic:Relative"
size=13
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "32UMD9307078331" ;#QPointF(93070, 78331) -> BT56 - Bremen
#center = "32UMD9275080525" ;#QPointF(92750, 80525) -> Rennplatz - Bremen
#center = "39RXG4400060000" ;# AHTC
#center = "30UUU8935659700" ;# 30UUU9100060500 -> Brest, Chateau
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 90000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
@@ -0,0 +1,155 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000189203,none,FAYRMD17J18S6HAZ4078" ;# 14.03.19, Fr. Jonischkeit: Aus 25er Pack für RME, bis Febr; also für Demo etc.
1\extensionString = "Exten1"
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "file:TilePackage/Finland/2025-03-04_Finland_Pohjankagas_Topo_1m_32634.tpk#-1:125"
2\url = "file:TilePackage/Finland/2025-03-04_Finland_Pohjankagas_Aerial_0m5_32634.tpk#-1:125"
size=2
# Consulting:
# http://192.168.133.88:6080/arcgis/rest/services/Norddeutschland_Osm/MapServer
# ^^
# http://192.168.133.90:6080/arcgis/rest/services/BremenGeoTiffUTM/MapServer
#
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/workspace1:Norddeutschland_UTM@EPSG:32632@png
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/Bremen:Topo_Bremen@EPSG:32632@png
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/Bremen:Aerial_Hemelingen@EPSG:32632@png
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/Hemelingen_TIF_WebMerc/MapServer"
1\url = "file:TilePackage/Finland/2025-03-04_Finland_Pohjankagas_Topo_1m_WebMerc.tpk#-1:125"
2\url = "file:TilePackage/Finland/2025-03-04_Finland_Pohjankagas_Aerial_0m5_WebMerc.tpk#-1:125"
size=2
[sceneObjectUrls]
# 1\url = "URL[#<altitudeOffset>]"
#Example: >>> 1\url = "file:AHTC_LOW.slpk#0.3" <<<
#Brest
#1\url = "http://scene.arcgis.com/arcgis/rest/services/Hosted/Buildings_Brest/SceneServer/layers/0" ;# Brest/France
#1\url = "http://scene.arcgis.com/arcgis/rest/services/Hosted/Buildings_Brest/SceneServer/layers" ;# Brest/France
#1\url = "http://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/Buildings_Brest/SceneServer/layers/0" ;# Brest/France from Luke, no textures?
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Hosted/BT_56_11/SceneServer"
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Hosted/BT56_rev576/SceneServer" ;# Since 2017-08-25
#1\url = "file:BT_56_UTM_EPSG_25832.slpk"
#1\url = "file:GUEZ_EPSG3857.slpk" ;# Since 2019-03-26
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:2025-03-06_Finland-Pohjankagas_elevation.tif"
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Draped" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget), draped for fillPattern
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Static:Draped" ;# switch to Static (NLDEVCTRL-692 'Beheben des Speicher(-leck) Problems')
7\operationalLayer = "AESCentral:Dynamic:Draped" ;# 3D-AreaEffectSimulation, draped, SubLayer 'GraphicsLayer_3D_Absolute' is absolute
8\operationalLayer = "Participants:Dynamic:Relative"
9\operationalLayer = "Participants_1:Dynamic:Relative"
10\operationalLayer = "Participants_2:Dynamic:Relative"
11\operationalLayer = "Participants_3:Dynamic:Relative"
12\operationalLayer = "Participants_4:Dynamic:Relative"
13\operationalLayer = "Participants_5:Dynamic:Relative"
size=13
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "32UMD9307078331" ;#QPointF(93070, 78331) -> BT56 - Bremen
center = "34VEP7780067500" ;#34 V EP 68500 55000 -> 2025 Finland Pohjankagas
#center = "32UMD9275080525" ;#QPointF(92750, 80525) -> Rennplatz - Bremen
#center = "39RXG4400060000" ;# AHTC
#center = "30UUU8935659700" ;# 30UUU9100060500 -> Brest, Chateau
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 90000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
@@ -0,0 +1,158 @@
# $Id: situation_map_finland_pohjankagas.ini 64630 2025-03-07 08:12:36Z thoden $
# $HeadURL: svn://slssvn/TDS/branches/product/devel/trunk/Lts/Viewer/SituationMap/Map/situation_map_finland_pohjankagas.ini $
# $Author: thoden $
[license]
licenseString = "runtimestandard,1000,rud000189203,none,FAYRMD17J18S6HAZ4078" ;# 14.03.19, Fr. Jonischkeit: Aus 25er Pack für RME, bis Febr; also für Demo etc.
1\extensionString = "Exten1"
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "file:TilePackage/Finland/2025-04-04_Finland_Pohjankagas_overview_BW_Aerial_2m_32634.tpk#-1:125"
2\url = "file:TilePackage/Finland/2025-04-04_Finland_Pohjankagas_BW_Topo_1m_32634.tpk#-1:125"
3\url = "file:TilePackage/Finland/2025-04-04_Finland_Pohjankagas_BW_Aerial_1m_32634.tpk#-1:125"
size=3
# Consulting:
# http://192.168.133.88:6080/arcgis/rest/services/Norddeutschland_Osm/MapServer
# ^^
# http://192.168.133.90:6080/arcgis/rest/services/BremenGeoTiffUTM/MapServer
#
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/workspace1:Norddeutschland_UTM@EPSG:32632@png
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/Bremen:Topo_Bremen@EPSG:32632@png
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/Bremen:Aerial_Hemelingen@EPSG:32632@png
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/Hemelingen_TIF_WebMerc/MapServer"
1\url = "file:TilePackage/Finland/2025-04-04_Finland_Pohjankagas_overview_BW_Aerial_2m_WebMerc.tpk#-1:125"
2\url = "file:TilePackage/Finland/2025-04-04_Finland_Pohjankagas_BW_Topo_1m_WebMerc.tpk#-1:125"
3\url = "file:TilePackage/Finland/2025-04-04_Finland_Pohjankagas_BW_Aerial_1m_WebMerc.tpk#-1:125"
size=3
[sceneObjectUrls]
# 1\url = "URL[#<altitudeOffset>]"
#Example: >>> 1\url = "file:AHTC_LOW.slpk#0.3" <<<
#Brest
#1\url = "http://scene.arcgis.com/arcgis/rest/services/Hosted/Buildings_Brest/SceneServer/layers/0" ;# Brest/France
#1\url = "http://scene.arcgis.com/arcgis/rest/services/Hosted/Buildings_Brest/SceneServer/layers" ;# Brest/France
#1\url = "http://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/Buildings_Brest/SceneServer/layers/0" ;# Brest/France from Luke, no textures?
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Hosted/BT_56_11/SceneServer"
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Hosted/BT56_rev576/SceneServer" ;# Since 2017-08-25
#1\url = "file:BT_56_UTM_EPSG_25832.slpk"
#1\url = "file:GUEZ_EPSG3857.slpk" ;# Since 2019-03-26
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:2025-03-06_Finland-Pohjankagas_elevation.tif"
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Draped" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget), draped for fillPattern
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Static:Draped" ;# switch to Static (NLDEVCTRL-692 'Beheben des Speicher(-leck) Problems')
7\operationalLayer = "AESCentral:Dynamic:Draped" ;# 3D-AreaEffectSimulation, draped, SubLayer 'GraphicsLayer_3D_Absolute' is absolute
8\operationalLayer = "Participants:Dynamic:Relative"
9\operationalLayer = "Participants_1:Dynamic:Relative"
10\operationalLayer = "Participants_2:Dynamic:Relative"
11\operationalLayer = "Participants_3:Dynamic:Relative"
12\operationalLayer = "Participants_4:Dynamic:Relative"
13\operationalLayer = "Participants_5:Dynamic:Relative"
size=13
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "32UMD9307078331" ;#QPointF(93070, 78331) -> BT56 - Bremen
center = "34VEP7780067500" ;#34 V EP 68500 55000 -> 2025 Finland Pohjankagas
#center = "32UMD9275080525" ;#QPointF(92750, 80525) -> Rennplatz - Bremen
#center = "39RXG4400060000" ;# AHTC
#center = "30UUU8935659700" ;# 30UUU9100060500 -> Brest, Chateau
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 90000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+160
View File
@@ -0,0 +1,160 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000189203,none,A3C63PJPXMLDLMZ59123" ;# ESRI-BOS-Service, 05.11.2018
1\extensionString = ""
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None | MIL2525D | MIL2525C | APP6B | APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
#For factory
#1\url = "http://ecvmgeo02/arcgis/rest/services/Norddeutschland/Norddeutschland_32632/MapServer#-1:125" ;# Since 2017-08-29
#2\url = "http://ecvmgeo02/arcgis/rest/services/Bremen/Hemelingen_TIF_32632/MapServer#-1:125" ;# Since 2017-08-29
#For on-site
1\url = "http://ecvmgeo02/arcgis/rest/services/Altmark/Altmark_Topo_2m5_32632_2018/MapServer#-1:125" ;# Since 2019-09-24
2\url = "http://ecvmgeo02/arcgis/rest/services/Altmark/Altmark_Aerial_32632_2017/MapServer#-1:125" ;# Since 2019-09-24
1\url = "file:TilePackage/Altmark/2020-07-13_Altmark_topographic2015_32632.tpk#-1:125" ;# Since 2020-07-31
2\url = "file:TilePackage/Altmark/2020-07-13_Altmark_aerial2017_32632.tpk#-1:125" ;# Since 2020-07-31
3\url = "file:TilePackage/Altmark/2022-08-23_Altmark_Schnoeggersburg_Drone_32632_Lvl11.tpk#-1:125" ;# Since 2022-08-23
#For on-site - windows
#1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#2\url = "file:///C:/EXTFW/resources/Guez_Aerial_32632_Guez_Aerial_32632/Guez Aerial#-1:125"
size=3
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk')
# : For debugging only
[sceneUrls]
#For factory
#1\url = "http://ecvmgeo02/arcgis/rest/services/Norddeutschland/Norddeutschland_WebMerc/MapServer" ;# Since 2017-08-29
#2\url = "http://ecvmgeo02/arcgis/rest/services/Bremen/Hemelingen_TIF_WebMerc/MapServer" ;# Since 2017-08-29
#For on-site
1\url = "http://ecvmgeo02/arcgis/rest/services/Altmark/Altmark_Topo_2m5_WebMerc_2018/MapServer#0:125" ;# Since 2019-09-24
2\url = "http://ecvmgeo02/arcgis/rest/services/Altmark/Altmark_Aerial_WebMerc_2017/MapServer#0:125" ;# Since 2019-09-24
1\url = "file:TilePackage/Altmark/2020-07-13_Altmark_topographic2015_WebMerc.tpk#-1:125" ;# Since 2020-07-31
2\url = "file:TilePackage/Altmark/2020-07-13_Altmark_aerial2017_WebMerc.tpk#-1:125" ;# Since 2020-07-31
3\url = "file:TilePackage/Altmark/2022-08-23_Altmark_Schnoeggersburg_Drone_WebMerc_Lvl21.tpk#-1:125" ;# Since 2022-08-23
#For on-site - windows
#1\url = "file:///C:/EXTFW/resources/Guez_Topo_WebMerc_Guez_Topo_WebMerc/Guez Topographic#-1:125"
#2\url = "file:///C:/EXTFW/resources/Guez_Aerial_WebMerc_Guez_Aerial_WebMerc/Guez Aerial#-1:125"
size=3
[sceneObjectUrls]
#1\url = "http://ecvmgeo02/arcgis/rest/services/Hosted/BT56_rev576/SceneServer" ;# Since 2017-08-29 (not working yet)
1\url = "file:GUEZ_EPSG3857.slpk" ;# Since 2019-03-26
size=1
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#Elevation (rough_to_fine)
#1\url = "http://ecvmgeo02/arcgis/rest/services/Bremen/BremenElevation/ImageServer" ;# Since 2017-08-29
#1\url = "file:srtm_38_02.tif" ;# srtm_38_02.tif -> Bremen, 50m
#1\url = "file:n52_e011_1arc_v3.tif" ;# n52_e011_1arc_v3.tif -> Letzlingen, ??m
1\url = "file:Altmark_dt1.tif" ;# Altmark.dt1 -> Letzlingen, ~15m (0.000138)
2\url = "file:2022-08-02_Schnoeggersburg_3D-18-A317_DGM_EPSG4326_float32.tif" ;# Since 2022-08, aus Drohnebefliegung
size=2
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Draped" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget), draped for fillPattern
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
#6\operationalLayer = "AES:Static:Draped" ;# switch to Static (NLDEVCTRL-692 'Beheben des Speicher(-leck) Problems')
6\operationalLayer = "AES:Static:Draped" ;# for SubLayer '.._3DExtrusion' SurfacePlaement::Relative is enforced
7\operationalLayer = "AESCentral:Dynamic:Draped" ;# 3D-AreaEffectSimulation, draped, SubLayer 'GraphicsLayer_3D_Absolute' is absolute
8\operationalLayer = "Participants:Dynamic:Relative"
9\operationalLayer = "Participants_1:Dynamic:Relative"
10\operationalLayer = "Participants_2:Dynamic:Relative"
11\operationalLayer = "Participants_3:Dynamic:Relative"
12\operationalLayer = "Participants_4:Dynamic:Relative"
13\operationalLayer = "Participants_5:Dynamic:Relative"
size=13
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
#center = "32UMD9307078331" ;#QPointF(93070, 78331) -> BT56 - Bremen
center = "32UPD7671618433" ;#QPointF(76716, 18433) -> BT39 (Schulgebaeude2b) - Schnoeggersburg
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 90000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+136
View File
@@ -0,0 +1,136 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000189203,none,FAYRMD17J18S6HAZ4078" ;# V100.2.1, provided by Mr. Steinicke (ESRI), 23.03.2018
1\extensionString = "Exten1"
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
#For on-site - windows
1\url = "file:Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
1\name = "Guez Topographic"
2\url = "file:Guez_Aerial_32632_Guez_Aerial_32632/Guez Aerial#-1:125"
2\name = "Guez Aerial"
3\url = "file:Guez_HotSpots_Salchau_Aerial_0m20_2017_32632#-1:125"
3\name = "HotSpots Salchau Aerial"
4\url = "file:Guez_HotSpots_Schnoeggersburg_Aerial_0m20_2017_32632#-1:125"
4\name = "HotSpots Schnoeggersburg Aerial"
size=4
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk')
# : For debugging only
[sceneUrls]
#For on-site - windows
1\url = "file:Guez_Topo_WebMerc_Guez_Topo_WebMerc/Guez Topographic#-1:125"
1\name = "Guez Topographic"
2\url = "file:Guez_Aerial_WebMerc_Guez_Aerial_WebMerc/Guez Aerial#-1:125"
2\name = "Guez Aerial"
3\url = "file:Guez_HotSpots_Salchau_Aerial_0m20_2017_WebMerc#-1:125"
3\name = "HotSpots Salchau Aerial"
4\url = "file:Guez_HotSpots_Schnoeggersburg_Aerial_0m20_2017_WebMerc#-1:125"
4\name = "HotSpots Schnoeggersburg Aerial"
size=4
[sceneObjectUrls]
1\url = "file:GUEZ_BA1_EPSG3857_20181106.slpk"
size=1
[elevationUrls]
1\url = "file:Altmark_dt1.tif" ;# Altmark.dt1 -> Letzlingen, ??m
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Dynamic:Draped"
7\operationalLayer = "AESCentral:Dynamic:Draped" ;# 3D-AreaEffectSimulation, draped, SubLayer 'GraphicsLayer_3D_Absolute' is absolute
8\operationalLayer = "Participants:Dynamic:Relative"
9\operationalLayer = "Participants_1:Dynamic:Relative"
10\operationalLayer = "Participants_2:Dynamic:Relative"
11\operationalLayer = "Participants_3:Dynamic:Relative"
12\operationalLayer = "Participants_4:Dynamic:Relative"
13\operationalLayer = "Participants_5:Dynamic:Relative"
size=13
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "32UPD7400013000" ;#QPointF(93070, 78331) -> BT56 - Bremen
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 90000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
@@ -0,0 +1,179 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000189203,none,FAYRMD17J18S6HAZ4078" ;# 14.03.19, Fr. Jonischkeit: Aus 25er Pack für RME, bis Febr; also für Demo etc.
1\extensionString = "Exten1"
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Norddeutschland/Norddeutschland_32632/MapServer#-1:125" ;# Since 2017-08-25
2\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/Hemelingen_TIF_32632/MapServer" ;# Since 2017-08-25
2\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenHemelingenAerialGeoAmt_32632/MapServer#-1:125" ;# Since 2017-12-12
3\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenWerkAerialDrone_32632/MapServer#-1:125" ;# Since 2017-12-12
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AHTC_32639/MapServer"
#1\url = "http://EXCGEO01:9090/geoserver/gwc/service/tms/1.0.0/workspace1:Norddeutschland_UTM@EPSG:32632@png"
#2\url = "http://EXCGEO01:6080/arcgis/rest/services/HemelingenRDE/MapServer"
#3\url = "http://excgeo01:9090/geoserver/gwc/service/tms/1.0.0/Salchau%3ASalchau_overview@EPSG%3A32632@png"
#4\url = "http://excgeo01:9090/geoserver/gwc/service/tms/1.0.0/Salchau%3ASalchau@EPSG%3A32632@png"
#3\url = "http://EXCGEO02/arcgis/rest/services/SampleWorldCities/MapServer" ;# 'SampleWorldCities' = EsriBuiltIn-Service (->ArcGISMapImageLayer)
### arcgisonline
#1\url = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer" ;# == Basemap::topographic
#2\url = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"
#3\url = "http://server.arcgisonline.com/arcgis/rest/services/Ocean_Basemap/MapServer"
1\url = "file:TilePackage/Hungary/2024-07-30_Hungary_Varpalota_topographic_32634.tpk#-1:125"
2\url = "file:TilePackage/Hungary/2024-07-29_Hungary_Varpalota_aerial_32634.tpk#-1:125"
size=2
# Consulting:
# http://192.168.133.88:6080/arcgis/rest/services/Norddeutschland_Osm/MapServer
# ^^
# http://192.168.133.90:6080/arcgis/rest/services/BremenGeoTiffUTM/MapServer
#
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/workspace1:Norddeutschland_UTM@EPSG:32632@png
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/Bremen:Topo_Bremen@EPSG:32632@png
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/Bremen:Aerial_Hemelingen@EPSG:32632@png
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/Hemelingen_TIF_WebMerc/MapServer"
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Norddeutschland/Norddeutschland_WebMerc/MapServer#0:125" ;# Since 2017-08-25
2\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/Hemelingen_TIF_WebMerc/MapServer#0:125" ;# Since 2017-08-25
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AHTC_WebMerc_2/MapServer"
#1\url = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"
#1\url = "https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer" ;# == Basemap::topographic
1\url = "file:TilePackage/Hungary/2024-07-30_Hungary_Varpalota_topographic_WebMerc.tpk#-1:125"
2\url = "file:TilePackage/Hungary/2024-07-29_Hungary_Varpalota_aerial_WebMerc.tpk#-1:125"
size=2
[sceneObjectUrls]
# 1\url = "URL[#<altitudeOffset>]"
#Example: >>> 1\url = "file:AHTC_LOW.slpk#0.3" <<<
#Brest
#1\url = "http://scene.arcgis.com/arcgis/rest/services/Hosted/Buildings_Brest/SceneServer/layers/0" ;# Brest/France
#1\url = "http://scene.arcgis.com/arcgis/rest/services/Hosted/Buildings_Brest/SceneServer/layers" ;# Brest/France
#1\url = "http://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/Buildings_Brest/SceneServer/layers/0" ;# Brest/France from Luke, no textures?
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Hosted/BT_56_11/SceneServer"
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Hosted/BT56_rev576/SceneServer" ;# Since 2017-08-25
1\url = "file:BT_56_UTM_EPSG_25832.slpk"
1\url = "file:GUEZ_EPSG3857.slpk" ;# Since 2019-03-26
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:2024-07-30_Hungary_Varpalota_DDM10_WGS84.tif"
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Draped" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget), draped for fillPattern
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Static:Draped" ;# switch to Static (NLDEVCTRL-692 'Beheben des Speicher(-leck) Problems')
7\operationalLayer = "AESCentral:Dynamic:Draped" ;# 3D-AreaEffectSimulation, draped, SubLayer 'GraphicsLayer_3D_Absolute' is absolute
8\operationalLayer = "Participants:Dynamic:Relative"
9\operationalLayer = "Participants_1:Dynamic:Relative"
10\operationalLayer = "Participants_2:Dynamic:Relative"
11\operationalLayer = "Participants_3:Dynamic:Relative"
12\operationalLayer = "Participants_4:Dynamic:Relative"
13\operationalLayer = "Participants_5:Dynamic:Relative"
size=13
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "34 TBT 74750 25500" ;#QPointF(32000, 04000) -> Hungary, Varpalota
#center = "32UMD9275080525" ;#QPointF(92750, 80525) -> Rennplatz - Bremen
#center = "39RXG4400060000" ;# AHTC
#center = "30UUU8935659700" ;# 30UUU9100060500 -> Brest, Chateau
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 10000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
@@ -0,0 +1,122 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimeadvanced,1000,rud000500932,none,5H7LMD17J12GEBZNR016" ;# Mail David Eastman, 20.02.2019
1\extensionString = "runtimeanalysis,1000,rud000500932,none,YYPH5AZAMAG0E3CPR073" ;# Mail David Eastman, 20.02.2019
size=1
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
#extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "file:TilePackage/L400/2020-03-02_Cultana_aerial_0m50_32653.tpk"
size=1
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
size=0
[sceneObjectUrls]
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:L400/Cultana_e137s33_TFRM.dt2" ;# 2020-03-Cultana_e137s33_TFRM.dt2 -> 25m
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Dynamic:Draped"
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "53HQD3500071000"
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 200000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
@@ -0,0 +1,122 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimeadvanced,1000,rud000500932,none,5H7LMD17J12GEBZNR016" ;# Mail David Eastman, 20.02.2019
1\extensionString = "runtimeanalysis,1000,rud000500932,none,YYPH5AZAMAG0E3CPR073" ;# Mail David Eastman, 20.02.2019
size=1
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
#extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "file:TilePackage/L400/2020-03-02_Puckapunyal_aerial_0m20_32655.tpk"
size=1
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
size=0
[sceneObjectUrls]
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:L400/2020-03-03_Puckapunyal.tif" ;# 2020-03-03_Puckapunyal.tif -> 25m
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Dynamic:Draped"
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "55HCV2000012000"
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 200000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+123
View File
@@ -0,0 +1,123 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimeadvanced,1000,rud000500932,none,5H7LMD17J12GEBZNR016" ;# Mail David Eastman, 20.02.2019
1\extensionString = "runtimeanalysis,1000,rud000500932,none,YYPH5AZAMAG0E3CPR073" ;# Mail David Eastman, 20.02.2019
size=1
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
#extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "file:TilePackage/L400/2020-03-02_SWBTA_aerial_0m20_32656.tpk"
size=1
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
size=0
[sceneObjectUrls]
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:L400/SWBTA_e150s23_TFRM.dt2" ;# SWBTA_e150s23_TFRM.dt2 -> 25m
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Dynamic:Draped"
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "56KKA2000000001"
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 200000
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+122
View File
@@ -0,0 +1,122 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimeadvanced,1000,rud000500932,none,5H7LMD17J12GEBZNR016" ;# Mail David Eastman, 20.02.2019
1\extensionString = "runtimeanalysis,1000,rud000500932,none,YYPH5AZAMAG0E3CPR073" ;# Mail David Eastman, 20.02.2019
size=1
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
#extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "file:TilePackage/L400/2020-03-02_TFTA_aerial_0m50_32655.tpk"
size=1
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
size=0
[sceneObjectUrls]
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:L400/TFTA_e146s20_TFRM.dt2" ;# 2020-03-TFTA_e146s20_TFRM.dt2 -> 25m
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Dynamic:Draped"
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "55KDU3800034000"
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 200000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+152
View File
@@ -0,0 +1,152 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimeadvanced,1000,rud000500932,none,5H7LMD17J12GEBZNR016" ;# Mail David Eastman, 20.02.2019
1\extensionString = "runtimeanalysis,1000,rud000500932,none,YYPH5AZAMAG0E3CPR073" ;# Mail David Eastman, 20.02.2019
size=1
[esriNetworkCache]
enabled = 0 ;# enabled: 1=on ; 0 =off, since V100.7.0
[symbology]
type = "MIL2525D" ;# None | MIL2525D | MIL2525C | APP6B
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
#For factory
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AHTC_32639/MapServer"
#For on-site
#1\url = "http://e-vm-geo-2.ahtc.live/arcgis/rest/services/UAE/UaeTopographic_32639/MapServer" ;# Since 2017-11-30
#2\url = "http://e-vm-geo-2.ahtc.live/arcgis/rest/services/UAE/UaeAerial_32639/MapServer" ;# Since 2017-11-30
#For on-site - windows
# todo
size=1
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk')
# : For debugging only
[sceneUrls]
#For factory
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AHTC_WebMerc_2/MapServer"
#For on-site
#1\url = "http://e-vm-geo-2.ahtc.live/arcgis/rest/services/UAE/UaeTopographic_WebMerc/MapServer" ;# Since 2017-11-30
#2\url = "http://e-vm-geo-2.ahtc.live/arcgis/rest/services/UAE/UaeAerial_WebMerc/MapServer" ;# Since 2017-11-30
#For on-site - windows
# todo
size=1
[sceneObjectUrls]
#1\url = "http://e-vm-geo-2.ahtc.live/arcgis/rest/services/Hosted/AHTC_LOW_15_11_2017/SceneServer" ;# Since 2017-11-30
1\url = "file:///tmp/AHTC_2017-12-18_21_0_AHTC_LOW_2017_12_18_v7.slpk"
#1\url = "file:///tmp/AHTC_2018-01-30/AHTC_2018_01_29_featureclass_per_building_gdb.slpk"
#1\url = "file:///tmp/AHTC_2018-01-30/AHTC_2018_01_29_one_featureclass_gdb.slpk"
1\url = "file:AHTC_0_AHTC_LOW_2018_10_17.slpk"
1\url = "file:AHTC_LOW_2018_10_29.slpk"
1\url = "file:AHTC_LOW_2018_10_30.slpk"
1\url = "file:AHTC_LOW_2019_01_17.slpk"
1\url = "file:AHTC_LOW.slpk"
size=1
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://ecvmgeo02/arcgis/rest/services/Bremen/BremenElevation/ImageServer" ;# Since 2017-08-29
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/ZM2/AHTC_UTM_dgm/ImageServer" ;# Z&M Testlauf03 ; 2018-02-14
1\url = "file:AHTC_utm_dgm_surface.tif" ;# Z&M
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Dynamic:Draped"
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "39RXG4400060000" ;# AHTC
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 90000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+177
View File
@@ -0,0 +1,177 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000189203,none,FAYRMD17J18S6HAZ4078" ;# 14.03.19, Fr. Jonischkeit: Aus 25er Pack für RME, bis Febr; also für Demo etc.
1\extensionString = "Exten1"
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Norddeutschland/Norddeutschland_32632/MapServer#-1:125" ;# Since 2017-08-25
2\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/Hemelingen_TIF_32632/MapServer" ;# Since 2017-08-25
2\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenHemelingenAerialGeoAmt_32632/MapServer#-1:125" ;# Since 2017-12-12
3\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenWerkAerialDrone_32632/MapServer#-1:125" ;# Since 2017-12-12
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AHTC_32639/MapServer"
#1\url = "http://EXCGEO01:9090/geoserver/gwc/service/tms/1.0.0/workspace1:Norddeutschland_UTM@EPSG:32632@png"
#2\url = "http://EXCGEO01:6080/arcgis/rest/services/HemelingenRDE/MapServer"
#3\url = "http://excgeo01:9090/geoserver/gwc/service/tms/1.0.0/Salchau%3ASalchau_overview@EPSG%3A32632@png"
#4\url = "http://excgeo01:9090/geoserver/gwc/service/tms/1.0.0/Salchau%3ASalchau@EPSG%3A32632@png"
#3\url = "http://EXCGEO02/arcgis/rest/services/SampleWorldCities/MapServer" ;# 'SampleWorldCities' = EsriBuiltIn-Service (->ArcGISMapImageLayer)
### arcgisonline
#1\url = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer" ;# == Basemap::topographic
#2\url = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"
#3\url = "http://server.arcgisonline.com/arcgis/rest/services/Ocean_Basemap/MapServer"
1\url = "file:TilePackage/Lithuania_Rukla/2024-07-03-Lith_Rukla_aerial_0m5_32635.tpk#-1:125"
size=1
# Consulting:
# http://192.168.133.88:6080/arcgis/rest/services/Norddeutschland_Osm/MapServer
# ^^
# http://192.168.133.90:6080/arcgis/rest/services/BremenGeoTiffUTM/MapServer
#
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/workspace1:Norddeutschland_UTM@EPSG:32632@png
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/Bremen:Topo_Bremen@EPSG:32632@png
# http://192.168.133.90:9090/geoserver/gwc/service/tms/1.0.0/Bremen:Aerial_Hemelingen@EPSG:32632@png
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/Hemelingen_TIF_WebMerc/MapServer"
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Norddeutschland/Norddeutschland_WebMerc/MapServer#0:125" ;# Since 2017-08-25
2\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/Hemelingen_TIF_WebMerc/MapServer#0:125" ;# Since 2017-08-25
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/AHTC/AHTC_WebMerc_2/MapServer"
#1\url = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"
#1\url = "https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer" ;# == Basemap::topographic
1\url = "file:TilePackage/Lithuania_Rukla/2024-07-03-Lith_Rukla_aerial_0m5_WebMerc.tpk#-1:125"
size=1
[sceneObjectUrls]
# 1\url = "URL[#<altitudeOffset>]"
#Example: >>> 1\url = "file:AHTC_LOW.slpk#0.3" <<<
#Brest
#1\url = "http://scene.arcgis.com/arcgis/rest/services/Hosted/Buildings_Brest/SceneServer/layers/0" ;# Brest/France
#1\url = "http://scene.arcgis.com/arcgis/rest/services/Hosted/Buildings_Brest/SceneServer/layers" ;# Brest/France
#1\url = "http://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/Buildings_Brest/SceneServer/layers/0" ;# Brest/France from Luke, no textures?
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Hosted/BT_56_11/SceneServer"
1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Hosted/BT56_rev576/SceneServer" ;# Since 2017-08-25
1\url = "file:BT_56_UTM_EPSG_25832.slpk"
1\url = "file:GUEZ_EPSG3857.slpk" ;# Since 2019-03-26
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:2024-07-03_Lith_Rukla_elevation.tif" ;# 2024-07-03_Lith_Rukla_elevation.tif -> Litauen Rukla
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Draped" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget), draped for fillPattern
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Static:Draped" ;# switch to Static (NLDEVCTRL-692 'Beheben des Speicher(-leck) Problems')
7\operationalLayer = "AESCentral:Dynamic:Draped" ;# 3D-AreaEffectSimulation, draped, SubLayer 'GraphicsLayer_3D_Absolute' is absolute
8\operationalLayer = "Participants:Dynamic:Relative"
9\operationalLayer = "Participants_1:Dynamic:Relative"
10\operationalLayer = "Participants_2:Dynamic:Relative"
11\operationalLayer = "Participants_3:Dynamic:Relative"
12\operationalLayer = "Participants_4:Dynamic:Relative"
13\operationalLayer = "Participants_5:Dynamic:Relative"
size=13
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "35 ULB 32000 04000" ;#QPointF(32000, 04000) -> Rukla
#center = "32UMD9275080525" ;#QPointF(92750, 80525) -> Rennplatz - Bremen
#center = "39RXG4400060000" ;# AHTC
#center = "30UUU8935659700" ;# 30UUU9100060500 -> Brest, Chateau
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 28000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+130
View File
@@ -0,0 +1,130 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000189203,none,FAYRMD17J18S6HAZ4078" ;# 14.03.19, Fr. Jonischkeit: Aus 25er Pack für RME, bis Febr; also für Demo etc.
1\extensionString = "Exten1"
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "file:TilePackage/Luxemburg/2023-07-10_Luxemburg_Aerial_0m1_2169_Lvl_10.tpk#-1:125" ;# 16GB
size=1
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
1\url = "file:Topographic.tpk#-1:125" ;# 7,8GB
size=1
[sceneObjectUrls]
# 1\url = "URL[#<altitudeOffset>]"
#Example: >>> 1\url = "file:AHTC_LOW.slpk#0.3" <<<
#Brest
1\url = "file:BT_56_UTM_EPSG_25832.slpk"
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:2023-07-11_elevationLuxemburg.tif"
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Static:Draped" ;# switch to Static (NLDEVCTRL-692 'Beheben des Speicher(-leck) Problems')
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "32UKV9284699203" ;#QPointF(92846, 99203) -> Luxemburg
center = "32UKA9000022000" ;# -> complete Luxemburg
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 300000 ;# 90000 -> Bremen ; 300000 -> Luxemburg
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
@@ -0,0 +1,130 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000189203,none,FAYRMD17J18S6HAZ4078" ;# 14.03.19, Fr. Jonischkeit: Aus 25er Pack für RME, bis Febr; also für Demo etc.
1\extensionString = "Exten1"
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "file:TilePackage/Luxemburg/2023-07-10_Luxemburg_Aerial_0m1_2169_Lvl_10.tpk#-1:125" ;# 16GB
size=1
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
1\url = "file:Topographic.tpk#-1:125" ;# 7,8GB
size=1
[sceneObjectUrls]
# 1\url = "URL[#<altitudeOffset>]"
#Example: >>> 1\url = "file:AHTC_LOW.slpk#0.3" <<<
#Brest
1\url = "file:BT_56_UTM_EPSG_25832.slpk"
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:2023-07-11_elevationLuxemburg.tif"
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Static:Draped" ;# switch to Static (NLDEVCTRL-692 'Beheben des Speicher(-leck) Problems')
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "32UKV9284699203" ;#QPointF(92846, 99203) -> Luxemburg
center = "32UKA9000022000" ;# -> complete Luxemburg
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 300000 ;# 90000 -> Bremen ; 300000 -> Luxemburg
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+144
View File
@@ -0,0 +1,144 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000189203,none,FAYRMD17J18S6HAZ4078" ;# 14.03.19, Fr. Jonischkeit: Aus 25er Pack für RME, bis Febr; also für Demo etc.
1\extensionString = "Exten1"
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "file:TilePackage/Qatar/2022-06-23_Qatar_OSM_32639.vtpk#-1:125" ;# Since Since 2022
2\url = "file:TilePackage/Qatar/Qatar_Aerial_32639.tpk#-1:125" ;# Since Since 2022
3\url = "file:TilePackage/Qatar/Qatar_Aerial_Islands_32639.tpk#-1:125" ;# Since Since 2022
4\url = "file:TilePackage/Qatar/2021-12-09_Qatar_Doha_Aerial_50cm_32639_Lvl8.tpk#-1:125" ;# Since Since 2022
5\url = "file:TilePackage/Qatar/Qatar_NSA_BarzanCamp_Aerial_32639.tpk#-1:125" ;# Since Since 2022
6\url = "file:TilePackage/Qatar/2021-12-16_Qatar_ABMMC_Aerial_50cm_32639_Lvl8.tpk#-1:125" ;# Since Since 2022
size=6
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
# !!! 2022-07: vtpk at 3d scene are support since 100.13!!!
1\url = "file:TilePackage/Qatar/2022-07-12_Qatar_OSM_WebMercator_Raster_Lvl16.tpk#-1:125" ;# Since Since 2022
2\url = "file:TilePackage/Qatar/Qatar_Aerial_WebMerc.tpk#-1:125" ;# Since Since 2022
3\url = "file:TilePackage/Qatar/Qatar_Aerial_Islands_WebMerc.tpk#-1:125" ;# Since Since 2022
4\url = "file:TilePackage/Qatar/2021-12-09_Qatar_Doha_Aerial_50cm_WebMerc_Lvl18.tpk#-1:125" ;# Since Since 2022
5\url = "file:TilePackage/Qatar/Qatar_NSA_BarzanCamp_Aerial_WebMerc.tpk#-1:125" ;# Since Since 2022
6\url = "file:TilePackage/Qatar/2021-12-16_Qatar_ABMMC_Aerial_50cm_WebMerc_Lvl18.tpk#-1:125" ;# Since Since 2022
size=6
[sceneObjectUrls]
1\url = "file:BT_56_UTM_EPSG_25832.slpk"
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:srtm_38_02.tif" ;# srtm_38_02.tif -> Bremen, 50m
1\url = "file:2022-07-12_Qatar_DEM_float32.tif" ;# 2022-07-12_Qatar_DEM_float32.tif -> ~30m
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Dynamic:Draped"
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "39RWJ3650000500" ;#QPointF(36500, 15500) -> Qatar Bldg
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 750000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 40000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+144
View File
@@ -0,0 +1,144 @@
# $Id$
# $HeadURL$
# $Author$
[license]
licenseString = "runtimestandard,1000,rud000189203,none,FAYRMD17J18S6HAZ4078" ;# 14.03.19, Fr. Jonischkeit: Aus 25er Pack für RME, bis Febr; also für Demo etc.
1\extensionString = "Exten1"
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None MIL2525D MIL2525C APP6B APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# EXCGEO01 (192.168.133.90) -> CCSAWS01
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
1\url = "file:TilePackage/Qatar/2022-06-23_Qatar_OSM_32639.vtpk#-1:125" ;# Since Since 2022
2\url = "file:TilePackage/Qatar/Qatar_Aerial_32639.tpk#-1:125" ;# Since Since 2022
3\url = "file:TilePackage/Qatar/Qatar_Aerial_Islands_32639.tpk#-1:125" ;# Since Since 2022
4\url = "file:TilePackage/Qatar/2021-12-09_Qatar_Doha_Aerial_50cm_32639_Lvl8.tpk#-1:125" ;# Since Since 2022
5\url = "file:TilePackage/Qatar/Qatar_NSA_BarzanCamp_Aerial_32639.tpk#-1:125" ;# Since Since 2022
6\url = "file:TilePackage/Qatar/2021-12-16_Qatar_ABMMC_Aerial_50cm_32639_Lvl8.tpk#-1:125" ;# Since Since 2022
size=6
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk', 'Bremen_RME_32632.tpk')
#localMapFile = "World_Topo_Map.tpk"
# : For debugging only
[sceneUrls]
# !!! 2022-07: vtpk at 3d scene are support since 100.13!!!
1\url = "file:TilePackage/Qatar/2022-07-12_Qatar_OSM_WebMercator_Raster_Lvl16.tpk#-1:125" ;# Since Since 2022
2\url = "file:TilePackage/Qatar/Qatar_Aerial_WebMerc.tpk#-1:125" ;# Since Since 2022
3\url = "file:TilePackage/Qatar/Qatar_Aerial_Islands_WebMerc.tpk#-1:125" ;# Since Since 2022
4\url = "file:TilePackage/Qatar/2021-12-09_Qatar_Doha_Aerial_50cm_WebMerc_Lvl18.tpk#-1:125" ;# Since Since 2022
5\url = "file:TilePackage/Qatar/Qatar_NSA_BarzanCamp_Aerial_WebMerc.tpk#-1:125" ;# Since Since 2022
6\url = "file:TilePackage/Qatar/2021-12-16_Qatar_ABMMC_Aerial_50cm_WebMerc_Lvl18.tpk#-1:125" ;# Since Since 2022
size=6
[sceneObjectUrls]
1\url = "file:BT_56_UTM_EPSG_25832.slpk"
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://excgeo21.sl.defence-elec.de/arcgis/rest/services/Bremen/BremenElevation/ImageServer"
1\url = "file:srtm_38_02.tif" ;# srtm_38_02.tif -> Bremen, 50m
1\url = "file:2022-07-12_Qatar_DEM_float32.tif" ;# 2022-07-12_Qatar_DEM_float32.tif -> ~30m
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Dynamic:Draped"
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
center = "39RWJ3650000500" ;#QPointF(36500, 15500) -> Qatar Bldg
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 750000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 40000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
#viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
viewshedUrl = "" ;# // SightFan -> not necessary
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+416
View File
@@ -0,0 +1,416 @@
/**
* @RDE_HEADER@
* Commom base types
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include <situation_map_export.h>
#include "point3D.h"
#include <Symbology/symbol_dictionary.h>
// Qt
#include <QString>
#include <QColor>
#include <QList>
#include <QPointF>
//----------------------------------------------------------------------------
namespace SituationMap
{
//----------------------------------------------------------------------------
const char UniqueMapIdAttribute[] = "UniqueSituationMapId";
const char IsPickableAttribute[] = "MapObjectIsPickable";
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
/**
* @brief UniqueMapId define the uniqueMapId used within SituationMap to distinguish AbstractMapObject.
*/
using UniqueMapId = quint32; // see UniqueMapId @ id_handler.h
/**
* @brief INVALID_MAP_ID defines an invalid uniqueMapId.
*/
static const UniqueMapId INVALID_MAP_ID = static_cast<SituationMap::UniqueMapId>(-1);
/**
* @brief isUniqueMapIdValid to check the validity of the uniqueMapId
* @param uniqueMapId to check
* @return True if valid, otherwise false
*/
inline bool isUniqueMapIdValid(const UniqueMapId &uniqueMapId) { return uniqueMapId != INVALID_MAP_ID; }
//----------------------------------------------------------------------------
// 'takeover' into our namespace :
using AdditionalSymbolType = AdvancedSymbology::AdditionalSymbolType;
using AdditionalSymbolTypeCont = AdvancedSymbology::AdditionalSymbolTypeCont;
using Injury = AdvancedSymbology::Injury;
using SymbolImage = AdvancedSymbology::SymbolImage;
using SymbolDataToRender = AdvancedSymbology::SymbolDataToRender;
using Role = AdvancedSymbology::Role;
// : 'takeover' into our namespace
//----------------------------------------------------------------------------
class EsriNetworkCacheSettings
{
public:
bool enabled = false;
// some parameter will be added with V100.8
// for convenience:
QString toString() const
{
QString str (QStringLiteral("enabled='%1'").arg(enabled));
return str;
}
};
//----------------------------------------------------------------------------
enum class Mode
{
Undefined = 0,
Mode_2D = 1,
Mode_3D = 2
};
enum class NavigationConstraint
{
Undefined = -1,
None = 0,
StayAbove = 1
};
inline bool isValid(const Mode curMode)
{
return curMode != Mode::Undefined;
}
inline Mode toggleMode(const Mode curMode)
{
switch (curMode)
{
case Mode::Undefined:
return Mode::Mode_2D;
break;
case Mode::Mode_2D:
return Mode::Mode_3D;
break;
case Mode::Mode_3D:
return Mode::Mode_2D;
break;
}
return Mode::Mode_2D;
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
/**
* @brief The DrawStatus enum to indicate the drawStatus of the 3D scene
*/
enum class DrawStatus
{
InProgress = 0,
Completed = 1
};
//----------------------------------------------------------------------------
/**
* @brief The ObjectAppearance enum differentiates between the
* technical and the tactical appearance of an AbstractMapObject.
*/
enum class ObjectAppearance
{
Technical,
Tactical
};
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
/**
* @brief The GridType enum differentiates different grids.
*/
enum class GridType
{
NoType, ///< No grid
LatLon, ///< grid of type LatitudeLongitude
MGRS, ///< grid of type MGRS
UTM, ///< grid of type UTM
USGN ///< grid of type USGN
};
//----------------------------------------------------------------------------
/**
* @brief The LayerType enum differentiates the layer purpose.
* \sa \ref LayerTypeOverview
*/
enum class LayerType
{
Undefined, ///< Undefined
Basemap, ///< Contains a basemap.
JumpPoint, ///< Contains JumpPoints
SnapshotOverlay, ///< Contains overlay of snapshot
Overlay, ///< Contains overlays, e.g. of Overlay-/PlanEditor, direct on top on Basemap layer
Operational, ///< Contains operational objects like AbstractMapObjects.
Tools, ///< Contains tools like Viewshed etc.
Rubberband, ///< Contains Rubberband(s)
EmergencyCall ///< Contains EmergencyCall(s)
};
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
/**
* @brief The RenderingMode enum to specify the GraphicsRenderingMode
*/
enum class RenderingMode
{
Dynamic, ///< Dynamic (0)
Static ///< Static (1)
};
//----------------------------------------------------------------------------
enum class SurfacePlacement
{
Draped, ///< Draped (0)
Absolute, ///< Absolute (1)
Relative ///< Relative (2)
};
//----------------------------------------------------------------------------
/**
* @brief The BasemapType enum differentiates the basemap layer purpose.
* \sa \ref LayerTypeOverview
*/
enum class BasemapType
{
Undefined, ///< Undefined
Aerial, ///< Aerial basemap.
Topographic, ///< Topographic basemap
};
//----------------------------------------------------------------------------
/**
* @brief SymbolSizeLdefault defines the default size 'L' of a symbol in pixel.
* 'L' describes a symbol reference size (see MIL2525 and APP6).
*/
const int SymbolSizeLdefault = 30;
const double symbolScaleMinimum = 0.1; ///< 10%
const double symbolScaleMaximum = 4.0; ///< 200*
//----------------------------------------------------------------------------
/**
* @brief The SymbolData struct contains parameter of a logical symbol
* like sidc, color and size.
* (To render a symbol the struct SymbolDataToRender have to be used.)
*
*/
struct SymbolData
{
QString sidc;
QColor color = Qt::magenta;
float size = 1.0;
bool useAlwaysDictionaryRenderer = false;
QVariantMap attributeMap;
/**
* @brief Get an default structure to render this symbol using AdvancedSymbology.
* @return
*/
SymbolDataToRender getDefaultRenderData() const
{
SymbolDataToRender renderData;
renderData.sidc = sidc;
// renderData.sizeL should stay on default, size is not really adequate
// assume filled symbols:
// renderData.m_lineColor = ; // stay default (black)
renderData.fillColor = color;
return renderData;
}
/**
* @brief operator== Compare two objects
* @param other to be compared with
* @return true if identical, otherwise false.
*/
bool operator==(const SymbolData &other) const
{
return ((this->sidc == other.sidc) &&
(this->color == other.color) &&
(this->size == other.size) &&
(this->useAlwaysDictionaryRenderer == other.useAlwaysDictionaryRenderer) &&
(this->attributeMap == other.attributeMap)
);
}
/**
* @brief operator!= Compare two objects
* @param other to be compared with
* @return true if NOT identical, otherwise false.
*/
bool operator!=(const SymbolData &other) const
{
return !(*this == other);
}
QString toString() const
{
QString str;
str = QStringLiteral("sidc='%1'").arg(sidc);
str += QStringLiteral(" color='%1'").arg(color.name(QColor::HexArgb));
str += QStringLiteral(" size='%1'").arg(size);
str += QStringLiteral(" useAlwaysDictionaryRenderer='%1'").arg(useAlwaysDictionaryRenderer ? QStringLiteral("true") : QStringLiteral("false"));
for (auto it = attributeMap.begin(); it != attributeMap.end(); ++it)
str += QStringLiteral("attribute[%1]='%2'").arg(it.key(), it.value().toString());
// str +=
// str += QStringLiteral(" SymChanged="); // ToDo: to clarify what's the meaning of this
return str;
}
};
//----------------------------------------------------------------------------
/**
* @brief PositionCont defines container of coordinates.
*/
using PositionCont = QVector<Point3D>;
inline PositionCont convert2D3D(const QList<QPointF> &lst)
{
PositionCont posCont;
posCont.reserve(lst.size());
for (auto i : qAsConst(lst) )
posCont.append(Point3D::fromQPointF(i));
return posCont;
}
inline PositionCont convert2D3D(const QVector<QPointF> &vec)
{
PositionCont posCont;
posCont.reserve(vec.size());
for (auto i : qAsConst(vec) )
posCont.append(Point3D::fromQPointF(i));
return posCont;
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
/*!
\brief Define different Marker.
*/
enum class MarkerSymbolType
{
Undefined,
// provided by ESRI
Circle, /*!< provided by ESRI. */
Cross, /*!< provided by ESRI. */
Diamond, /*!< provided by ESRI. */
Square, /*!< provided by ESRI. */
X, /*!< provided by ESRI. */
Triangle, /*!< provided by ESRI. */
// provided by our own (see directory 'Resources'):
PushPin2D /*!< Realized on out own, see 'Resources'.*/
};
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
/*!
\brief Define different line pattern.
*/
enum class LinePattern
{
Dash,
DashDot,
DashDotDot,
Dot,
Null,
Solid
};
/*!
\brief Define different fill pattern.
*/
enum class FillPattern
{
BackwardDiagonal, // /
Cross,
DiagonalCross,
ForwardDiagonal, // '\'
Horizontal,
Null,
Solid,
Vertical
};
//----------------------------------------------------------------------------
/*!
* \brief Define some second-tier visual components. The user should be informed if one of them changes.
*/
enum class VisualComponent
{
Grid,
PosititionString,
TimeString,
CompassRose,
OverviewMap,
TacticalAppearance,
ExerciseTimeString
};
//----------------------------------------------------------------------------
/**
* @brief
*
* Angle in degree, geographic (orientation is north and mathematical negative)
* a(0)
* |
* a(270) --O-- a(90)
* |
* a(180)
*/
} // namespace SituationMap
+161
View File
@@ -0,0 +1,161 @@
# $Id$
# $HeadURL$
# $Author$
#-- bottom_left: 30 U WB 56700 58000 = lon, lat: -2.190721 , 51.070713 (-0.03823529444, 0.891352093191)
#-- Salisbury England
#INSERT INTO asm.asm_training_area(id, name, bottom_left_x, bottom_left_y, height, width)
# VALUES (XXX, 'Salisbury', -0.03823529444, 0.891352093191, 30000, 30000);
#-- 2D
#INSERT INTO asm.asm_map_description (id, name, description, training_area_id, map_description_type_id, map_type_id, obj_order, url, min_scale, max_scale)
# VALUES (XXX6, 'Salisbury (OSM)', 'Salisbury (OSM)', 30, 1, 1, 0, 'file:TilePackage/Salisbury/2021-09-01_Salisbury_32630.tpk', -1, 125);
[license]
licenseString = "runtimestandard,1000,rud000189203,none,A3C63PJPXMLDLMZ59123" ;# ESRI-BOS-Service, 05.11.2018
1\extensionString = ""
size=0
[esriNetworkCache]
enabled = 1 ;# enabled: 1=on ; 0=off, since V100.7.0
[symbology]
type = "APP6D" ;# None | MIL2525D | MIL2525C | APP6B | APP6D
extraSymbols = ":/advancedSymbology/CivilSymbols" ;# ':/advancedSymbology/CivilSymbols'
[mapUrls]
# 1\url = "URL[#<minScale>:<maxScale>]"
#Example: >>> 1\url = "http://HOSTNAME_FQDN/arcgis/rest/services/Folder/Svcname/MapServer#minScale:maxScale" <<<
#
#if the projection matches, tpk file and/or tile cache folder (win only) are supported:
#1\url = "file:Topographic.tpk#-1:125" ;# -> /usr/share/arcgis/resources/Topographic.tpk
#2\url = "file:///usr/share/arcgis/resources/World_Topo_Map.tpk#-1:125"
# WINDOWS 1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#
#For factory
#1\url = "http://ecvmgeo02/arcgis/rest/services/Norddeutschland/Norddeutschland_32632/MapServer#-1:125" ;# Since 2017-08-29
#2\url = "http://ecvmgeo02/arcgis/rest/services/Bremen/Hemelingen_TIF_32632/MapServer#-1:125" ;# Since 2017-08-29
#For on-site
1\url = "file:TilePackage/Unterluess/2021-10-14_Unterluess_Aerial_32632.tpk" ;# Since 2021-10-15
#For on-site - windows
#1\url = "file:///C:/EXTFW/resources/Guez_Topo_32632_guez_topo_32632/Guez Topographic#-1:125"
#2\url = "file:///C:/EXTFW/resources/Guez_Aerial_32632_Guez_Aerial_32632/Guez Aerial#-1:125"
size=1
basemapLayernamePrefix = "" ;# default: "ArcGISTiledLayer_URL_"
# For debugging only:
# an non-empty value will overwrite/skip the mapUrls:
#localMapFile = "Topographic.tpk" ;# empty (if so, try 'Topographic.tpk')
# : For debugging only
[sceneUrls]
#For factory
#1\url = "http://ecvmgeo02/arcgis/rest/services/Norddeutschland/Norddeutschland_WebMerc/MapServer" ;# Since 2017-08-29
#2\url = "http://ecvmgeo02/arcgis/rest/services/Bremen/Hemelingen_TIF_WebMerc/MapServer" ;# Since 2017-08-29
#For on-site
#For on-site - windows
#1\url = "file:///C:/EXTFW/resources/Guez_Topo_WebMerc_Guez_Topo_WebMerc/Guez Topographic#-1:125"
#2\url = "file:///C:/EXTFW/resources/Guez_Aerial_WebMerc_Guez_Aerial_WebMerc/Guez Aerial#-1:125"
1\url = "file:Topographic.tpk#-1:125"
size=1
[sceneObjectUrls]
#1\url = "http://ecvmgeo02/arcgis/rest/services/Hosted/BT56_rev576/SceneServer" ;# Since 2017-08-29 (not working yet)
1\url = "file:GUEZ_EPSG3857.slpk" ;# Since 2019-03-26
2\url = "file:GUEZ_EPSG3857.slpk" ;# Since 2019-03-26
size=0
[elevationUrls]
#Example: >>> 1\url = "http://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" <<<
#Example: >>> 1\url = "file:srtm_38_02.tif" <<< -> /usr/share/arcgis/resources/elevation/srtm_38_02.tif
#Example: >>> 1\url = "file:///shd/CTC/TOOLS/Bremen_Elevation/srtm_38_02.tif" <<<
#1\url = "http://ecvmgeo02/arcgis/rest/services/Bremen/BremenElevation/ImageServer" ;# Since 2017-08-29
#1\url = "file:srtm_38_02.tif" ;# srtm_38_02.tif -> Bremen, 50m
#1\url = "file:n52_e011_1arc_v3.tif" ;# n52_e011_1arc_v3.tif -> Letzlingen, ??m
1\url = "file:e010n52_TFRM.dt2" ;# e010n52_TFRM.dt2.dt1 -> Unterlüß/Unterluess, ??m
size=1
[operationalLayer]
# "<Layername>:<Static|Dynamic>:<Draped|Absolute|Relative>"
1\operationalLayer = "Buildings:Dynamic:Relative" ;# Dynamic to avoid flicker at 3D if selection changes (MapObjectSelectionWidget)
2\operationalLayer = "TechnicalAreas:Dynamic:Draped" ;# TechnicalArea@AES (MOUTArea), TrainingArea, ShootBackArea
3\operationalLayer = "MountingPoints:Dynamic:Absolute"
4\operationalLayer = "IEDs:Dynamic:Relative"
5\operationalLayer = "BuildingOwnership:Dynamic:Relative" ;# keep ExtrusionMode (AbsoluteHeight) in mind
6\operationalLayer = "AES:Static:Draped" ;# switch to Static (NLDEVCTRL-692 'Beheben des Speicher(-leck) Problems')
7\operationalLayer = "Participants:Dynamic:Relative"
8\operationalLayer = "Participants_1:Dynamic:Relative"
9\operationalLayer = "Participants_2:Dynamic:Relative"
10\operationalLayer = "Participants_3:Dynamic:Relative"
11\operationalLayer = "Participants_4:Dynamic:Relative"
12\operationalLayer = "Participants_5:Dynamic:Relative"
size=12
participantLayername = "Participants:Dynamic:Relative" ;# default: "Participants:Dynamic:Relative"
operationalLayerForCubes = "BuildingOwnership" ;# must match with an operationalLayer
[map]
# full mgrs coordinate
# East;North
#center = "32UMD9307078331" ;#QPointF(93070, 78331) -> BT56 - Bremen
center = "32UND 86500 58100" ;#QPointF(86500, 58100) -> Unterlüß/Unterluess
zoomFactorBase = 1.0015 ;# to configure mouse wheel for zooming, only values greater 1 and lower 1.1 will be accepted
initialScale = 40000 ;# 90000 -> Bremen ; 7000000 -> NorthGermany
# scaleMin and scaleMax (of map!) may be overwritten, if a layer is loaded manually -> to rethink
scaleMin = -1 ;# big value (e.g. 10000000) limiting zoomOut 1:10000000 -> 0.0000001
scaleMax = -1 ;# small value (e.g. 1000) limiting zoomIn 1:1000 -> 0.001
scaleHasVisibility = 70000 ;# zoom out -> some objects disappear to not overload the map
gridType = "MGRS" ;# Grid: NoType, MGRS, UTM, USGN, LatLon
animationDuration = 0.5 ;# default -> 0.5 (0< 0 -> off)
rocketDuration = 2.0 ;# default -> 2.0
[widgets]
addMapWidgets = 1
addSideBar = 1
[viewshed]
# // arcgisonline -> only demo (keep proxy in mind!)
viewshedUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed" ;# // only demo!!!
[rubberband]
drawColor = "#00406e" ;# Color settings of rubberband
fillColor = "#007eC0"
handleDrawColor = "#00406e" ;# Outline color of handles
handleFillColor = "#00406e" ;# fill color of handles
selectionColor = "red" ;# fill or draw color if handle is selected
frameColor = "#00406e" ;# outline color of frame handle (bounding box)
frameFillColor = "#5043b0e0" ;# fill color of frame handle (bounding box)
frameHandleMargin = 0 ;# Margin of frame handle in pixel
previewOffset = @Point(32 32) ;# Offset of preview icon to mouse position
previewSize = 32 ;# Size of preview icon
pickingRatio = 8 ;# Size of rubberband point handles
lineHandleWidth = 4 ;# Size of rubberband line handles
# to be continued
+751
View File
@@ -0,0 +1,751 @@
/**
* @RDE_HEADER@
* Utilities for SituationMap
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "situation_map_utils.h"
#include "abstract_effect_simulation.h"
// Esri
#include <arcgis/CoreTypes.h> // for LicenseStatus
#include <arcgis/MapTypes.h>
#include <arcgis/Viewpoint.h>
#include <arcgis/Camera.h>
#include <arcgis/arcgisversion.h> // This file is created by RME, not ESRI
#if ACRGIS_VERSION >= 0x640600 // 100.6.0 / Update 6
#define HAS_SURFACEPLACEMENT_RELATIVETOSCENE
#endif
// Qt
#include <QString>
#include <QPointF>
#include <QRect>
#include <sstream>
std::ostream &operator<< (std::ostream &stream,
const SituationMap::PositionCont &value)
{
stream << "PosCont(" << value.size() << "): ";
for (const SituationMap::Point3D &item : value)
stream << item << ";";
return stream;
}
//std::ostream& operator<< (std::ostream& stream,
// const QRect& value)
//{
// stream << "QRect(topLeft=" << value.topLeft()
// << " bottomRight=" << value.bottomRight()
// << " width=" << value.width()
// << " height=" << value.height()
// << " center=" << value.center()
// << " bottom=" << value.bottom()
// << " left=" << value.left()
// << ")";
// return stream;
//}
QString toString(const QRectF &value)
{
std::ostringstream stream;
stream << "QRect(topLeft=" << value.topLeft()
<< " bottomRight=" << value.bottomRight()
<< " width=" << value.width()
<< " height=" << value.height()
<< " center=" << value.center()
<< " bottom=" << value.bottom()
<< " left=" << value.left()
<< ")";
return QString::fromStdString(stream.str());
}
std::ostream &operator<<(std::ostream &stream, const QColor &value)
{
stream << "QColor("
<< value.name(QColor::HexArgb).toUtf8().data()
<< ")";
return stream;
}
QString toString(const QColor &value)
{
return value.name(QColor::HexArgb);
}
namespace SituationMap
{
QString toString(const AesEffectState value)
{
switch (value)
{
case AesEffectState::Removed:
return QStringLiteral("AesRemoved");
case AesEffectState::Expired:
return QStringLiteral("AesExpired");
case AesEffectState::Error:
return QStringLiteral("AesError");
case AesEffectState::Paused:
return QStringLiteral("AesPaused");
case AesEffectState::Prepared:
return QStringLiteral("AesExpired");
case AesEffectState::Created:
return QStringLiteral("AesCreated");
case AesEffectState::Activated:
return QStringLiteral("AesActivated");
case AesEffectState::Unknown:
return QStringLiteral("AesUnknown");
} // switch
Q_ASSERT(false);
return QStringLiteral("AesEffectStateERROR");
}
std::ostream &operator<< (std::ostream &stream,
const AesEffectState &value)
{
stream << toString(value).data();
return stream;
}
QString toString(DrawStatus value)
{
switch (value)
{
case SituationMap::DrawStatus::InProgress:
return QStringLiteral("DSInProgress");
case SituationMap::DrawStatus::Completed:
return QStringLiteral("DSCompleted");
} // switch
Q_ASSERT(false);
return QStringLiteral("DrawStatusERROR");
}
QString toString(GridType value)
{
switch (value)
{
case GridType::NoType:
return QStringLiteral("NoType");
case GridType::LatLon:
return QStringLiteral("LatLon");
case GridType::MGRS:
return QStringLiteral("MGRS");
case GridType::USGN:
return QStringLiteral("USGN");
case GridType::UTM:
return QStringLiteral("UTM");
} // switch
Q_ASSERT(false);
return QStringLiteral("GridTypeERROR");
}
QString toString(LayerType value)
{
switch (value)
{
case LayerType::Undefined:
return QStringLiteral("LTUndefined");
case LayerType::Basemap:
return QStringLiteral("LTBasemap");
case LayerType::JumpPoint:
return QStringLiteral("LTJumpPoint");
case LayerType::SnapshotOverlay:
return QStringLiteral("LTSnapshotOverlay");
case LayerType::Overlay:
return QStringLiteral("LTOverlay");
case LayerType::Operational:
return QStringLiteral("LTOperational");
case LayerType::Tools:
return QStringLiteral("LTTools");
case LayerType::Rubberband:
return QStringLiteral("LTRubberband");
case LayerType::EmergencyCall:
return QStringLiteral("LTEmergencyCall");
} // switch
Q_ASSERT(false);
return QStringLiteral("LayerTypeERROR");
}
QString toString(BasemapType value)
{
switch (value)
{
case BasemapType::Undefined:
return QStringLiteral("BMTUndefined");
case BasemapType::Aerial:
return QStringLiteral("BMTAerial");
case BasemapType::Topographic:
return QStringLiteral("BMTTopographic");
} // switch
Q_ASSERT(false);
return QStringLiteral("BasemapTypeERROR");
}
QString toString(SituationMap::RenderingMode value)
{
switch (value)
{
case RenderingMode::Dynamic:
return QStringLiteral("Dynamic");
case RenderingMode::Static:
return QStringLiteral("Static");
} // switch
Q_ASSERT(false);
return QStringLiteral("RenderingModeERROR");
}
bool fromString(RenderingMode &renderingMode, const QString &str)
{
if (str.compare(QStringLiteral("Dynamic")) == 0)
{
renderingMode = RenderingMode::Dynamic;
return true;
}
if (str.compare(QStringLiteral("Static")) == 0)
{
renderingMode = RenderingMode::Static;
return true;
}
return false;
}
QString toString(SurfacePlacement value)
{
switch (value)
{
case SurfacePlacement::Draped:
return QStringLiteral("Draped");
case SurfacePlacement::Absolute:
return QStringLiteral("Absolute");
case SurfacePlacement::Relative:
return QStringLiteral("Relative");
} // switch
Q_ASSERT(false);
return QStringLiteral("SurfacePlacementERROR");
}
bool fromString(SituationMap::SurfacePlacement &surfacePlacement, const QString &str)
{
if (str.compare(QStringLiteral("Draped")) == 0)
{
surfacePlacement = SurfacePlacement::Draped;
return true;
}
if (str.compare(QStringLiteral("Absolute")) == 0)
{
surfacePlacement = SurfacePlacement::Absolute;
return true;
}
if (str.compare(QStringLiteral("Relative")) == 0)
{
surfacePlacement = SurfacePlacement::Relative;
return true;
}
return false;
}
QString toDisplayString(BasemapType value)
{
switch (value)
{
case BasemapType::Undefined:
return QStringLiteral("TUndefined");
case BasemapType::Aerial:
return QStringLiteral("Aerial");
case BasemapType::Topographic:
return QStringLiteral("Topographic");
} // switch
Q_ASSERT(false);
return QStringLiteral("BasemapTypeERROR");
}
bool fromString(GridType &gridType, const QString &str)
{
if (str.compare(QStringLiteral("NoType")) == 0)
{
gridType = GridType::NoType;
return true;
}
if (str.compare(QStringLiteral("MGRS"), Qt::CaseInsensitive) == 0)
{
gridType = GridType::MGRS;
return true;
}
if (str.compare(QStringLiteral("UTM"), Qt::CaseInsensitive) == 0)
{
gridType = GridType::UTM;
return true;
}
if (str.compare(QStringLiteral("USGN"), Qt::CaseInsensitive) == 0)
{
gridType = GridType::USGN;
return true;
}
if (str.compare(QStringLiteral("LatLon"), Qt::CaseInsensitive) == 0)
{
gridType = GridType::LatLon;
return true;
}
return false;
}
std::ostream &operator<< (std::ostream &stream,
const DrawStatus value)
{
stream << toString(value).data();
return stream;
}
std::ostream &operator<< (std::ostream &stream,
const GridType value)
{
stream << toString(value).data();
return stream;
}
std::ostream &operator<< (std::ostream &stream,
const SituationMap::LayerType value)
{
stream << toString(value).data();
return stream;
}
std::ostream &operator<< (std::ostream &stream,
const SituationMap::BasemapType value)
{
stream << toString(value).data();
return stream;
}
std::ostream &operator<< (std::ostream &stream,
const SituationMap::RenderingMode value)
{
stream << toString(value).data();
return stream;
}
std::ostream &operator<< (std::ostream &stream,
const SituationMap::SurfacePlacement value)
{
stream << toString(value).data();
return stream;
}
std::ostream &operator<< (std::ostream &stream,
const SituationMap::EsriNetworkCacheSettings value)
{
stream << "EsriNetworkCacheSettings: ";
stream << value.toString();
return stream;
}
} // namespace SituationMap
//------------------------------------------------------------------------------
// namespace Esri::ArcGISRuntime
namespace Esri
{
namespace ArcGISRuntime
{
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::Error &value)
{
stream << toString(value);
return stream;
}
QString toString(const Error &value)
{
std::ostringstream stream;
stream << "Esri::ArcGISRuntime::Error: "
<< " code=" << value.code()
<< ", domain=" << (int)value.domain()
<< ", extendedErrorType=" << (int)value.extendedErrorType()
<< ", message='" << value.message() << "'"
<< ", additionalMessage='" << value.additionalMessage() << "'";
return QString::fromStdString(stream.str());
}
//------------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::LicenseStatus value)
{
stream << "EsriLicenseStatus(" << toString(value)
<< ")";
return stream;
}
QString toString(const Esri::ArcGISRuntime::LicenseStatus value)
{
switch (value)
{
case Esri::ArcGISRuntime::LicenseStatus::Invalid:
return QStringLiteral("Invalid");
case Esri::ArcGISRuntime::LicenseStatus::Expired:
return QStringLiteral("Expired");
case Esri::ArcGISRuntime::LicenseStatus::LoginRequired:
return QStringLiteral("LoginRequired");
case Esri::ArcGISRuntime::LicenseStatus::Valid:
return QStringLiteral("Valid");
} // switch
Q_ASSERT(false);
return QStringLiteral("Esri-LicenseStatusERROR");
}
//------------------------------------------------------------------------------
#if ACRGIS_VERSION >= 0x640800 // 100.8.0 / Update 8
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::NetworkCachePolicy value)
{
stream << "EsriNCP(" << toString(value)
<< ")";
return stream;
}
QString toString(const NetworkCachePolicy value)
{
switch (value)
{
case Esri::ArcGISRuntime::NetworkCachePolicy::AlwaysCache:
return QStringLiteral("AlwaysCache");
case Esri::ArcGISRuntime::NetworkCachePolicy::AlwaysNetwork:
return QStringLiteral("AlwaysNetwork");
case Esri::ArcGISRuntime::NetworkCachePolicy::PreferCache:
return QStringLiteral("PreferCache");
case Esri::ArcGISRuntime::NetworkCachePolicy::PreferNetwork:
return QStringLiteral("PreferNetwork");
} // switch
Q_ASSERT(false);
return QStringLiteral("Esri-NetworkCachePolicyERROR");
}
#endif // ACRGIS_VERSION
//------------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::LoadStatus value)
{
stream << "EsriLS(" << toString(value)
<< ")";
return stream;
}
QString toString(const Esri::ArcGISRuntime::LoadStatus value)
{
switch (value)
{
case Esri::ArcGISRuntime::LoadStatus::Loaded:
return QStringLiteral("Loaded");
case Esri::ArcGISRuntime::LoadStatus::Loading:
return QStringLiteral("Loading");
case Esri::ArcGISRuntime::LoadStatus::FailedToLoad:
return QStringLiteral("FailedToLoad");
case Esri::ArcGISRuntime::LoadStatus::NotLoaded:
return QStringLiteral("NotLoaded");
case Esri::ArcGISRuntime::LoadStatus::Unknown:
return QStringLiteral("Unknown");
} // switch
Q_ASSERT(false);
return QStringLiteral("Esri-LoadStatusERROR");
}
//------------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::LayerType value)
{
stream << "EsriLT(" << toString(value)
<< ")";
return stream;
}
QString toString(const Esri::ArcGISRuntime::LayerType value)
{
switch (value)
{
case Esri::ArcGISRuntime::LayerType::ImageTiledLayer:
return QStringLiteral("ImageTiledLayer");
case Esri::ArcGISRuntime::LayerType::ServiceImageTiledLayer:
return QStringLiteral("ServiceImageTiledLayer");
case Esri::ArcGISRuntime::LayerType::ArcGISMapImageLayer:
return QStringLiteral("ArcGISMapImageLayer");
case Esri::ArcGISRuntime::LayerType::ArcGISTiledLayer:
return QStringLiteral("ArcGISTiledLayer");
case Esri::ArcGISRuntime::LayerType::FeatureCollectionLayer:
return QStringLiteral("FeatureCollectionLayer");
case Esri::ArcGISRuntime::LayerType::FeatureLayer:
return QStringLiteral("FeatureLayer");
case Esri::ArcGISRuntime::LayerType::KMLLayer:
return QStringLiteral("KMLLayer");
case Esri::ArcGISRuntime::LayerType::BingMapLayer:
return QStringLiteral("BingMapLayer");
case Esri::ArcGISRuntime::LayerType::RasterLayer:
return QStringLiteral("RasterLayer");
case Esri::ArcGISRuntime::LayerType::UnsupportedLayer:
return QStringLiteral("UnsupportedLayer");
case Esri::ArcGISRuntime::LayerType::MobileBasemapLayer:
return QStringLiteral("MobileBasemapLayer");
case Esri::ArcGISRuntime::LayerType::ArcGISVectorTiledLayer:
return QStringLiteral("ArcGISVectorTiledLayer");
case Esri::ArcGISRuntime::LayerType::ArcGISSceneLayer:
return QStringLiteral("ArcGISSceneLayer");
case Esri::ArcGISRuntime::LayerType::WmtsLayer:
return QStringLiteral("WmtsLayer");
case Esri::ArcGISRuntime::LayerType::OpenStreetMapLayer:
return QStringLiteral("OpenStreetMapLayer");
case Esri::ArcGISRuntime::LayerType::BingMapsLayer:
return QStringLiteral("BingMapsLayer");
case Esri::ArcGISRuntime::LayerType::WebTiledLayer:
return QStringLiteral("WebTiledLayer");
case Esri::ArcGISRuntime::LayerType::EncLayer:
return QStringLiteral("EncLayer");
case Esri::ArcGISRuntime::LayerType::WmsLayer:
return QStringLiteral("WmsLayer");
#if ACRGIS_VERSION >= 0x640500 // 100.5.0 / Update 5
case Esri::ArcGISRuntime::LayerType::IntegratedMeshLayer:
return QStringLiteral("IntegratedMeshLayer");
case Esri::ArcGISRuntime::LayerType::PointCloudLayer:
return QStringLiteral("PointCloudLayer");
case Esri::ArcGISRuntime::LayerType::GroupLayer:
return QStringLiteral("GroupLayer");
case Esri::ArcGISRuntime::LayerType::AnnotationLayer:
return QStringLiteral("AnnotationLayer");
#endif // ACRGIS_VERSION
#if ACRGIS_VERSION >= 0x640700 // 100.7.0 / Update 7
case Esri::ArcGISRuntime::LayerType::SubtypeFeatureLayer:
return QStringLiteral("SubtypeFeatureLayer");
#endif // ACRGIS_VERSION
#if ACRGIS_VERSION >= 0x640D00 // 100.13.0
case Esri::ArcGISRuntime::LayerType::DimensionLayer:
return QStringLiteral("SubtypeFeatureLayer");
#endif // ACRGIS_VERSION
case Esri::ArcGISRuntime::LayerType::UnknownLayer:
return QStringLiteral("UnknownLayer");
} // switch
Q_ASSERT(false);
return QStringLiteral("Esri-LayerTypeERROR");
}
//------------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::ElevationSourceType value)
{
stream << "EsriEST(" << toString(value)
<< ")";
return stream;
}
QString toString(const Esri::ArcGISRuntime::ElevationSourceType value)
{
switch (value)
{
case Esri::ArcGISRuntime::ElevationSourceType::Unknown:
return QStringLiteral("Unknown");
case Esri::ArcGISRuntime::ElevationSourceType::ArcGISTiledElevationSource:
return QStringLiteral("ArcGISTiledElevationSource");
case Esri::ArcGISRuntime::ElevationSourceType::RasterElevationSource:
return QStringLiteral("RasterElevationSource");
} // switch
Q_ASSERT(false);
return QStringLiteral("Esri-ElevationSourceTypeERROR");
}
//------------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::GraphicsRenderingMode value)
{
stream << "EsriGRM(" << toString(value)
<< ")";
return stream;
}
QString toString(const Esri::ArcGISRuntime::GraphicsRenderingMode value)
{
switch (value)
{
case Esri::ArcGISRuntime::GraphicsRenderingMode::Dynamic:
return QStringLiteral("Dynamic");
case Esri::ArcGISRuntime::GraphicsRenderingMode::Static:
return QStringLiteral("Static");
} // switch
Q_ASSERT(false);
return QStringLiteral("Esri-GraphicsRenderingModeERROR");
}
//------------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::GeometryType value)
{
stream << "EsriGT(" << toString(value) << ")";
return stream;
}
QString toString(const Esri::ArcGISRuntime::GeometryType value)
{
switch (value)
{
case Esri::ArcGISRuntime::GeometryType::Unknown:
return QStringLiteral("Unknown");
case Esri::ArcGISRuntime::GeometryType::Point:
return QStringLiteral("Point");
case Esri::ArcGISRuntime::GeometryType::Envelope:
return QStringLiteral("Envelope");
case Esri::ArcGISRuntime::GeometryType::Polyline:
return QStringLiteral("Polyline");
case Esri::ArcGISRuntime::GeometryType::Polygon:
return QStringLiteral("Polygon");
case Esri::ArcGISRuntime::GeometryType::Multipoint:
return QStringLiteral("Multipoint");
} // switch
Q_ASSERT(false);
return QStringLiteral("Esri-GeometryTypeERROR");
}
//------------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::ViewpointType value)
{
stream << "EsriVPT(" << toString(value) << ")";
return stream;
}
QString toString(const Esri::ArcGISRuntime::ViewpointType value)
{
switch (value)
{
case Esri::ArcGISRuntime::ViewpointType::Unknown:
return QStringLiteral("Unknown");
case Esri::ArcGISRuntime::ViewpointType::CenterAndScale:
return QStringLiteral("CenterAndScale");
case Esri::ArcGISRuntime::ViewpointType::BoundingGeometry:
return QStringLiteral("BoundingGeometry");
}// switch
Q_ASSERT(false);
return QStringLiteral("Esri-ViewpointTypeERROR");
}
//------------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::SceneLocationVisibility value)
{
stream << "EsriSLV(" << toString(value) << ")";
return stream;
}
QString toString(const Esri::ArcGISRuntime::SceneLocationVisibility value)
{
switch (value)
{
case Esri::ArcGISRuntime::SceneLocationVisibility::Visible:
return QStringLiteral("Visible");
case Esri::ArcGISRuntime::SceneLocationVisibility::HiddenByBaseSurface:
return QStringLiteral("HiddenByBaseSurface");
case Esri::ArcGISRuntime::SceneLocationVisibility::HiddenByEarth:
return QStringLiteral("HiddenByEarth");
case Esri::ArcGISRuntime::SceneLocationVisibility::HiddenByElevation:
return QStringLiteral("HiddenByElevation");
case Esri::ArcGISRuntime::SceneLocationVisibility::NotOnScreen:
return QStringLiteral("NotOnScreen");
}// switch
Q_ASSERT(false);
return QStringLiteral("Esri-SceneLocationVisibilityERROR");
}
//------------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::SurfacePlacement value)
{
stream << "EsriSP(" << toString(value) << ")";
return stream;
}
QString toString(Esri::ArcGISRuntime::SurfacePlacement value)
{
switch (value)
{
case Esri::ArcGISRuntime::SurfacePlacement::Draped:
return QStringLiteral("Draped");
case Esri::ArcGISRuntime::SurfacePlacement::Absolute:
return QStringLiteral("Absolute");
case Esri::ArcGISRuntime::SurfacePlacement::Relative:
return QStringLiteral("Relative");
#ifdef HAS_SURFACEPLACEMENT_RELATIVETOSCENE
case Esri::ArcGISRuntime::SurfacePlacement::RelativeToScene:
return QStringLiteral("RelativeToScene");
#endif // HAS_SURFACEPLACEMENT_RELATIVETOSCENE
#if ACRGIS_VERSION >= 0x640700 // 100.7.0 / Update 7
case Esri::ArcGISRuntime::SurfacePlacement::DrapedFlat:
return QStringLiteral("DrapedFlat");
#endif // ACRGIS_VERSION
}// switch
Q_ASSERT(false);
return QStringLiteral("Esri-SurfacePlacementERROR");
}
//------------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::Viewpoint &value)
{
stream << "EsriVP:"
<< " targetGeometryType=" << value.targetGeometry().geometryType();
if (value.targetGeometry().geometryType() == Esri::ArcGISRuntime::GeometryType::Point)
{
const Esri::ArcGISRuntime::Point center(value.targetGeometry());
stream << " center: x=" << center.x() << " - y=" << center.y() << " - z=" << center.z();
}
stream << " rotation=" << value.rotation()
<< " targetScale=" << value.targetScale();
return stream;
}
std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::Camera &value)
{
const Esri::ArcGISRuntime::Point &location = value.location();
stream << "EsriCam:"
<< " location: xLon=" << location.x() << " - yLat=" << location.y() << " - z=" << location.z()
<< " ; h=" << value.heading() << " p=" << value.pitch() << " r=" << value.roll();
return stream;
}
}
} // namespace Esri::ArcGISRuntime
+154
View File
@@ -0,0 +1,154 @@
/**
* @RDE_HEADER@
* Utilities for SituationMap
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
// arcgis
#include <arcgis/SceneViewTypes.h> // SurfacePlacement
#include <arcgis/Error.h>
// Qt
#include <QPointF>
#include <QSize>
#include <QRectF>
#include <iosfwd>
// Forward:
namespace Esri
{
namespace ArcGISRuntime
{
enum class GraphicsRenderingMode;
enum class ElevationSourceType;
enum class LayerType;
enum class LicenseStatus;
enum class LoadStatus;
enum class NetworkCachePolicy;
enum class SceneLocationVisibility;
enum class ViewpointType;
enum class GeometryType;
class Viewpoint;
class Camera;
}
}
//----------------------------------------------------------------------------
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::PositionCont &value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const QColor &value);
namespace SituationMap
{
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::DrawStatus value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::GridType value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::LayerType value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::BasemapType value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::RenderingMode value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::SurfacePlacement value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::EsriNetworkCacheSettings value);
}
SITUATIONMAP_EXPORT QString toString(const QRectF &value);
SITUATIONMAP_EXPORT QString toString(const QColor &value);
namespace SituationMap
{
SITUATIONMAP_EXPORT QString toString(SituationMap::DrawStatus value);
SITUATIONMAP_EXPORT QString toString(SituationMap::GridType value);
SITUATIONMAP_EXPORT bool fromString(SituationMap::GridType &gridType, const QString &str);
SITUATIONMAP_EXPORT QString toString(SituationMap::LayerType value);
SITUATIONMAP_EXPORT QString toString(SituationMap::BasemapType value);
SITUATIONMAP_EXPORT QString toString(SituationMap::RenderingMode value);
SITUATIONMAP_EXPORT bool fromString(SituationMap::RenderingMode &renderingMode, const QString &str);
SITUATIONMAP_EXPORT QString toString(SituationMap::SurfacePlacement value);
SITUATIONMAP_EXPORT bool fromString(SituationMap::SurfacePlacement &surfacePlacement, const QString &str);
SITUATIONMAP_EXPORT QString toDisplayString(SituationMap::BasemapType value);
}
namespace Esri
{
namespace ArcGISRuntime
{
SITUATIONMAP_EXPORT QString toString(const Esri::ArcGISRuntime::Error &value);
SITUATIONMAP_EXPORT QString toString(const Esri::ArcGISRuntime::ElevationSourceType value);
SITUATIONMAP_EXPORT QString toString(const Esri::ArcGISRuntime::GraphicsRenderingMode value);
SITUATIONMAP_EXPORT QString toString(const Esri::ArcGISRuntime::GeometryType value);
SITUATIONMAP_EXPORT QString toString(const Esri::ArcGISRuntime::LayerType value);
SITUATIONMAP_EXPORT QString toString(const Esri::ArcGISRuntime::LicenseStatus value);
SITUATIONMAP_EXPORT QString toString(const Esri::ArcGISRuntime::LoadStatus value);
#if ACRGIS_VERSION >= 0x640700 // 100.8.0 / Update 8
SITUATIONMAP_EXPORT QString toString(const Esri::ArcGISRuntime::NetworkCachePolicy value);
#endif // ACRGIS_VERSION
SITUATIONMAP_EXPORT QString toString(const Esri::ArcGISRuntime::SceneLocationVisibility value);
SITUATIONMAP_EXPORT QString toString(const Esri::ArcGISRuntime::SurfacePlacement value);
SITUATIONMAP_EXPORT QString toString(const Esri::ArcGISRuntime::ViewpointType value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::Error &value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::ElevationSourceType value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::GraphicsRenderingMode value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::GeometryType value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::LayerType value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::LicenseStatus value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::LoadStatus value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::NetworkCachePolicy value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::SceneLocationVisibility value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::SurfacePlacement value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::ViewpointType value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::Viewpoint &value);
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const Esri::ArcGISRuntime::Camera &value);
}
}
+61
View File
@@ -0,0 +1,61 @@
/**
* @RDE_HEADER@
* Interface of TerrainProfile
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include "terrain_profile_parameter.h"
#include <situation_map_export.h>
// Qt
#include <QString>
#include <QPointF>
#include <functional>
//----------------------------------------------------------------------------
namespace SituationMap
{
class TerrainProfileDialog;
/**
* @brief The TerrainProfile class creating a TerrainProfile.
*/
class SITUATIONMAP_EXPORT TerrainProfile
{
public:
TerrainProfile() = default; ///< Contructor
virtual ~TerrainProfile() = default; ///< Destructor
TerrainProfile(const TerrainProfile &other) = delete;
TerrainProfile &operator=(TerrainProfile &other) = delete;
/**
* @brief setFinishedCallback to display the result if calculation is finished
* @param finishedCallback
*/
virtual void setFinishedCallback(const std::function< bool(long id, const QVector<QPair<QPointF, double>> &)> &finishedCallback) = 0;
virtual void setTerrainProfileDialog(long id, QPointer<SituationMap::TerrainProfileDialog> &terrainProfileDialog) = 0;
virtual bool create() = 0; // will start a rubberband
virtual long create(const TerrainProfileParameter &terrainProfileParameter) = 0;
virtual void remove(long terrainProfileId = -1) = 0;
};
} // namespace SituationMap
+40
View File
@@ -0,0 +1,40 @@
/**
* @RDE_HEADER@
* TerrainProfileParameter
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "terrain_profile_parameter.h"
#include "situation_map_utils.h"
//Qt
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <sstream>
//----------------------------------------------------------------------------
namespace SituationMap
{
QString TerrainProfileParameter::toString() const
{
std::ostringstream stream;
stream << " m_coordinates = " << m_coordinates;
return QString::fromLatin1(stream.str().c_str());
}
std::ostream &operator<< (std::ostream &stream,
const SituationMap::TerrainProfileParameter &value)
{
return stream << value.toString();
}
} // namespace SituationMap
+49
View File
@@ -0,0 +1,49 @@
/**
* @RDE_HEADER@
* TerrainProfileParameter
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <situation_map_export.h>
// Qt
#include <QString>
#include <QPointF>
class QJsonObject;
//----------------------------------------------------------------------------
namespace SituationMap
{
/*!
* \brief Define parameter for TerrainProfile.
*/
class TerrainProfileParameter
{
public:
explicit TerrainProfileParameter() = default;
PositionCont m_coordinates;
double m_length = 0.0;
QString toString() const;
// static MapWidgetSettings read(const QJsonObject &json);
// QJsonObject toJsonObject() const;
};
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::TerrainProfileParameter &value);
} // namespace SituationMap
+198
View File
@@ -0,0 +1,198 @@
/**
* @RDE_HEADER@
* TextStyle
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "text_style.h"
// ESRI
namespace SituationMap
{
TextStyle::TextStyle(const QColor &textColor, float size)
: m_textColor(textColor)
, m_size(size)
{}
TextStyle::TextStyle(const QColor &textColor)
: m_textColor(textColor)
{}
QColor TextStyle::textColor() const
{
return m_textColor;
}
void TextStyle::setTextColor(const QColor &textColor)
{
m_textColor = textColor;
}
float TextStyle::size() const
{
return m_size;
}
void TextStyle::setSize(float size)
{
m_size = size;
}
bool TextStyle::bold() const
{
return m_bold;
}
void TextStyle::setBold(bool bold)
{
m_bold = bold;
}
bool TextStyle::italic() const
{
return m_italic;
}
void TextStyle::setItalic(bool italic)
{
m_italic = italic;
}
bool TextStyle::underline() const
{
return m_underline;
}
void TextStyle::setUnderline(bool underline)
{
m_underline = underline;
}
bool TextStyle::strikeThrough() const
{
return m_strikeThrough;
}
void TextStyle::setStrikeThrough(bool strikeThrough)
{
m_strikeThrough = strikeThrough;
}
float TextStyle::textOutlineWidth() const
{
return m_textOutlineWidth;
}
void TextStyle::setTextOutlineWidth(float textOutlineWidth)
{
m_textOutlineWidth = textOutlineWidth;
}
QColor TextStyle::textOutlineColor() const
{
return m_textOutlineColor;
}
void TextStyle::setTextOutlineColor(const QColor &textOutlineColor)
{
m_textOutlineColor = textOutlineColor;
}
QColor TextStyle::backgroundColor() const
{
return m_backgroundColor;
}
void TextStyle::setBackgroundColor(const QColor &backgroundColor)
{
m_backgroundColor = backgroundColor;
}
bool TextStyle::antiAliased() const
{
return m_antiAliased;
}
void TextStyle::setAntiAliased(bool antiAliased)
{
m_antiAliased = antiAliased;
}
HorizontalAlignment TextStyle::horizontalAlignment() const
{
return m_horizontalAlignment;
}
void TextStyle::setHorizontalAlignment(const HorizontalAlignment &horizontalAlignment)
{
m_horizontalAlignment = horizontalAlignment;
}
VerticalAlignment TextStyle::verticalAlignment() const
{
return m_verticalAlignment;
}
void TextStyle::setVerticalAlignment(const VerticalAlignment &verticalAlignment)
{
m_verticalAlignment = verticalAlignment;
}
float TextStyle::angle() const
{
return m_angle;
}
void TextStyle::setAngle(float angleDegree)
{
m_angle = angleDegree;
}
const QString &TextStyle::fontFamily() const
{
return m_fontFamily;
}
void SituationMap::TextStyle::setFontFamily(const QString &fontFamily)
{
m_fontFamily = fontFamily;
}
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
std::ostream &operator<< (std::ostream &stream,
const TextStyle &value)
{
QString str;
str.append(QStringLiteral(" textColor='%1'").arg(value.textColor().name(QColor::HexArgb)));
str.append(QStringLiteral(" size=%1").arg(value.size()));
str.append(QStringLiteral(" angle=%1").arg(value.angle()));
str.append(QStringLiteral(" fontFamily='%1'").arg(value.fontFamily()));
str.append(QStringLiteral(" bold=%1").arg(value.bold()));
str.append(QStringLiteral(" italic=%1").arg(value.italic()));
str.append(QStringLiteral(" underline=%1").arg(value.underline()));
str.append(QStringLiteral(" strikeThrough=%1").arg(value.strikeThrough()));
str.append(QStringLiteral(" textOutlineWidth=%1").arg(value.textOutlineWidth()));
str.append(QStringLiteral(" textOutlineColor=%1").arg(value.textOutlineColor().name(QColor::HexArgb)));
str.append(QStringLiteral(" backgroundColor=%1").arg(value.backgroundColor().name(QColor::HexArgb)));
str.append(QStringLiteral(" horizontalAlignment=%1").arg(static_cast<int>(value.horizontalAlignment())));
str.append(QStringLiteral(" verticalAlignment=%1").arg(static_cast<int>(value.verticalAlignment())));
str.append(QStringLiteral(" antiAliased=%1").arg(value.antiAliased()));
stream << str.toStdString();
return stream;
}
} // namespace SituationMap
+204
View File
@@ -0,0 +1,204 @@
/**
* @RDE_HEADER@
* TextStyle
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <situation_map_export.h>
// Qt
#include <QColor>
//----------------------------------------------------------------------------
namespace SituationMap
{
/*!
\brief Horizontal alignment for text.
*/
enum class HorizontalAlignment
{
Left,
Center,
Right,
Justify // ???
};
/*!
\brief Vertical alignment for text.
*/
enum class VerticalAlignment
{
Bottom,
Middle,
Top,
BaseLine
};
/**
* @brief The TextStyle class contains text parameter like color, size, font....
*
* The default TextSymbol size is 15.0.
* The default TextSymbol color is black.
* The default TextSymbol horizontal alignment is left.
* The default TextSymbol vertical alignment is bottom.
*/
class SITUATIONMAP_EXPORT TextStyle final
{
public:
/*! \name Construction, Destruction */
//@{
/**
* @brief Constructor
*/
TextStyle() = default;
/**
* @brief Constructor
*/
explicit TextStyle(const QColor &textColor);
/**
* @brief Constructor
*/
TextStyle(const QColor &textColor, float size);
/**
* @brief Destructor
*/
~TextStyle() = default;
//@}
/** \name Parameters
* Set and get methods for the different parameters.
*/
//@{
QColor textColor() const;
void setTextColor(const QColor &textColor);
float size() const;
void setSize(float size);
float angle() const;
void setAngle(float angleDegree);
const QString &fontFamily() const;
void setFontFamily(const QString &fontFamily);
bool bold() const;
void setBold(bool bold);
bool italic() const;
void setItalic(bool italic);
bool underline() const;
void setUnderline(bool underline);
bool strikeThrough() const;
void setStrikeThrough(bool strikeThrough);
float textOutlineWidth() const;
void setTextOutlineWidth(float textOutlineWidth);
QColor textOutlineColor() const;
void setTextOutlineColor(const QColor &textOutlineColor);
QColor backgroundColor() const;
void setBackgroundColor(const QColor &backgroundColor);
HorizontalAlignment horizontalAlignment() const;
void setHorizontalAlignment(const HorizontalAlignment &horizontalAlignment);
VerticalAlignment verticalAlignment() const;
void setVerticalAlignment(const VerticalAlignment &verticalAlignment);
bool antiAliased() const;
void setAntiAliased(bool antiAliased);
//@}
/**
* @brief operator== Compare two objects
* @param other to be compared with
* @return true if identical, otherwise false.
*/
bool operator==(const TextStyle &other) const
{
return ((this->m_textColor == other.m_textColor) &&
(this->m_size == other.m_size) &&
(this->m_angle == other.m_angle) &&
(this->m_fontFamily == other.m_fontFamily) &&
(this->m_bold == other.m_bold) &&
(this->m_italic == other.m_italic) &&
(this->m_underline == other.m_underline) &&
(this->m_strikeThrough == other.m_strikeThrough) &&
(this->m_textOutlineWidth == other.m_textOutlineWidth) &&
(this->m_textOutlineColor == other.m_textOutlineColor) &&
(this->m_backgroundColor == other.m_backgroundColor) &&
(this->m_horizontalAlignment == other.m_horizontalAlignment) &&
(this->m_verticalAlignment == other.m_verticalAlignment) &&
(this->m_antiAliased == other.m_antiAliased)
);
}
/**
* @brief operator!= Compare two objects
* @param other to be compared with
* @return true if NOT identical, otherwise false.
*/
bool operator!=(const TextStyle &other) const
{
return !(*this == other);
}
private:
QColor m_textColor = Qt::black;
float m_size = 15.0;
float m_angle = 0.0; // degree
QString m_fontFamily;
bool m_bold = false;
bool m_italic = false;
bool m_underline = false;
bool m_strikeThrough = false;
float m_textOutlineWidth = -1;
QColor m_textOutlineColor;
QColor m_backgroundColor; // Invalid is intended
// Alignment
HorizontalAlignment m_horizontalAlignment = HorizontalAlignment::Left;
VerticalAlignment m_verticalAlignment = VerticalAlignment::Bottom;
bool m_antiAliased = true; // Esri 10.2.5: antiAlias = true
};
//-----------------------------------------------------------------------------
// output operator:
//-----------------------------------------------------------------------------
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const TextStyle &value);
} // namespace SituationMap
+113
View File
@@ -0,0 +1,113 @@
/**
* @RDE_HEADER@
* Class Viewpoint2D
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "viewpoint2D.h"
// Qt
#include <QJsonObject>
//----------------------------------------------------------------------------
namespace SituationMap
{
Viewpoint2D::Viewpoint2D(const QPointF &centerGeo, double scale, double rotation)
: m_centerGeo(centerGeo), m_scale(scale), m_rotation(rotation)
{
// Q_ASSERT(scale > 0);
}
bool Viewpoint2D::isNull() const
{
return m_centerGeo.isNull() && qFuzzyCompare(m_scale, defaultScale) && qFuzzyIsNull(m_rotation);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
void Viewpoint2D::resetViewpoint()
{
m_centerGeo = QPointF();
m_scale = defaultScale;
m_rotation = 0;
}
QPointF Viewpoint2D::centerGeo() const
{
return m_centerGeo;
}
void Viewpoint2D::setCenterGeo(const QPointF &centerGeo)
{
m_centerGeo = centerGeo;
}
double Viewpoint2D::scale() const
{
return m_scale;
}
void Viewpoint2D::setScale(double scale)
{
m_scale = scale;
}
double Viewpoint2D::rotation() const
{
return m_rotation;
}
void Viewpoint2D::setRotation(double rotation)
{
m_rotation = rotation;
}
Viewpoint2D Viewpoint2D::read(const QJsonObject &json)
{
Viewpoint2D vp;
if (json.contains(QLatin1String("centerLon")) && json.contains(QLatin1String("centerLat")))
{
QPointF centerGeo;
centerGeo.rx() = json[QLatin1String("centerLon")].toDouble();
centerGeo.ry() = json[QLatin1String("centerLat")].toDouble();
vp.setCenterGeo(centerGeo);
}
if (json.contains(QLatin1String("scale")))
vp.setScale(json[QLatin1String("scale")].toDouble());
if (json.contains(QLatin1String("rotation")))
vp.setRotation(json[QLatin1String("rotation")].toDouble());
return vp;
}
QJsonObject Viewpoint2D::toJsonObject() const
{
QJsonObject json;
json[QLatin1String("centerLon")] = m_centerGeo.x();
json[QLatin1String("centerLat")] = m_centerGeo.y();
json[QLatin1String("scale")] = m_scale;
json[QLatin1String("rotation")] = m_rotation;
return json;
}
QString Viewpoint2D::toString() const
{
QString asString = QStringLiteral("center %1;%2[rad] %3;%4[deg], scale=%5, rotation=%6")
.arg(m_centerGeo.x()).arg(m_centerGeo.y())
.arg(m_centerGeo.x()*180.0/M_PI).arg(m_centerGeo.y()*180.0/M_PI)
.arg(m_scale).arg(m_rotation);
return asString;
}
std::ostream &operator<< (std::ostream &stream,
const SituationMap::Viewpoint2D &value)
{
stream << "Viewpoint2D(" << value.toString() << "): ";
return stream;
}
} // namespace SituationMap
+65
View File
@@ -0,0 +1,65 @@
/**
* @RDE_HEADER@
* Class Viewpoint2D
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <Common/situation_map_logging.h>
#include <situation_map_export.h>
// Qt
#include <QString>
class QJsonObject;
//----------------------------------------------------------------------------
namespace SituationMap
{
//----------------------------------------------------------------------------
// for 2D:
class SITUATIONMAP_EXPORT Viewpoint2D
{
public:
static constexpr double defaultScale = 999999.9;
Viewpoint2D(const QPointF &centerGeo = QPointF(), double scale = defaultScale, double rotation = 0);
bool isNull() const;
void resetViewpoint();
QPointF centerGeo() const;
void setCenterGeo(const QPointF &centerGeo);
double scale() const;
void setScale(double scale);
double rotation() const;
void setRotation(double rotation);
static Viewpoint2D read(const QJsonObject &json);
QJsonObject toJsonObject() const;
QString toString() const;
protected:
QPointF m_centerGeo; ///< lon, lat
double m_scale = defaultScale; // '0' may lead to an ESRI exception. Try to avoid and use another value
double m_rotation = 0; ///< absoluteAngleDegrees
};
//----------------------------------------------------------------------------
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::Viewpoint2D &value);
} // namespace SituationMap
+110
View File
@@ -0,0 +1,110 @@
/**
* @RDE_HEADER@
* Interface of Viewshed
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include "viewshed_parameter.h"
#include <situation_map_export.h>
// Qt
#include <QObject>
#include <QString>
#include <QPointF>
//----------------------------------------------------------------------------
namespace SituationMap
{
/**
* @brief The Viewshed class creating a viewshed.
*/
class SITUATIONMAP_EXPORT Viewshed : public QObject
{
using BaseClass = QObject;
Q_OBJECT
public:
Viewshed() = default; ///< Contructor
virtual ~Viewshed() = default; ///< Destructor
Viewshed(const Viewshed &other) = delete;
Viewshed &operator=(Viewshed &other) = delete;
/**
* Defines URL to elevation data service or file with elevation data
*
*/
virtual void setViewshedUrl(const QString &viewshedServiceUrl) = 0;
/**
* Creates ESRI based viewshed and starts a rubberband to define the area to analyse. On success the return value is true.
*/
virtual bool create() = 0;
/**
* Creates a GeISiR fan of sight and starts a rubberband to define the area (center point and radius) to analyse.
*
* @param alpha Alpha value to apply to predefined colors SightFan.
* @param innerRadius Distance from center point to start the analyse.
* @param observerHeight Height of center point above terrain.
* @param targetHeight Height of visible objects or targets.
* @param beamAngle Beam width in degree of a single scan line.
*
* @return true on success
*/
virtual bool create(double alpha, double innerRadius, double observerHeight, double targetHeight, double beamAngle) = 0; // will start a rubberband to create a fan of sight
/**
* Create a viewshed from existing parameter settings.
*
* @return true on success
*/
virtual long create(const ViewshedParameter &viewshedParameter) = 0;
/**
* In case of using GeSiR fan of sight for analysing modify the parameter settings.
*
* @param viewshedId Id of viewshed. In case of viewshedId is "-1" the current viwshed (last created) will be modified
* @param alpha Alpha value to apply to predefined colors SightFan.
* @param innerRadius Distance from center point to start the analyse.
* @param observerHeight Height of center point above terrain.
* @param targetHeight Height of visible objects or targets.
* @param beamAngle Beam width in degree of a single scan line.
*
* @return true on success
*/
virtual bool modify(long viewshedId, double alpha, double innerRadius, double observerHeight, double targetHeight, double beamAngle) = 0;
/**
* Remove a viewshed. In case of viewshedId is "-1" all viewsheds will be removed.
* @param vieweshedId Id of viewshed or "-1"
*/
virtual void remove(long viewshedId = -1) = 0;
/**
* Get parameter of a viewshed. In case of viewshedId is "-1" the current viwshed (last created) will be used
* @param vieweshedId Id of viewshed or "-1"
* @param ok Pointer bool variable set to true on success.
*
* @return Struct with viewshed parameters.
*/
virtual ViewshedParameter getViewshedParameter(long viewshedId = -1, bool *ok = nullptr) const = 0;
Q_SIGNALS:
void viewshedFinished(long viewshedId);
};
} // namespace SituationMap
+48
View File
@@ -0,0 +1,48 @@
/**
* @RDE_HEADER@
* ViewshedParameter
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "viewshed_parameter.h"
#include "situation_map_utils.h"
//Qt
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <sstream>
//----------------------------------------------------------------------------
namespace SituationMap
{
QString ViewshedParameter::toString() const
{
std::ostringstream stream;
stream << " viewshedOrigin_latLon = " << viewshedOrigin_latLon;
stream << "; innerRadius = " << innerRadius;
stream << "; outerRadius = " << outerRadius;
stream << "; observerOffset = " << observerHeight;
stream << "; targetOffset = " << targetHeight;
stream << "; startArngle = " << startAngle;
stream << "; dAngle = " << dAngle;
stream << "; noBeams = " << noBeams;
stream << "; alpha = " << alpha;
return QString::fromLatin1(stream.str().c_str());
}
std::ostream &operator<< (std::ostream &stream,
const SituationMap::ViewshedParameter &value)
{
return stream << value.toString();
}
} // namespace SituationMap
+55
View File
@@ -0,0 +1,55 @@
/**
* @RDE_HEADER@
* ViewshedParameter
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include <situation_map_export.h>
#include <MathUtils/math_const.h>
// Qt
#include <QString>
#include <QPointF>
class QJsonObject;
//----------------------------------------------------------------------------
namespace SituationMap
{
/*!
* \brief Define parameter for viewshed.
*/
class ViewshedParameter
{
public:
explicit ViewshedParameter() = default;
QPointF viewshedOrigin_latLon; // geo coordinates in rad
double innerRadius = 10.0; // inner radius for use with sight fan only
double outerRadius = 100.0; // radius for both sight fan and ESRI viewshed
double observerHeight = 2.0; // observer height for both sight fan and ESRI viewshed
double targetHeight = 2.0; // object or target height for use with sight fan
double startAngle = 0.0; // start angle of sight fan in rad
double dAngle = 2.0 / 180.0*MathConst::pi; // angle of single sight fan beam in rad
unsigned int noBeams = 180; // count of sight fan beams
double alpha = 1.0; // transparency [0..1];
QString toString() const;
// static MapWidgetSettings read(const QJsonObject &json);
// QJsonObject toJsonObject() const;
};
SITUATIONMAP_EXPORT std::ostream &operator<< (std::ostream &stream,
const SituationMap::ViewshedParameter &value);
} // namespace SituationMap