Skip to content

Commit 066488a

Browse files
authored
Merge pull request #64 from AsPJT/feature-binary-data-io
地理情報のバイナリデータの入出力機能を追加
2 parents ae192da + 3d111fe commit 066488a

File tree

17 files changed

+733
-243
lines changed

17 files changed

+733
-243
lines changed

.github/workflows/cmake-all-build.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: CMake-All-Build
1+
name: CMake-All-Build
22

33
on:
44
pull_request:
@@ -20,7 +20,9 @@ jobs:
2020
uses: actions/checkout@v3
2121

2222
- name: Checkout submodules
23-
run: git submodule update --init --recursive ExternalLibrary/googletest
23+
run: |
24+
git submodule update --init --recursive ExternalLibrary/googletest
25+
git submodule update --init --recursive ExternalLibrary/stb
2426
2527
- name: Install dependencies
2628
run: |

.github/workflows/cmake-build-on-push.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: CMake-Build-On-Push
1+
name: CMake-Build-On-Push
22

33
on:
44
push:
@@ -22,7 +22,9 @@ jobs:
2222
uses: actions/checkout@v3
2323

2424
- name: Checkout submodules
25-
run: git submodule update --init --recursive ExternalLibrary/googletest
25+
run: |
26+
git submodule update --init --recursive ExternalLibrary/googletest
27+
git submodule update --init --recursive ExternalLibrary/stb
2628
2729
- name: Install dependencies
2830
run: |

.github/workflows/cmake-unit-test.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: CMake-Unit-Test
1+
name: CMake-Unit-Test
22

33
on:
44
pull_request:
@@ -17,7 +17,9 @@ jobs:
1717
uses: actions/checkout@v3
1818

1919
- name: Checkout submodules
20-
run: git submodule update --init --recursive ExternalLibrary/googletest
20+
run: |
21+
git submodule update --init --recursive ExternalLibrary/googletest
22+
git submodule update --init --recursive ExternalLibrary/stb
2123
2224
- name: Install dependencies
2325
run: |

