@@ -15,6 +15,7 @@ namespace {
1515 */
1616 using GridIDToObjectsMap = std::map<unsigned , std::list<const citygml::CityObject*>>;
1717 using GroupGridIDToObjectsMap = std::map<std::pair<unsigned , unsigned >, std::list<const citygml::CityObject*>>;
18+ using GroupGridIDToObjectsWithPathMap = std::map<std::pair<unsigned , unsigned >, std::list<std::pair<const citygml::CityObject*, std::string>>>;
1819
1920 bool shouldSkipCityObj (const citygml::CityObject& city_obj, const MeshExtractOptions& options, const std::vector<geometry::Extent>& extents) {
2021 if (!options.exclude_city_object_outside_extent )
@@ -169,27 +170,30 @@ namespace plateau::polygonMesh {
169170 AreaMeshFactory::combine (const CityModelVector& city_models, const MeshExtractOptions& options, unsigned lod,
170171 const plateau::geometry::GeoReference& geo_reference, const std::vector<plateau::geometry::Extent>& extents) {
171172
172- const auto & gmlPath = city_models->empty () || city_models->front ().expired () ? " " : city_models->front ().lock ()->getGmlPath ();
173- std::shared_ptr <std::vector<const CityObject*>> all_primary_city_objects = std::make_shared<std::vector<const CityObject*>>();
173+ // 各CityObjectとそのソースのgmlPathをペアで保持
174+ std::shared_ptr<std::vector<std::pair<const CityObject*, std::string>>> all_primary_city_objects =
175+ std::make_shared<std::vector<std::pair<const CityObject*, std::string>>>();
174176
175177 const auto & _city_models = *city_models;
176178 for (const auto & city_model : _city_models) {
177179
178180 if (city_model.expired ()) continue ; // 参照が切れている場合はスキップ
179181
182+ const auto & gmlPath = city_model.lock ()->getGmlPath ();
180183 auto city_objects =
181184 city_model.lock ()->getAllCityObjectsOfType (PrimaryCityObjectTypes::getPrimaryTypeMask ());
182185
183- all_primary_city_objects->insert (all_primary_city_objects->end (),
184- city_objects.begin (), city_objects.end ());
186+ for (const auto & city_obj : city_objects) {
187+ all_primary_city_objects->emplace_back (city_obj, gmlPath);
188+ }
185189 }
186190
187191 // LODレベルでグループ分けします。
188192 // グループIDとグリッドIDのペアをキーとし、グリッドIDは常に0(グリッド分割なし)
189- auto group_id_to_primary_objects_map = GroupGridIDToObjectsMap ();
193+ auto group_id_to_primary_objects_map = GroupGridIDToObjectsWithPathMap ();
190194 const auto & all_primary_city_objects_in_model = *all_primary_city_objects;
191195
192- for (const auto & primary_object : all_primary_city_objects_in_model) {
196+ for (const auto & [ primary_object, gmlPath] : all_primary_city_objects_in_model) {
193197 // この CityObject について、最大でどのLODまで存在するか確認します。
194198 unsigned max_lod_in_obj = PolygonMeshUtils::max_lod_in_specification_;
195199 for (unsigned target_lod = lod + 1 ; target_lod <= PolygonMeshUtils::max_lod_in_specification_; ++target_lod) {
@@ -216,9 +220,9 @@ namespace plateau::polygonMesh {
216220 const auto group_grid_id = std::make_pair (group_id, grid_id);
217221
218222 if (group_id_to_primary_objects_map.find (group_grid_id) == group_id_to_primary_objects_map.end ())
219- group_id_to_primary_objects_map[group_grid_id] = std::list<const CityObject*>();
223+ group_id_to_primary_objects_map[group_grid_id] = std::list<std::pair< const CityObject*, std::string> >();
220224
221- group_id_to_primary_objects_map.at (group_grid_id).push_back (primary_object);
225+ group_id_to_primary_objects_map.at (group_grid_id).emplace_back (primary_object, gmlPath );
222226 }
223227
224228 // グループごとにメッシュを結合します。
@@ -230,7 +234,7 @@ namespace plateau::polygonMesh {
230234 MeshFactory mesh_factory (nullptr , options, extents, geo_reference);
231235
232236 // グループ内の各主要地物のループ
233- for (const auto & primary_object : primary_objects) {
237+ for (const auto & [ primary_object, gmlPath] : primary_objects) {
234238 if (MeshExtractor::isTypeToSkip (primary_object->getType ())) continue ;
235239 if (MeshExtractor::shouldContainPrimaryMesh (lod, *primary_object)) {
236240 mesh_factory.addPolygonsInPrimaryCityObject (*primary_object, lod, gmlPath);
0 commit comments