Skip to content

Commit 829fae7

Browse files
authored
DatasetAccessor.GetGmlFiles 利便性向上 (Synesthesias#151)
* DatasetAccessor.GetGmlFilesを実装 * 同上 * LocalDatasetAccessor::getGmlFiles() と ServerDatasetAccessor::getGmlFiles() の引数のパッケージを複数指定に対応。そのテストを記述。 * テスト微修正 * サーバーからのjsonで featureTypes : null が含まれても動作するようにしました
1 parent dcc484d commit 829fae7

File tree

14 files changed

+329
-48
lines changed

14 files changed

+329
-48
lines changed

data/日本語パステスト/udx/tran/533925_tran_6697_op.gml

Lines changed: 190 additions & 0 deletions
Large diffs are not rendered by default.

include/plateau/dataset/i_dataset_accessor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ namespace plateau::dataset {
6666
public:
6767
/**
6868
* \brief GMLファイル群のうち、範囲が extent の内部であり、パッケージ種が package であるものを vector で返します。
69+
* なお、 package はフラグの集合と見なされるので、複数のビットを立てることで複数の指定が可能です。
6970
*/
7071
virtual std::shared_ptr<std::vector<GmlFile>> getGmlFiles(const PredefinedCityModelPackage package) = 0;
7172

src/c_wrapper/vector_c.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ extern "C"{
88
using namespace plateau::network;
99

1010
/**
11-
* vector<任意の型> を P/Invoke で扱うための6つのメソッドを生成するマクロです
12-
* 6つのメソッドとは
11+
* vector<任意の型> を P/Invoke で扱うための7つのメソッドを生成するマクロです
12+
* そのメソッドとは
1313
* 1: plateau_create_vector_FUNC_NAME (new)
1414
* 2: plateau_delete_vector_FUNC_NAME (delete),
1515
* 3: plateau_vector_FUNC_NAME_get_pointer (要素のポインタを取得),
1616
* 4: plateau_vector_FUNC_NAME_get_value (要素の値を取得)
1717
* 5: plateau_vector_FUNC_NAME_count (要素数を取得)
18-
* 6: plateau_vector_FUNC_NAME_push_back_value (値渡しで要素を追加)
18+
* 6: plateau_vector_FUNC_NAME_push_back_value (要素を追加, 値渡し)
19+
* 7: plateau_vector_FUNC_NAME_push_back_copy_of_ref (要素を追加, ポインタ渡しでポインタの参照先のコピーを追加)
1920
* です。
2021
* なお通常は、 3か4のどちらか片方は利用しないはずです。
2122
* vectorの要素は実体で保持されます。
@@ -56,7 +57,12 @@ LIBPLATEAU_C_EXPORT APIResult LIBPLATEAU_API plateau_create_vector_ ## FUNC_NAME
5657
DLL_2_ARG_FUNC (plateau_vector_ ## FUNC_NAME ## _push_back_value,\
5758
std::vector< VECTOR_ELEMENT_TYPE >* const vector, \
5859
VECTOR_ELEMENT_TYPE element, \
59-
vector->push_back(element))
60+
vector->push_back(element)) \
61+
\
62+
DLL_2_ARG_FUNC(plateau_vector_ ## FUNC_NAME ## _push_back_copy_of_ref, \
63+
std::vector< VECTOR_ELEMENT_TYPE >* const vector, \
64+
VECTOR_ELEMENT_TYPE* element_ptr, /*NOLINT*/ \
65+
vector->push_back(*element_ptr))
6066

6167
PLATEAU_VECTOR(gml_file, GmlFile)
6268
PLATEAU_VECTOR(mesh_code, MeshCode)

src/dataset/local_dataset_accessor.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,27 @@ namespace plateau::dataset {
185185
return result;
186186
}
187187

188-
void LocalDatasetAccessor::getGmlFiles(PredefinedCityModelPackage package, std::vector<GmlFile>& gml_files) {
189-
if (files_.find(package) == files_.end())
190-
return;
191-
192-
for (const auto& file : files_[package]) {
193-
if(!file.isValid()) continue;
194-
gml_files.push_back(file);
188+
void LocalDatasetAccessor::getGmlFiles(PredefinedCityModelPackage package_flags, std::vector<GmlFile>& gml_files) {
189+
auto package_num = static_cast<std::underlying_type<PredefinedCityModelPackage>::type>(package_flags);
190+
int i = 0;
191+
while(package_num > 0){
192+
if((package_num & 1) == 1){
193+
// フラグが立っている各パッケージについて
194+
auto package = (PredefinedCityModelPackage)(1 << i);
195+
if (files_.find(package) != files_.end()){
196+
// そのパッケージのファイルが存在すれば追加します。
197+
for (const auto& file : files_[package]) {
198+
if(file.isValid()){
199+
gml_files.push_back(file);
200+
}
201+
}
202+
}
203+
}
204+
++i;
205+
package_num >>= 1;
195206
}
207+
208+
196209
}
197210

198211
std::string LocalDatasetAccessor::getU8RelativePath(const std::string& path) const {

src/dataset/local_dataset_accessor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ namespace plateau::dataset {
5454
/**
5555
* \brief packageに該当するCityGMLファイルを取得します。
5656
* なければ空のvectorを返します。
57-
* \param package 都市モデルパッケージ
57+
* \param package_flags 都市モデルパッケージ
5858
* \param gml_files 取得結果の格納先
5959
*/
60-
void getGmlFiles(PredefinedCityModelPackage package, std::vector<GmlFile>& gml_files) override;
60+
void getGmlFiles(PredefinedCityModelPackage package_flags, std::vector<GmlFile>& gml_files) override;
6161

6262
/**
6363
* \brief packageに該当するCityGMLファイルの個数を取得します。

src/dataset/server_dataset_accessor.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,13 @@ namespace plateau::dataset {
3838
}
3939

4040
void ServerDatasetAccessor::getGmlFiles(
41-
const PredefinedCityModelPackage package,
41+
const PredefinedCityModelPackage package_flags,
4242
std::vector<GmlFile>& out_gml_files) {
4343

44+
auto arg_package_num = static_cast<std::underlying_type<PredefinedCityModelPackage>::type>(package_flags);
4445
for (const auto& [sub_folder, gml_files] : dataset_files_) {
45-
if (UdxSubFolder::getPackage(sub_folder) == package) {
46+
auto data_package_num = static_cast<std::underlying_type<PredefinedCityModelPackage>::type>(UdxSubFolder::getPackage(sub_folder));
47+
if ((data_package_num & arg_package_num) != 0) { // フラグ群の積集合が1つ以上あるなら、引数の package のどれかに合致するので追加
4648
for (const auto& dataset_file : gml_files) {
4749
out_gml_files.emplace_back(dataset_file.url, client_, dataset_file.max_lod);
4850
}

src/dataset/server_dataset_accessor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace plateau::dataset {
2020

2121
std::set<MeshCode>& getMeshCodes() override;
2222
std::shared_ptr<std::vector<GmlFile>> getGmlFiles(const PredefinedCityModelPackage package) override;
23-
void getGmlFiles(const PredefinedCityModelPackage package, std::vector<GmlFile>& out_gml_files) override;
23+
void getGmlFiles(const PredefinedCityModelPackage package_flags, std::vector<GmlFile>& out_gml_files) override;
2424

2525
TVec3d calculateCenterPoint(const plateau::geometry::GeoReference& geo_reference) override;
2626

src/network/client.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,11 @@ namespace plateau::network {
7878
dataset_metadata.title = json_dataset_metadata.at("title");
7979
dataset_metadata.description = json_dataset_metadata.at("description");
8080
if (json_dataset_metadata.contains("featureTypes")) {
81-
dataset_metadata.feature_types = json_dataset_metadata.at("featureTypes");
81+
auto json_feature_types = json_dataset_metadata.at("featureTypes");
82+
if(json_feature_types.is_array()) { // featureTypes : null の場合を除外
83+
dataset_metadata.feature_types = json_feature_types;
84+
}
85+
8286
}
8387
dataset_metadata_group.datasets.push_back(dataset_metadata);
8488
}

test/test_dataset.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,40 @@ class DatasetTest : public ::testing::Test {
4141
std::shared_ptr<IDatasetAccessor> local_dataset_accessor;
4242
};
4343

44-
TEST_F(DatasetTest, getAllGmls) { // NOLINT
45-
const std::vector expected_bldg_files =
46-
{ std::filesystem::u8path(u8"../data/日本語パステスト/udx/bldg/53392642_bldg_6697_op2.gml").make_preferred().u8string() };
44+
TEST_F(DatasetTest, getGmlsLocal) { // NOLINT
45+
const std::vector expected_files =
46+
{ std::filesystem::u8path(u8"../data/日本語パステスト/udx/bldg/53392642_bldg_6697_op2.gml").make_preferred().u8string(),
47+
std::filesystem::u8path( u8"../data/日本語パステスト/udx/tran/533925_tran_6697_op.gml").make_preferred().u8string() };
4748
std::vector<std::string> actual_files;
48-
const auto gml_files = local_dataset_accessor->getGmlFiles(PredefinedCityModelPackage::Building);
49+
auto packages = PredefinedCityModelPackage::Building | PredefinedCityModelPackage::Road;
50+
const auto gml_files = local_dataset_accessor->getGmlFiles(packages);
4951
for (const auto& gml_file : *gml_files) {
5052
actual_files.push_back(gml_file.getPath());
5153
}
54+
checkVectors(expected_files, actual_files);
55+
}
5256

53-
checkVectors(expected_bldg_files, actual_files);
57+
TEST_F(DatasetTest, getGmlsServer) { // NOLINT
58+
const auto source = DatasetSource::createServer("23ku", Client::createClientForMockServer());
59+
const auto accessor = source.getAccessor();
60+
const auto gml_files = accessor->getGmlFiles(PredefinedCityModelPackage::Building | PredefinedCityModelPackage::LandUse);
61+
auto actual_gml_files = std::vector<std::string>();
62+
for(const auto& gml_file : *gml_files){
63+
actual_gml_files.push_back(gml_file.getPath());
64+
}
65+
const std::vector<std::string> expected_files = {
66+
u8"https://plateau-api-mock-v2.deta.dev/13100_tokyo23-ku_2020_citygml_3_2_op/udx/bldg/53392642_bldg_6697_2_op.gml",
67+
u8"https://plateau-api-mock-v2.deta.dev/13100_tokyo23-ku_2020_citygml_3_2_op/udx/bldg/53392670_bldg_6697_2_op.gml",
68+
u8"https://plateau-api-mock-v2.deta.dev/13100_tokyo23-ku_2020_citygml_3_2_op/udx/luse/533926_luse_6668_2_op.gml",
69+
u8"https://plateau-api-mock-v2.deta.dev/13100_tokyo23-ku_2020_citygml_3_2_op/udx/luse/533926_luse_6668_2_op.gml",
70+
u8"https://plateau-api-mock-v2.deta.dev/13100_tokyo23-ku_2020_citygml_3_2_op/udx/luse/533926_luse_6697_park_op.gml"
71+
};
72+
checkVectors(expected_files, actual_gml_files);
5473
}
5574

5675
TEST_F(DatasetTest, getAllMeshCodes) { // NOLINT
5776
const auto& mesh_codes = local_dataset_accessor->getMeshCodes();
58-
ASSERT_EQ(mesh_codes.size(), 1);
77+
ASSERT_TRUE(mesh_codes.size() > 0);
5978
}
6079

6180
namespace {

test/test_dataset_source.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace plateau::dataset {
1919
std::move(DatasetSource::createLocal(u8"../data/日本語パステスト")));
2020
auto accessor = source->getAccessor();
2121
auto mesh_code_str = accessor->getMeshCodes().begin()->get();
22-
ASSERT_EQ(mesh_code_str, "53392642");
22+
ASSERT_EQ(mesh_code_str, "533925");
2323
}
2424

2525
TEST_F(DatasetSourceTest, get_accessor_of_server_source_returns_server_accessor) { // NOLINT

0 commit comments

Comments
 (0)