Library/PAX_GRAPHICA/InputFile.hpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,13 @@ namespace paxg {
148148
void splitStod(const char delimiter, double* const result, const std::size_t size) const {
149149
paxs::StringExtensions::splitStod(pline, delimiter, result, size);
150150
}
151-
// 区切り文字で分割する (SlopeDegF64ToU0To250)
152-
void splitSlopeDegF64ToU0To250(const char delimiter, unsigned char* const result, const std::size_t size) const {
153-
paxs::StringExtensions::splitSlopeDegF64ToU0To250(pline, delimiter, result, size);
151+
// 区切り文字で分割する (SlopeDegU8)
152+
void splitSlopeDegU8(const char delimiter, unsigned char* const result, const std::size_t size) const {
153+
paxs::StringExtensions::splitSlopeDegU8(pline, delimiter, result, size);
154+
}
155+
// 区切り文字で分割する (ElevationS16)
156+
void splitElevationS16(const char delimiter, std::int_least16_t* const result, const std::size_t size) const {
157+
paxs::StringExtensions::splitElevationS16(pline, delimiter, result, size);
154158
}
155159
// 区切り文字で分割する
156160
std::unordered_map<std::string, std::size_t> splitHashMap(const char delimiter) const {
@@ -165,8 +169,8 @@ namespace paxg {
165169
return pline;
166170
}
167171

168-
// バイナリ分割 (SlopeDegF64ToU0To250)
169-
std::size_t splitSlopeDegF64ToU0To250Binary(char* const result, const std::size_t size) {
172+
// バイナリ分割
173+
std::size_t splitBinary(char* const result, const std::size_t size) {
170174
pifs.seekg(0, std::ios::end);
171175
const std::size_t read_max_size = static_cast<std::size_t>(pifs.tellg()); // 最大サイズ
172176
pifs.seekg(0);

Library/PAX_MAHOROBA/XYZTiles.hpp

Lines changed: 176 additions & 103 deletions
Large diffs are not rendered by default.

Library/PAX_MAHOROBA/XYZTilesList.hpp

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ namespace paxs {
4141
const int draw_max_z = -1
4242
) {
4343
XYZTile xyz_tile(
44-
path + map_file_path,
44+
&path, "", map_file_path,
4545
("{z}/{n}_{z}_{x}_{y}"));
4646
if (map_url.size() != 0) xyz_tile.setMapURL(map_url);
4747
if (map_name.size() != 0) xyz_tile.setMapName(map_name);
@@ -61,29 +61,29 @@ namespace paxs {
6161
// 使用するマップの XYZ タイルの情報を定義
6262

6363
// mapMapInitOne(xyz_tile_list, path, map_view,
64-
// "map_base", "","", "Data/Map/XYZTile/Standard/Image/Land/2023/", -1, 7, -1, 7);
64+
// "map_base", nullptr,nullptr, "Data/Map/XYZTile/Standard/Image/Land/2023/", -1, 7, -1, 7);
6565
{
6666
XYZTile xyz_tile(
67-
path + "Data/Map/XYZTile/Standard/Image/Land/2023/",
67+
&path , "", "Data/Map/XYZTile/Standard/Image/Land/2023/",
6868
("{z}/{n}_{z}_{x}_{y}"));
6969
xyz_tile.setMapURL("");
7070
xyz_tile.setMapName("");
7171
xyz_tile.setMaxZ(7);
7272
xyz_tile.setDrawMaxZ(7);
73-
// xyz_tile_base->setMapFilePath(path + "Data/Map/XYZTile/LandAndSea/Image/GreenAndAlphaBinary/2023/");
73+
// xyz_tile_base->setMapFilePath(&path , "", "Data/Map/XYZTile/LandAndSea/Image/GreenAndAlphaBinary/2023/");
7474

7575
xyz_tile_list.emplace(MurMur3::calcHash("map_base"), xyz_tile);
7676
}
7777
{
7878
XYZTile xyz_tile(
79-
path + "Data/Map/XYZTile/LandAndWater/Image/GreenAndAlphaBinary/1868/",
79+
&path , "", "Data/Map/XYZTile/LandAndWater/Image/GreenAndAlphaBinary/1868/",
8080
("{z}/{n}_{z}_{x}_{y}"));
8181
xyz_tile.setMapURL("");
8282
xyz_tile.setMapName("gbank");
8383
xyz_tile.setMinZ(8);
8484
xyz_tile.setMaxZ(10);
8585
xyz_tile.setDrawMinZ(8);
86-
// xyz_tile.setMapFilePath(path + "Data/Map/XYZTile/LandAndWater/Image/BlackAndWhiteBinary/1868/");
86+
// xyz_tile.setMapFilePath(&path , "", "Data/Map/XYZTile/LandAndWater/Image/BlackAndWhiteBinary/1868/");
8787
// xyz_tile.setMapFilePath("./SavedMap/gbank_noblank_reclaimed_land/");
8888
xyz_tile_list.emplace(MurMur3::calcHash("map_land_and_water"), xyz_tile);
8989
}
@@ -95,7 +95,7 @@ namespace paxs {
9595
// xyz_tile_gmaps->setMapName("map");
9696
// // xyz_tile_gmaps->setDefaultZ(12);
9797
// // xyz_tile_gmaps->setDrawMinZ(11);
98-
// xyz_tile_gmaps->setMapFilePath(path + "Data/Map/XYZTile/GoogleMaps/");
98+
// xyz_tile_gmaps->setMapFilePath(&path , "", "Data/Map/XYZTile/GoogleMaps/");
9999

100100
// xyz_tile_list.emplace(MurMur3::calcHash("map_gmaps", *xyz_tile_gmaps);
101101
//}
@@ -124,7 +124,7 @@ namespace paxs {
124124
// xyz_tile_kuni->setMapName("ColorCodingByProvincesOfJapanWithLakes");
125125
// xyz_tile_kuni->setDefaultZ(10);
126126
// xyz_tile_kuni->setDrawMinZ(9);
127-
// xyz_tile_kuni->setMapFilePath(path + "Data/Map/XYZTile/ColorCodingByProvincesOfJapan/");
127+
// xyz_tile_kuni->setMapFilePath(&path , "", "Data/Map/XYZTile/ColorCodingByProvincesOfJapan/");
128128

129129
// xyz_tile_list.emplace(MurMur3::calcHash("map_ryosei_country", *xyz_tile_kuni);
130130
//}
@@ -136,7 +136,7 @@ namespace paxs {
136136
// xyz_tile_kuni_line->setMinZ(5);
137137
// xyz_tile_kuni_line->setMaxZ(9);
138138
// xyz_tile_kuni_line->setDrawMinZ(5);
139-
// xyz_tile_kuni_line->setMapFilePath(path + "Data/Map/XYZTile/RyoseikokuLine/");
139+
// xyz_tile_kuni_line->setMapFilePath(&path , "", "Data/Map/XYZTile/RyoseikokuLine/");
140140

141141
// xyz_tile_list.emplace(MurMur3::calcHash("map_ryosei_line", *xyz_tile_kuni_line);
142142
//}
@@ -150,7 +150,7 @@ namespace paxs {
150150
// xyz_tile_kuni_korean_line->setDrawMinZ(6);
151151
// xyz_tile_kuni_korean_line->setMinDate(1872272); // J 414-01-01
152152
// xyz_tile_kuni_korean_line->setMaxDate(1915370); // J 532-01-01 - 1
153-
// xyz_tile_kuni_korean_line->setMapFilePath(path + "Data/Map/XYZTile/KoreanLine/");
153+
// xyz_tile_kuni_korean_line->setMapFilePath(&path , "", "Data/Map/XYZTile/KoreanLine/");
154154

155155
// xyz_tile_list.emplace(MurMur3::calcHash("map_korean_line", *xyz_tile_kuni_korean_line);
156156
//}
@@ -164,7 +164,7 @@ namespace paxs {
164164
// xyz_tile_kuni_balhae_line->setDrawMinZ(3);
165165
// xyz_tile_kuni_balhae_line->setMinDate(1976003); // J 698-01-01
166166
// xyz_tile_kuni_balhae_line->setMaxDate(2059279); // J 926-01-01 - 1
167-
// xyz_tile_kuni_balhae_line->setMapFilePath(path + "Data/Map/XYZTile/BalhaeLine/");
167+
// xyz_tile_kuni_balhae_line->setMapFilePath(&path , "", "Data/Map/XYZTile/BalhaeLine/");
168168

169169
// xyz_tile_list.emplace(MurMur3::calcHash("map_balhae_line", *xyz_tile_kuni_balhae_line);
170170
//}
@@ -178,13 +178,13 @@ namespace paxs {
178178
// xyz_tile_kuni_silla_line->setDrawMinZ(3);
179179
// xyz_tile_kuni_silla_line->setMinDate(1915371); // J 532-01-01
180180
// xyz_tile_kuni_silla_line->setMaxDate(2059279); // J 926-01-01 - 1 // 暫定の値
181-
// xyz_tile_kuni_silla_line->setMapFilePath(path + "Data/Map/XYZTile/SillaLine/");
181+
// xyz_tile_kuni_silla_line->setMapFilePath(&path , "", "Data/Map/XYZTile/SillaLine/");
182182

183183
// xyz_tile_list.emplace(MurMur3::calcHash("map_silla_line", *xyz_tile_kuni_silla_line);
184184
//}
185185
{
186186
XYZTile xyz_tile(
187-
path + "Data/Map/XYZTile/Gokishichido/",
187+
&path , "", "Data/Map/XYZTile/Gokishichido/",
188188
("{z}/{n}_{z}_{x}_{y}"));
189189
xyz_tile.setMapURL("");
190190
xyz_tile.setMapName("zxy");
@@ -196,7 +196,7 @@ namespace paxs {
196196
}
197197
{
198198
XYZTile xyz_tile(
199-
path + "Data/Map/XYZTile/Kinai/",
199+
&path , "", "Data/Map/XYZTile/Kinai/",
200200
("{z}/{n}_{z}_{x}_{y}"));
201201
xyz_tile.setMapURL("");
202202
xyz_tile.setMapName("zxy");
@@ -207,7 +207,7 @@ namespace paxs {
207207
}
208208
{
209209
XYZTile xyz_tile(
210-
path + "Data/Map/XYZTile/Heijokyo/",
210+
&path , "", "Data/Map/XYZTile/Heijokyo/",
211211
("{z}/{n}_{z}_{x}_{y}"));
212212
xyz_tile.setMapURL("");
213213
xyz_tile.setMapName("zxy");
@@ -218,7 +218,7 @@ namespace paxs {
218218
}
219219
{
220220
XYZTile xyz_tile(
221-
path + "Data/Map/XYZTile/Soil/Image/Soil/2023/",
221+
&path , "", "Data/Map/XYZTile/Soil/Image/Soil/2023/",
222222
("{z}/{n}_{z}_{x}_{y}"));
223223
xyz_tile.setMapURL("");
224224
xyz_tile.setMapName("soil");
@@ -236,16 +236,29 @@ namespace paxs {
236236
// // xyz_tile_slope->setDefaultZ(8);
237237
// xyz_tile_slope->setMaxZ(8);
238238
// // xyz_tile_slope->setDrawMinZ(3);
239-
// // xyz_tile_slope->setMapFilePath(path + "Data/Map/XYZTile/Slope/Image/Slope/2023/");
240-
// xyz_tile_slope->setMapFilePath(path + "Data/Map/XYZTile/Slope/Image/Slope/2010/");
239+
// // xyz_tile_slope->setMapFilePath(&path , "", "Data/Map/XYZTile/Slope/Image/Slope/2023/");
240+
// xyz_tile_slope->setMapFilePath(&path , "", "Data/Map/XYZTile/Slope/Image/Slope/2010/");
241241

242242
// xyz_tile_list.emplace(MurMur3::calcHash("map_slope", *xyz_tile_slope);
243243
// }
244244
mapMapInitOne(xyz_tile_list, path, map_view,
245245
MurMur3::calcHash("map_slope"), "", "slope_pale", "Data/Map/XYZTile/Slope/Image/SlopePale20230920/2010/", -1, 8, -1, -1);
246246
{
247247
XYZTile xyz_tile(
248-
path + "Data/Map/XYZTile/RiversAndLakes/Image/RiversAndLakes/2023/",
248+
&path,
249+
"Data/Map/XYZTile/Slope/Data/SlopeData20231029/2010/",
250+
"Data/Map/XYZTile/Slope/Image/SlopePale20231029/2010/",
251+
("{z}/{n}_{z}_{x}_{y}"));
252+
xyz_tile.setMapURL("");
253+
xyz_tile.setMapName("zxy");
254+
//xyz_tile.setMaxZ(8);
255+
256+
xyz_tile_list.emplace(MurMur3::calcHash("map_slope_bin"), xyz_tile);
257+
}
258+
259+
{
260+
XYZTile xyz_tile(
261+
&path , "", "Data/Map/XYZTile/RiversAndLakes/Image/RiversAndLakes/2023/",
249262
("{z}/{n}_{z}_{x}_{y}"));
250263
xyz_tile.setMapURL("");
251264
xyz_tile.setMapName("water");
@@ -256,7 +269,7 @@ namespace paxs {
256269
}
257270
{
258271
XYZTile xyz_tile(
259-
path + "Data/Map/XYZTile/RiversAndLakes/Image/RiversAndLakesBW/2023/",
272+
&path , "", "Data/Map/XYZTile/RiversAndLakes/Image/RiversAndLakesBW/2023/",
260273
("{z}/{n}_{z}_{x}_{y}"));
261274
xyz_tile.setMapURL("");
262275
xyz_tile.setMapName("water");
@@ -267,7 +280,7 @@ namespace paxs {
267280
}
268281
{
269282
XYZTile xyz_tile(
270-
path + "Data/Map/XYZTile/Temperature/Image/SoilTemperature/2023/",
283+
&path , "", "Data/Map/XYZTile/Temperature/Image/SoilTemperature/2023/",
271284
("{z}/{n}_{z}_{x}_{y}"));
272285
xyz_tile.setMapURL("");
273286
xyz_tile.setMapName("soil-tem");
@@ -277,19 +290,19 @@ namespace paxs {
277290
}
278291
{
279292
XYZTile xyz_tile(
280-
"",
293+
nullptr, "", "",
281294
("{z}/{n}_{z}_{x}_{y}"));
282295
xyz_tile_list.emplace(MurMur3::calcHash("map_line2"), xyz_tile);
283296
}
284297
{
285298
XYZTile xyz_tile(
286-
"",
299+
nullptr, "", "",
287300
("{z}/{n}_{z}_{x}_{y}"));
288301
xyz_tile_list.emplace(MurMur3::calcHash("map_line3"), xyz_tile);
289302
}
290303
{
291304
XYZTile xyz_tile(
292-
"",
305+
nullptr, "", "",
293306
("{z}/{n}_{z}_{x}_{y}"));
294307
xyz_tile.setDefaultZ(18);
295308
xyz_tile_list.emplace(MurMur3::calcHash("map_line4"), xyz_tile);
@@ -352,6 +365,9 @@ namespace paxs {
352365
if (menu_bar.cgetPulldown(MurMur3::calcHash("map")).getIsItemsKey(MurMur3::calcHash("menu_bar_map_slope"))) {
353366
xyz_tile_list[MurMur3::calcHash("map_slope")].update(map_view_width, map_view_height, map_view_center_x, map_view_center_y);
354367
}
368+
if (menu_bar.cgetPulldown(MurMur3::calcHash("map")).getIsItemsKey(MurMur3::calcHash("menu_bar_map_slope"))) {
369+
xyz_tile_list[MurMur3::calcHash("map_slope_bin")].update(map_view_width, map_view_height, map_view_center_x, map_view_center_y);
370+
}
355371
if (menu_bar.cgetPulldown(MurMur3::calcHash("map")).getIsItemsKey(MurMur3::calcHash("menu_bar_map_slope"))) {
356372
xyz_tile_list[MurMur3::calcHash("map_gmaps")].update(map_view_width, map_view_height, map_view_center_x, map_view_center_y);
357373
}
@@ -399,6 +415,9 @@ namespace paxs {
399415
if (menu_bar.cgetPulldown(MurMur3::calcHash("map")).getIsItemsKey(MurMur3::calcHash("menu_bar_map_slope"))) {
400416
if (xyz_tile_list.find(MurMur3::calcHash("map_slope")) != xyz_tile_list.end()) xyz_tile_list.at(MurMur3::calcHash("map_slope")).draw(map_view_width, map_view_height, map_view_center_x, map_view_center_y, date);
401417
}
418+
if (menu_bar.cgetPulldown(MurMur3::calcHash("map")).getIsItemsKey(MurMur3::calcHash("menu_bar_map_slope"))) {
419+
if (xyz_tile_list.find(MurMur3::calcHash("map_slope_bin")) != xyz_tile_list.end()) xyz_tile_list.at(MurMur3::calcHash("map_slope_bin")).draw(map_view_width, map_view_height, map_view_center_x, map_view_center_y, date);
420+
}
402421
if (menu_bar.cgetPulldown(MurMur3::calcHash("map")).getIsItemsKey(MurMur3::calcHash("menu_bar_map_slope"))) {
403422
if (xyz_tile_list.find(MurMur3::calcHash("map_gmaps")) != xyz_tile_list.end()) xyz_tile_list.at(MurMur3::calcHash("map_gmaps")).draw(map_view_width, map_view_height, map_view_center_x, map_view_center_y, date);
404423
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*##########################################################################################
2+
3+
PAX SAPIENTICA Library 💀🌿🌏
4+
5+
[Planning] 2023 As Project
6+
[Production] 2023 As Project
7+
[Contact Us] [email protected] https://github.com/AsPJT/PAX_SAPIENTICA
8+
[License] Distributed under the CC0 1.0. https://creativecommons.org/publicdomain/zero/1.0/
9+
10+
##########################################################################################*/
11+
12+
#ifndef PAX_SAPIENTICA_GEOGRAPHIC_INFORMATION_CONVERT_TO_INT_HPP
13+
#define PAX_SAPIENTICA_GEOGRAPHIC_INFORMATION_CONVERT_TO_INT_HPP
14+
15+
/*##########################################################################################
16+
17+
##########################################################################################*/
18+
19+
#include <cmath>
20+
#include <cstdint>
21+
#include <limits>
22+
23+
namespace paxs {
24+
25+
constexpr double u8_max_p_log2_slope_max = 38.4154715724661; // 250 / log2(91)
26+
27+
// 傾斜を uint8 (0-250) から double (度)へ変換
28+
double slopeDegLog2U8ToF64(const unsigned char char_value_) {
29+
return (char_value_ >= 251u) ? std::numeric_limits<double>::quiet_NaN() : // 251 以上は NaN
30+
std::pow(2, char_value_ / u8_max_p_log2_slope_max) - 1.0; // 250 以下は値を変換
31+
}
32+
33+
// 傾斜(度)を double から uint8 (0-250) へ変換
34+
unsigned char slopeDegF64ToLog2U8(const double float_value_) {
35+
// NaN は 251
36+
if (float_value_ == std::numeric_limits<double>::quiet_NaN()) {
37+
return 251u;
38+
}
39+
// 90 度以上は 250
40+
else if (float_value_ >= 90.0) {
41+
return 250u;
42+
}
43+
// 0 度以下は 0
44+
else if (float_value_ <= 0.0) {
45+
return 0u;
46+
}
47+
return static_cast<unsigned char>(std::ceil(std::log2(float_value_ + 1.0) * u8_max_p_log2_slope_max));
48+
}
49+
50+
constexpr double s16_max_p_log2_elevation_max = 2440.16038278159; // 32760 / log2(11000 + 1)
51+
52+
// 標高を int16 から double (m) へ変換
53+
double elevationLog2S16ToF64(const std::int_least16_t char_value_) {
54+
return (char_value_ >= 32761) ? std::numeric_limits<double>::quiet_NaN() : // 32761 以上は NaN
55+
((char_value_ < 0) ? -std::pow(2, -char_value_ / s16_max_p_log2_elevation_max) + 1.0 : // 32760 以下は値を変換
56+
std::pow(2, char_value_ / s16_max_p_log2_elevation_max) - 1.0); // 32760 以下は値を変換
57+
}
58+
59+
// 標高 (m) を double から int16 へ変換
60+
std::int_least16_t elevationF64ToLog2S16(const double float_value_) {
61+
// NaN は 32761
62+
if (float_value_ == std::numeric_limits<double>::quiet_NaN()) {
63+
return 32761;
64+
}
65+
// 11,000 m 以上は 32760
66+
else if (float_value_ >= 11000.0) {
67+
return 32760;
68+
}
69+
// -11,000 m 以下は -32760
70+
else if (float_value_ <= -11000.0) {
71+
return -32760;
72+
}
73+
return (float_value_ < 0) ?
74+
static_cast<std::int_least16_t>(-std::ceil(std::log2(-float_value_ + 1.0) * s16_max_p_log2_elevation_max)) :
75+
static_cast<std::int_least16_t>(std::ceil(std::log2(float_value_ + 1.0) * s16_max_p_log2_elevation_max));
76+
}
77+
78+
}
79+
80+
#endif // !PAX_SAPIENTICA_GEOGRAPHIC_INFORMATION_CONVERT_TO_INT_HPP

0 commit comments

Comments
 (0)