Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/shapes/PointOfInterest.cpp
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2005-2025 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file PointOfInterest.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @author Melanie Knocke
19
/// @date 2005-09-15
20
///
21
// A point-of-interest (2D)
22
/****************************************************************************/
23
#include <config.h>
24
25
#include "PointOfInterest.h"
26
27
28
// ===========================================================================
29
// member method definitions
30
// ===========================================================================
31
32
PointOfInterest::PointOfInterest(const std::string& id, const std::string& type, const RGBColor& color, const Position& pos,
33
bool geo, const std::string& lane, double posOverLane, bool friendlyPos, double posLat,
34
const std::string& icon, double layer, double angle, const std::string& imgFile, double width,
35
double height, const std::string& name, const Parameterised::Map& parameters) :
36
Shape(id, type, color, layer, angle, imgFile, name),
37
Position(pos),
38
Parameterised(parameters),
39
myGeo(geo),
40
myLane(lane),
41
myPosOverLane(posOverLane),
42
myFriendlyPos(friendlyPos),
43
myPosLat(posLat),
44
myIcon(SUMOXMLDefinitions::POIIcons.get(icon)),
45
myHalfImgWidth(width / 2.0),
46
myHalfImgHeight(height / 2.0) {
47
}
48
49
50
PointOfInterest::~PointOfInterest() {}
51
52
53
POIIcon
54
PointOfInterest::getIcon() const {
55
return myIcon;
56
}
57
58
59
const std::string&
60
PointOfInterest::getIconStr() const {
61
return SUMOXMLDefinitions::POIIcons.getString(myIcon);
62
}
63
64
65
double
66
PointOfInterest::getWidth() const {
67
return myHalfImgWidth * 2.0;
68
}
69
70
71
double
72
PointOfInterest::getHeight() const {
73
return myHalfImgHeight * 2.0;
74
}
75
76
77
Position
78
PointOfInterest::getCenter() const {
79
return { x() + myHalfImgWidth, y() + myHalfImgHeight };
80
}
81
82
83
bool
84
PointOfInterest::getFriendlyPos() const {
85
return myFriendlyPos;
86
}
87
88
89
void
90
PointOfInterest::setIcon(const std::string& icon) {
91
myIcon = SUMOXMLDefinitions::POIIcons.get(icon);
92
}
93
94
95
void
96
PointOfInterest::setWidth(double width) {
97
myHalfImgWidth = width / 2.0;
98
}
99
100
101
void
102
PointOfInterest::setHeight(double height) {
103
myHalfImgHeight = height / 2.0;
104
}
105
106
107
void
108
PointOfInterest::setFriendlyPos(const bool friendlyPos) {
109
myFriendlyPos = friendlyPos;
110
}
111
112
113
void
114
PointOfInterest::writeXML(OutputDevice& out, const bool geo, const double zOffset, const std::string laneID,
115
const double pos, const bool friendlyPos, const double posLat) const {
116
out.openTag(SUMO_TAG_POI);
117
out.writeAttr(SUMO_ATTR_ID, StringUtils::escapeXML(getID()));
118
if (getShapeType().size() > 0) {
119
out.writeAttr(SUMO_ATTR_TYPE, StringUtils::escapeXML(getShapeType()));
120
}
121
if (myIcon != POIIcon::NONE) {
122
out.writeAttr(SUMO_ATTR_ICON, SUMOXMLDefinitions::POIIcons.getString(myIcon));
123
}
124
out.writeAttr(SUMO_ATTR_COLOR, getShapeColor());
125
out.writeAttr(SUMO_ATTR_LAYER, getShapeLayer() + zOffset);
126
if (!getShapeName().empty()) {
127
out.writeAttr(SUMO_ATTR_NAME, getShapeName());
128
}
129
if (laneID != "") {
130
out.writeAttr(SUMO_ATTR_LANE, laneID);
131
out.writeAttr(SUMO_ATTR_POSITION, pos);
132
if (posLat != 0) {
133
out.writeAttr(SUMO_ATTR_POSITION_LAT, posLat);
134
}
135
if (friendlyPos) {
136
out.writeAttr(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
137
}
138
} else {
139
if (geo) {
140
Position POICartesianPos(*this);
141
GeoConvHelper::getFinal().cartesian2geo(POICartesianPos);
142
out.setPrecision(gPrecisionGeo);
143
out.writeAttr(SUMO_ATTR_LON, POICartesianPos.x());
144
out.writeAttr(SUMO_ATTR_LAT, POICartesianPos.y());
145
out.setPrecision();
146
} else {
147
out.writeAttr(SUMO_ATTR_X, x());
148
out.writeAttr(SUMO_ATTR_Y, y());
149
}
150
if (z() != 0.) {
151
out.writeAttr(SUMO_ATTR_Z, z());
152
}
153
}
154
if (getShapeNaviDegree() != Shape::DEFAULT_ANGLE) {
155
out.writeAttr(SUMO_ATTR_ANGLE, getShapeNaviDegree());
156
}
157
if (getShapeImgFile() != Shape::DEFAULT_IMG_FILE) {
158
out.writeAttr(SUMO_ATTR_IMGFILE, getShapeImgFile());
159
}
160
if (getWidth() != Shape::DEFAULT_IMG_WIDTH) {
161
out.writeAttr(SUMO_ATTR_WIDTH, getWidth());
162
}
163
if (getHeight() != Shape::DEFAULT_IMG_HEIGHT) {
164
out.writeAttr(SUMO_ATTR_HEIGHT, getHeight());
165
}
166
writeParams(out);
167
out.closeTag();
168
}
169
170
/****************************************************************************/
171
172