Skip to content

Commit 1870eec

Browse files
committed
gridCode移行
1 parent 8572c2e commit 1870eec

File tree

9 files changed

+238
-21
lines changed

9 files changed

+238
-21
lines changed

include/plateau/dataset/grid_code.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
#include "plateau/geometry/geo_coordinate.h"
77

88
namespace plateau::dataset {
9+
class StandardMapGrid;
10+
class MeshCode;
11+
912
/**
1013
* \brief 地図の区画を表すコードの基底クラスです。
1114
*
@@ -38,7 +41,8 @@ namespace plateau::dataset {
3841
/**
3942
* \brief 1段階上のレベルのグリッドコードに変換します。
4043
*/
41-
virtual std::shared_ptr<GridCode> upper() = 0;
44+
virtual std::shared_ptr<GridCode> upper() const = 0;
45+
virtual GridCode* upperRaw() const = 0;
4246

4347
/**
4448
* \brief コードのレベル(詳細度)を取得します。
@@ -51,6 +55,18 @@ namespace plateau::dataset {
5155
*/
5256
virtual bool isLargestLevel() const = 0;
5357

58+
/**
59+
* \brief コードのレベル(詳細度)が、PLATEAUの典型的な建物のGMLファイルのレベルよりも小さい場合にtrueを返します。
60+
*/
61+
virtual bool isSmallerThanNormalGml() const = 0;
62+
63+
/**
64+
* \brief コードのレベル(詳細度)が、PLATEAUの典型的な建物のGMLファイルのレベルである場合にtrueを返します。
65+
*/
66+
virtual bool isNormalGmlLevel() const = 0;
67+
68+
bool isMeshCode() const;
69+
5470
/**
5571
* \brief 与えられたコードから適切なGridCodeの派生クラスのインスタンスを作成します。
5672
* \param code コード文字列

include/plateau/dataset/invalid_grid_code.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,17 @@ namespace plateau::dataset {
4848
* \brief 1段階上のレベルのグリッドコードに変換します。
4949
* \return 無効なグリッドコードを返します。
5050
*/
51-
std::shared_ptr<GridCode> upper() override {
51+
std::shared_ptr<GridCode> upper() const override {
5252
return std::make_shared<InvalidGridCode>();
5353
}
5454

55+
GridCode* upperRaw() const override {
56+
return new InvalidGridCode();
57+
}
58+
5559
int getLevel() const override { return -1; }
5660
bool isLargestLevel() const override { return true; }
61+
bool isSmallerThanNormalGml() const override { return false; }
62+
bool isNormalGmlLevel() const override { return true; }
5763
};
5864
}

