| 144 | |
| 145 | |
| 146 | RdbPointcloud::RdbPointcloud( |
| 147 | const std::string& location, |
| 148 | const std::string& filter, |
| 149 | const bool extras |
| 150 | ): |
| 151 | m_context(), |
| 152 | m_pointcloud(m_context), |
| 153 | m_crs_wkt(), |
| 154 | m_crs_epsg(0), |
| 155 | m_crs_pose(), |
| 156 | m_select_buffer(), |
| 157 | m_select_query(), |
| 158 | m_select_index(0), |
| 159 | m_select_count(0), |
| 160 | m_buffer_size(100*1000), |
| 161 | m_buffer_px(), |
| 162 | m_buffer_py(), |
| 163 | m_buffer_pz(), |
| 164 | m_buffer_nx(), |
| 165 | m_buffer_ny(), |
| 166 | m_buffer_nz() |
| 167 | { |
| 168 | using namespace pdal::Dimension; |
| 169 | using namespace riegl::rdb::pointcloud; |
| 170 | |
| 171 | // open database |
| 172 | OpenSettings settings(m_context); |
| 173 | settings.cacheSize = 0; // no cache required, because we only read once |
| 174 | m_pointcloud.open(location, settings); |
| 175 | |
| 176 | // query spatial reference system |
| 177 | if (m_pointcloud.metaData().exists("riegl.geo_tag")) |
| 178 | { |
| 179 | NL::json node; |
| 180 | |
| 181 | try |
| 182 | { |
| 183 | std::string s = m_pointcloud.metaData().get("riegl.geo_tag"); |
| 184 | node = NL::json::parse(s); |
| 185 | if (node["crs"]["epsg"].is_number_integer()) |
| 186 | m_crs_epsg = node["crs"]["epsg"].get<int>(); |
| 187 | if (node["crs"]["wkt"].is_string()) |
| 188 | m_crs_wkt = node["crs"]["wkt"].get<std::string>(); |
| 189 | if (node["pose"].is_array()) |
| 190 | { |
| 191 | const NL::json pose = node["pose"]; |
| 192 | if ( (pose.size() == 4) && |
| 193 | (pose[0].size() == 4) && |
| 194 | (pose[1].size() == 4) && |
| 195 | (pose[2].size() == 4) && |
| 196 | (pose[3].size() == 4) |
| 197 | ) |
| 198 | { |
| 199 | Eigen::Matrix4d matrix; |
| 200 | for (int row = 0; row < 4; ++row) |
| 201 | for (int col = 0; col < 4; ++col) |
| 202 | { |
| 203 | matrix(row, col) = pose[row][col].get<double>(); |