93 std::map<id_t, Node *> nodeById;
94 std::map<id_t, Way *> wayById;
95 std::map<id_t, Relation *> relationById;
97 cXMLElement *boundsElement = mapRoot->getFirstChildWithTag(
"bounds");
98 Bounds&
bounds = map.bounds;
108 for (cXMLElement *nodeElem : mapRoot->getChildrenByTagName(
"node")) {
109 Node *node =
new Node();
110 node->id =
parseId(nodeElem->getAttribute(
"id"));
111 node->lat =
parseDouble(nodeElem->getAttribute(
"lat"));
112 node->lon =
parseDouble(nodeElem->getAttribute(
"lon"));
113 map.parseTags(nodeElem, node->tags);
114 map.nodes.push_back(node);
115 nodeById[node->id] = node;
118 for (cXMLElement *wayElem : mapRoot->getChildrenByTagName(
"way")) {
119 Way *way =
new Way();
120 way->id =
parseId(wayElem->getAttribute(
"id"));
121 for (cXMLElement *nodeElem : wayElem->getChildrenByTagName(
"nd")) {
123 auto it = nodeById.find(ref);
124 if (it == nodeById.end())
125 throw cRuntimeError(
"Referenced node not found at %s", nodeElem->getSourceLocation());
126 Node *node = it->second;
127 way->nodes.push_back(node);
129 map.parseTags(wayElem, way->tags);
130 map.ways.push_back(way);
131 wayById[way->id] = way;
134 for (cXMLElement *relationElem : mapRoot->getChildrenByTagName(
"relation")) {
135 Relation *relation =
new Relation();
136 relation->id =
parseId(relationElem->getAttribute(
"id"));
137 for (cXMLElement *memberElem : relationElem->getChildrenByTagName(
"member")) {
139 const char *
type = memberElem->getAttribute(
"type");
140 id_t ref =
parseId(memberElem->getAttribute(
"ref"));
141 if (strcmp(
type,
"node") == 0) {
143 auto it = nodeById.find(ref);
144 member.resolved = (it != nodeById.end());
146 member.node = it->second;
148 member.unresolvedId = ref;
150 else if (strcmp(
type,
"way") == 0) {
152 auto it = wayById.find(ref);
153 member.resolved = (it != wayById.end());
155 member.way = it->second;
157 member.unresolvedId = ref;
159 else if (strcmp(
type,
"relation") == 0) {
161 auto it = relationById.find(ref);
162 member.resolved = (it != relationById.end());
164 member.relation = it->second;
166 member.unresolvedId = ref;
169 throw cRuntimeError(
"Invalid member type '%s' at %s",
type, memberElem->getSourceLocation());
171 member.role = map.getPooled(memberElem->getAttribute(
"role"));
172 relation->members.push_back(member);
174 map.parseTags(relationElem, relation->tags);
175 map.relations.push_back(relation);
176 relationById[relation->id] = relation;
180 for (
const Relation *relation : map.relations) {
181 for (Member& member :
const_cast<Relation *
>(relation)->members) {
183 auto it = relationById.find(member.unresolvedId);
184 if (it != relationById.end()) {
185 member.resolved =
true;
186 member.relation = it->second;