Apollo 10.0
自动驾驶开放平台
header_xml_parser.cc
浏览该文件的文档.
1/* Copyright 2017 The Apollo Authors. All Rights Reserved.
2
3Licensed under the Apache License, Version 2.0 (the "License");
4you may not use this file except in compliance with the License.
5You may obtain a copy of the License at
6
7 http://www.apache.org/licenses/LICENSE-2.0
8
9Unless required by applicable law or agreed to in writing, software
10distributed under the License is distributed on an "AS IS" BASIS,
11WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12See the License for the specific language governing permissions and
13limitations under the License.
14=========================================================================*/
15
17
18#include <string>
19
20#include "absl/strings/str_cat.h"
21
24
25namespace {
26int GetLongZone(double longitude) {
27 double longZone = 0.0;
28 if (longitude < 0.0) {
29 longZone = ((180.0 + longitude) / 6.0) + 1;
30 } else {
31 longZone = (longitude / 6.0) + 31;
32 }
33 return static_cast<int>(longZone);
34}
35} // namespace
36
37namespace apollo {
38namespace hdmap {
39namespace adapter {
40
41Status HeaderXmlParser::Parse(const tinyxml2::XMLElement& xml_node,
42 PbHeader* header) {
43 auto header_node = xml_node.FirstChildElement("header");
44 if (!header_node) {
45 std::string err_msg = "xml data missing header";
47 }
48 std::string rev_major;
49 std::string rev_minor;
50 std::string database_name;
51 std::string version;
52 std::string date;
53 double north = 0.0;
54 double south = 0.0;
55 double west = 0.0;
56 double east = 0.0;
57 std::string vendor;
58 int checker =
59 UtilXmlParser::QueryStringAttribute(*header_node, "revMajor", &rev_major);
60 checker +=
61 UtilXmlParser::QueryStringAttribute(*header_node, "revMinor", &rev_minor);
62 checker +=
63 UtilXmlParser::QueryStringAttribute(*header_node, "name", &database_name);
64 checker +=
65 UtilXmlParser::QueryStringAttribute(*header_node, "version", &version);
66 checker += UtilXmlParser::QueryStringAttribute(*header_node, "date", &date);
67 checker += header_node->QueryDoubleAttribute("north", &north);
68 checker += header_node->QueryDoubleAttribute("south", &south);
69 checker += header_node->QueryDoubleAttribute("east", &east);
70 checker += header_node->QueryDoubleAttribute("west", &west);
71 checker +=
72 UtilXmlParser::QueryStringAttribute(*header_node, "vendor", &vendor);
73
74 if (checker != tinyxml2::XML_SUCCESS) {
75 std::string err_msg = "Error parsing header attributes";
77 }
78
79 auto geo_reference_node = header_node->FirstChildElement("geoReference");
80 if (!geo_reference_node) {
81 std::string err_msg = "Error parsing header geoReoference attributes";
83 }
84 auto geo_text = geo_reference_node->FirstChild()->ToText();
85 if (!geo_text) {
86 std::string err_msg = "Error parsing header geoReoference text";
88 }
89
90 // coordinate frame
91 std::string zone_id;
92 std::string from_coordinate = geo_text->Value();
93 auto projection_node = header_node->FirstChildElement("projection");
94 if (projection_node != nullptr) {
95 auto utm_node = projection_node->FirstChildElement("utm");
96 if (!utm_node) {
97 std::string err_msg = "Error parsing header utm node";
99 }
100 checker =
101 UtilXmlParser::QueryStringAttribute(*utm_node, "zoneID", &zone_id);
102 if (checker != tinyxml2::XML_SUCCESS) {
103 std::string err_msg = "Error parsing utm zone id attributes";
105 }
106 } else {
107 int eastZone = GetLongZone(east);
108 int westZone = GetLongZone(west);
109 if (eastZone != westZone) {
110 std::string err_msg = "unsupport data in more than one zones";
112 }
113 zone_id = std::to_string(westZone);
114 }
115
116 std::string to_coordinate =
117 absl::StrCat("+proj=utm +zone=", zone_id,
118 " +ellps=WGS84 +datum=WGS84 +units=m +no_defs");
120 to_coordinate);
121
122 header->set_version(version);
123 header->set_date(date);
124 header->mutable_projection()->set_proj(to_coordinate);
125 header->set_district(database_name);
126 header->set_rev_major(rev_major);
127 header->set_rev_minor(rev_minor);
128 header->set_left(west);
129 header->set_right(east);
130 header->set_top(north);
131 header->set_bottom(south);
132 header->set_vendor(vendor);
133
134 return Status::OK();
135}
136
137} // namespace adapter
138} // namespace hdmap
139} // namespace apollo
A general class to denote the return status of an API call.
Definition status.h:43
static Status OK()
generate a success status.
Definition status.h:60
Status SetConvertParam(const std::string &source_param, const std::string &dst_param)
static Status Parse(const tinyxml2::XMLElement &xml_node, PbHeader *header)
static tinyxml2::XMLError QueryStringAttribute(const tinyxml2::XMLElement &xml_node, const std::string &name, std::string *value)
class register implement
Definition arena_queue.h:37