include/plateau/dataset/mesh_code.h

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace plateau::dataset {
1313
*
1414
* 2~5次メッシュの緯度経度範囲の取得、緯度経度範囲を内包する3次メッシュの取得を行う機能を提供しています。
1515
*/
16-
class LIBPLATEAU_EXPORT MeshCode : public GridCode {
16+
class LIBPLATEAU_EXPORT MeshCode : public plateau::dataset::GridCode {
1717
public:
1818
explicit MeshCode(const std::string& code);
1919
MeshCode() = default;
@@ -61,7 +61,8 @@ namespace plateau::dataset {
6161
/**
6262
* \brief レベル2以上の範囲で1段階上のレベルの地域メッシュに変換します。
6363
*/
64-
std::shared_ptr<GridCode> upper() override;
64+
std::shared_ptr<GridCode> upper() const override;
65+
GridCode* upperRaw() const override;
6566

6667
/**
6768
* \brief メッシュコードが適切な値かどうかを返します。
@@ -72,24 +73,26 @@ namespace plateau::dataset {
7273
* \brief コードのレベル(詳細度)が、PLATEAUの仕様上考えられる中でもっとも大きいものであるときにtrueを返します。
7374
*/
7475
bool isLargestLevel() const override;
76+
bool isSmallerThanNormalGml() const override;
77+
bool isNormalGmlLevel() const override;
7578

7679
bool operator==(const MeshCode& other) const;
7780

7881

7982

8083
private:
81-
int first_row_;
82-
int first_col_;
83-
int second_row_;
84-
int second_col_;
85-
int third_row_;
86-
int third_col_;
87-
int fourth_row_;
88-
int fourth_col_;
89-
int fifth_row_;
90-
int fifth_col_;
91-
int level_;
92-
bool is_valid_;
84+
int first_row_ = 0;
85+
int first_col_ = 0;
86+
int second_row_ = 0;
87+
int second_col_ = 0;
88+
int third_row_ = 0;
89+
int third_col_ = 0;
90+
int fourth_row_ = 0;
91+
int fourth_col_ = 0;
92+
int fifth_row_ = 0;
93+
int fifth_col_ = 0;
94+
int level_ = 0;
95+
bool is_valid_ = false;
9396

9497
static void nextRow(MeshCode& mesh_code);
9598
static void nextCol(MeshCode& mesh_code);

include/plateau/dataset/standard_map_grid.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ namespace plateau::dataset {
4040
/**
4141
* \brief 1段階上のレベルのグリッドコードに変換します。
4242
*/
43-
std::shared_ptr<GridCode> upper() override;
43+
std::shared_ptr<GridCode> upper() const override;
44+
GridCode* upperRaw() const override;
4445

4546
/**
4647
* \brief コードのレベル(詳細度)を取得します。
@@ -51,6 +52,8 @@ namespace plateau::dataset {
5152
* \brief コードのレベル(詳細度)が、PLATEAUの仕様上考えられる中でもっとも大きいものであるときにtrueを返します。
5253
*/
5354
bool isLargestLevel() const override;
55+
bool isSmallerThanNormalGml() const override;
56+
bool isNormalGmlLevel() const override;
5457

5558
bool operator==(const StandardMapGrid& other) const;
5659
bool operator<(StandardMapGrid& other) const;

src/c_wrapper/grid_code_c.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,42 @@ extern "C" {
3939
GridCode,
4040
handle->get())
4141

42+
DLL_2_ARG_FUNC(plateau_grid_code_is_largest_level,
43+
const GridCode* grid_code,
44+
bool* out_is_largest_level,
45+
if (grid_code == nullptr) { *out_is_largest_level = false; return APIResult::ErrorInvalidArgument; }
46+
*out_is_largest_level = grid_code->isLargestLevel()
47+
)
48+
49+
DLL_2_ARG_FUNC(plateau_grid_code_is_smaller_than_normal_gml,
50+
const GridCode* grid_code,
51+
bool* out_is_smaller_than_normal_gml,
52+
if (grid_code == nullptr) { *out_is_smaller_than_normal_gml = false; return APIResult::ErrorInvalidArgument; }
53+
*out_is_smaller_than_normal_gml = grid_code->isSmallerThanNormalGml())
54+
55+
DLL_2_ARG_FUNC(plateau_grid_code_is_normal_gml_level,
56+
const GridCode* grid_code,
57+
bool* out_is_normal_gml_level,
58+
if (grid_code == nullptr) { *out_is_normal_gml_level = false; return APIResult::ErrorInvalidArgument; }
59+
*out_is_normal_gml_level = grid_code->isNormalGmlLevel())
60+
4261
LIBPLATEAU_C_EXPORT APIResult LIBPLATEAU_C_API plateau_grid_code_delete(
4362
GridCode* grid_code
4463
) {
4564
delete grid_code;
4665
return APIResult::Success;
4766
}
67+
68+
LIBPLATEAU_C_EXPORT APIResult LIBPLATEAU_C_API plateau_grid_code_upper(
69+
const GridCode* grid_code,
70+
GridCode** out_upper_grid_code
71+
) {
72+
API_TRY{
73+
if (grid_code == nullptr) return APIResult::ErrorInvalidArgument;
74+
*out_upper_grid_code = grid_code->upperRaw();
75+
return APIResult::Success;
76+
}
77+
API_CATCH;
78+
return APIResult::ErrorUnknown;
79+
}
4880
}

src/dataset/mesh_code.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,15 @@ namespace plateau::dataset {
253253
return result;
254254
}
255255

256-
std::shared_ptr<GridCode> MeshCode::upper() {
256+
std::shared_ptr<GridCode> MeshCode::upper() const {
257257
// レベル2以上の範囲で1段階上のレベルの地域メッシュに変換
258-
auto new_mesh_code = std::make_shared<MeshCode>(*this);
258+
auto new_mesh_code = std::shared_ptr<GridCode>(upperRaw());
259+
return new_mesh_code;
260+
}
261+
262+
GridCode* MeshCode::upperRaw() const { ||
263+
// レベル2以上の範囲で1段階上のレベルの地域メッシュに変換
264+
auto new_mesh_code = new MeshCode(*this);
259265
new_mesh_code->level_ = std::max(1, level_ - 1);
260266
if (new_mesh_code->level_ < 2)
261267
new_mesh_code->is_valid_ = false;
@@ -305,11 +311,20 @@ namespace plateau::dataset {
305311
return getLevel() == 2;
306312
}
307313

314+
bool MeshCode::isSmallerThanNormalGml() const {
315+
return getLevel() >= 4;
316+
}
317+
318+
bool MeshCode::isNormalGmlLevel() const {
319+
return getLevel() == 3;
320+
}
321+
308322
bool MeshCode::operator==(const MeshCode& other) const {
309323
return get() == other.get();
310324
}
311325

312326

327+
313328
void MeshCode::nextCol(MeshCode& mesh_code) {
314329
if (mesh_code.third_col_ < third_division_count - 1) {
315330
mesh_code.third_col_ += 1;

src/dataset/standard_map_grid.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,14 @@ namespace plateau::dataset {
4040
return is_valid_;
4141
}
4242

43-
std::shared_ptr<GridCode> StandardMapGrid::upper() {
43+
std::shared_ptr<GridCode> StandardMapGrid::upper() const {
4444
// 仮実装: 自分自身のコピーを返す
45-
return std::make_shared<StandardMapGrid>(code_);
45+
return std::shared_ptr<GridCode>(upperRaw());
46+
}
47+
48+
GridCode* StandardMapGrid::upperRaw() const {
49+
// 仮実装: 自分自身のコピーを返す
50+
return new StandardMapGrid(code_);
4651
}
4752

4853
int StandardMapGrid::getLevel() const {
@@ -55,6 +60,16 @@ namespace plateau::dataset {
5560
return true;
5661
}
5762

63+
bool StandardMapGrid::isSmallerThanNormalGml() const {
64+
// 仮実装
65+
return false;
66+
}
67+
68+
bool StandardMapGrid::isNormalGmlLevel() const {
69+
// 仮実装: 常にtrueを返す
70+
return true;
71+
}
72+
5873
bool StandardMapGrid::operator==(const StandardMapGrid& other) const {
5974
return code_ == other.code_;
6075
}

src/plateau/dataset/grid_code.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include "plateau/dataset/grid_code.h"
2+
#include "plateau/dataset/mesh_code.h"
3+
#include "plateau/dataset/standard_map_grid.h"
4+
#include <stdexcept>
5+
6+
namespace plateau::dataset {
7+
8+
bool GridCode::isMeshCode() const {
9+
return dynamic_cast<const MeshCode*>(this) != nullptr;
10+
}
11+
12+
std::shared_ptr<GridCode> GridCode::create(const std::string& code) {
13+
// Try creating as MeshCode
14+
try {
15+
auto meshCode = std::make_shared<MeshCode>(code);
16+
if (meshCode->isValid()) {
17+
return meshCode;
18+
}
19+
} catch (const std::invalid_argument&) {
20+
// Ignore and try StandardMapGrid
21+
}
22+
23+
// Try creating as StandardMapGrid
24+
try {
25+
auto standardMapGrid = std::make_shared<StandardMapGrid>(code);
26+
if (standardMapGrid->isValid()) {
27+
return standardMapGrid;
28+
}
29+
} catch (const std::invalid_argument&) {
30+
// Ignore
31+
}
32+
33+
throw std::invalid_argument("Invalid code format: " + code);
34+
}
35+
36+
GridCode* GridCode::createRaw(const std::string& code) {
37+
// Try creating as MeshCode
38+
try {
39+
auto* meshCode = new MeshCode(code);
40+
if (meshCode->isValid()) {
41+
return meshCode;
42+
}
43+
delete meshCode;
44+
} catch (const std::invalid_argument&) {
45+
// Ignore and try StandardMapGrid
46+
}
47+
48+
// Try creating as StandardMapGrid
49+
try {
50+
auto* standardMapGrid = new StandardMapGrid(code);
51+
if (standardMapGrid->isValid()) {
52+
return standardMapGrid;
53+
}
54+
delete standardMapGrid;
55+
} catch (const std::invalid_argument&) {
56+
// Ignore
57+
}
58+
59+
throw std::invalid_argument("Invalid code format: " + code);
60+
}
61+
62+
}

wrappers/csharp/LibPLATEAU.NET/CSharpPLATEAU/Dataset/GridCode.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,47 @@ public override string ToString()
5757
return StringCode;
5858
}
5959

60+
public bool IsLargestLevel
61+
{
62+
get
63+
{
64+
var result = NativeMethods.plateau_grid_code_is_largest_level(Handle, out bool isLargestLevel);
65+
DLLUtil.CheckDllError(result);
66+
return isLargestLevel;
67+
}
68+
}
69+
70+
public bool IsSmallerThanNormalGml
71+
{
72+
get
73+
{
74+
var result = NativeMethods.plateau_grid_code_is_smaller_than_normal_gml(Handle, out bool isSmallerThanNormalGml);
75+
DLLUtil.CheckDllError(result);
76+
return isSmallerThanNormalGml;
77+
}
78+
}
79+
80+
public bool IsNormalGmlLevel
81+
{
82+
get
83+
{
84+
var result = NativeMethods.plateau_grid_code_is_normal_gml_level(Handle, out bool isNormalGmlLevel);
85+
DLLUtil.CheckDllError(result);
86+
return isNormalGmlLevel;
87+
}
88+
}
89+
90+
/// <summary>
91+
/// 1段階上のレベルのグリッドコードに変換します。
92+
/// </summary>
93+
/// <returns>1段階上のレベルのグリッドコードオブジェクト</returns>
94+
public GridCode Upper()
95+
{
96+
var result = NativeMethods.plateau_grid_code_upper(Handle, out var upperGridCodePtr);
97+
DLLUtil.CheckDllError(result);
98+
return new GridCode(upperGridCodePtr);
99+
}
100+
60101
public bool IsValid
61102
{
62103
get
@@ -108,6 +149,30 @@ internal static extern APIResult plateau_grid_code_get_string_code_size(
108149
out int strSize
109150
);
110151

152+
[DllImport(DLLUtil.DllName)]
153+
internal static extern APIResult plateau_grid_code_is_largest_level(
154+
[In] IntPtr gridCodePtr,
155+
[MarshalAs(UnmanagedType.U1)] out bool outIsLargestLevel
156+
);
157+
158+
[DllImport(DLLUtil.DllName)]
159+
internal static extern APIResult plateau_grid_code_is_smaller_than_normal_gml(
160+
[In] IntPtr gridCodePtr,
161+
[MarshalAs(UnmanagedType.U1)] out bool isSmallerThanNormalGml
162+
);
163+
164+
[DllImport(DLLUtil.DllName)]
165+
internal static extern APIResult plateau_grid_code_is_normal_gml_level(
166+
[In] IntPtr gridCodePtr,
167+
[MarshalAs(UnmanagedType.U1)] out bool isNormalGmlLevel
168+
);
169+
170+
[DllImport(DLLUtil.DllName)]
171+
internal static extern APIResult plateau_grid_code_upper(
172+
[In] IntPtr gridCodePtr,
173+
out IntPtr outUpperGridCodePtr
174+
);
175+
111176
[DllImport(DLLUtil.DllName)]
112177
internal static extern APIResult plateau_grid_code_get_string_code(
113178
[In] IntPtr gridCodePtr,

0 commit comments

Comments
 (0)