Skip to content

Commit 03a811b

Browse files
committed
group / grid id を両方渡す
1 parent 69f1c86 commit 03a811b

File tree

4 files changed

+21
-22
lines changed

4 files changed

+21
-22
lines changed

src/polygon_mesh/area_mesh_factory.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace {
1313
* グリッド番号と、そのグリッドに属する CityObject のリストを対応付ける辞書です。
1414
*/
1515
using GridIDToObjectsMap = std::map<unsigned, std::list<const citygml::CityObject*>>;
16-
using GroupIDToObjectsMap = GridIDToObjectsMap;
16+
using GroupGridIDToObjectsMap = std::map<std::pair<unsigned, unsigned>, std::list<const citygml::CityObject*>>;
1717

1818
bool shouldSkipCityObj(const citygml::CityObject& city_obj, const MeshExtractOptions& options, const std::vector<geometry::Extent>& extents) {
1919
if (!options.exclude_city_object_outside_extent)
@@ -104,7 +104,7 @@ namespace plateau::polygonMesh {
104104
// 仕様上、あるオブジェクトのLOD i が存在すれば、同じオブジェクトの lod 0 to i-1 がすべて存在します。したがって、各オブジェクトは必ず上記グループのどれか1つに該当するはずです。
105105
// そのようにグループ分けする利点は、
106106
// 「高いLODを表示したが、低いLODにしか対応していない箇所が穴になってしまう」という状況で、穴をちょうど埋める範囲の低LODグループが存在することです。
107-
auto group_id_to_primary_objects_map = GroupIDToObjectsMap();
107+
auto group_id_to_primary_objects_map = GroupGridIDToObjectsMap();
108108
for (const auto& [grid_id, primary_objects_in_grid] : grid_id_to_primary_objects_map) {
109109
for (const auto& primary_object : primary_objects_in_grid) {
110110
// この CityObject について、最大でどのLODまで存在するか確認します。
@@ -127,11 +127,12 @@ namespace plateau::polygonMesh {
127127
}
128128

129129
// グループに追加します。
130-
unsigned group_id = options.highest_lod_only ? grid_id : grid_id * (PolygonMeshUtils::max_lod_in_specification_ + 1) + max_lod_in_obj; // highest_lod_only オプションが有効な場合 Grid id をそのまま使用
131-
if (group_id_to_primary_objects_map.find(group_id) == group_id_to_primary_objects_map.end())
132-
group_id_to_primary_objects_map[group_id] = std::list<const CityObject*>();
130+
unsigned group_id = grid_id * (PolygonMeshUtils::max_lod_in_specification_ + 1) + max_lod_in_obj;
131+
const auto group_grid_id = std::make_pair(group_id, grid_id);
132+
if (group_id_to_primary_objects_map.find(group_grid_id) == group_id_to_primary_objects_map.end())
133+
group_id_to_primary_objects_map[group_grid_id] = std::list<const CityObject*>();
133134

134-
group_id_to_primary_objects_map.at(group_id).push_back(primary_object);
135+
group_id_to_primary_objects_map.at(group_grid_id).push_back(primary_object);
135136
}
136137
}
137138

@@ -221,7 +222,7 @@ namespace plateau::polygonMesh {
221222
mesh_factory.incrementPrimaryIndex();
222223
}
223224
mesh_factory.optimizeMesh();
224-
merged_meshes.emplace(0, mesh_factory.releaseMesh());
225+
merged_meshes.emplace(std::make_pair(0,0), mesh_factory.releaseMesh());
225226

226227
return merged_meshes;
227228
}

src/polygon_mesh/area_mesh_factory.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace plateau::polygonMesh {
1010
/// グループIDと、その結合後Meshのmapです。
11-
using GridMergeResult = std::map<unsigned, std::unique_ptr<Mesh>>;
11+
using GridMergeResult = std::map<std::pair<unsigned, unsigned>, std::unique_ptr<Mesh>>;
1212

1313
/**
1414
* cityModel をグリッド状に分割し、各地物オブジェクトをグリッドに分類します。

src/polygon_mesh/mesh_extractor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ namespace {
5959
// 3D都市モデルをグループに分け、グループごとにメッシュをマージします。
6060
auto result = AreaMeshFactory::gridMerge(city_model, options, lod, geo_reference, extents);
6161
// グループごとのノードを追加します。
62-
for (auto& [group_id, mesh] : result) {
63-
auto node = Node("group" + std::to_string(group_id), std::move(mesh));
62+
for (auto& [group_grid_id, mesh] : result) {
63+
auto node = Node("group" + std::to_string(group_grid_id.first), std::move(mesh));
6464
lod_node.addChildNode(std::move(node));
6565
}
6666
}

src/polygon_mesh/tile_extractor.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ namespace {
4242
auto result = AreaMeshFactory::combine(city_models, options, lod, geo_reference, extents);
4343

4444
// グループごとのノードを追加します。
45-
for (auto& [group_id, mesh] : result) {
46-
auto node = Node("group" + std::to_string(group_id), std::move(mesh));
45+
for (auto& [group_grid_id, mesh] : result) {
46+
auto node = Node("group" + std::to_string(group_grid_id.first), std::move(mesh));
4747
lod_node.addChildNode(std::move(node));
4848
}
4949
}
@@ -87,17 +87,16 @@ namespace {
8787
// 3D都市モデルをグリッドに分け、グリッドごとにメッシュをマージします。
8888
auto result = AreaMeshFactory::gridMerge(city_model, options, lod, geo_reference, extents);
8989

90-
if (result.size() > 1) {
90+
if (options.grid_count_of_side > 1) {
9191
// 次のような階層構造を作ります:
9292
// model -> GRIDノード -> LODノード -> ノード
93-
for (auto& [grid_id, mesh] : result) {
93+
for (auto& [group_grid_id, mesh] : result) {
9494

95-
const auto& grid_name = "GRID_" + std::to_string(grid_id);
95+
const auto& grid_name = "GRID_" + std::to_string(group_grid_id.second);
9696
const auto& lod_name = "LOD" + std::to_string(lod);
97+
auto node = Node("group" + std::to_string(group_grid_id.first), std::move(mesh));
9798

98-
const auto grid_index = out_model.getRootNodeIndexByName(grid_name);
99-
auto node = Node("LOD" + std::to_string(lod), std::move(mesh));
100-
99+
const auto grid_index = out_model.getRootNodeIndexByName(grid_name);
101100
if (grid_index == -1) {
102101
// 存在しない場合 新しいグリッドノードとLODノードを作成
103102
auto grid_node = Node(grid_name);
@@ -127,13 +126,12 @@ namespace {
127126
// 次のような階層構造を作ります:
128127
// model -> LODノード -> ノード
129128
auto lod_node = Node("LOD" + std::to_string(lod));
130-
for (auto& [grid_id, mesh] : result) {
131-
auto node = Node("group" + std::to_string(grid_id), std::move(mesh));
129+
for (auto& [group_grid_id, mesh] : result) {
130+
auto node = Node("group" + std::to_string(group_grid_id.first), std::move(mesh));
132131
lod_node.addChildNode(std::move(node));
133132
}
134133
out_model.addNode(std::move(lod_node));
135-
}
136-
134+
}
137135
}
138136

139137
out_model.eraseEmptyNodes();

0 commit comments

Comments
 (0)