Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C++でつくる歴史シミュレーションGIS
Search
As Project
February 11, 2024
Programming
0
540
C++でつくる歴史シミュレーションGIS
文献学・考古学・人類学データを用いたABS & GIS
各国・各時代の暦表示機能や各時代の環境復元機能を持つ
XYZタイルや地物を自由に追加することが可能
As Project
February 11, 2024
Tweet
Share
More Decks by As Project
See All by As Project
考古学・人類学・文献学のための次世代GISの開発―時間情報とAgent-based modelの活用―
aspjt
1
300
クソアプリハッカソン 2023
aspjt
0
75
世界を創造するOSS開発を始めた話
aspjt
0
110
Other Decks in Programming
See All in Programming
MCPサーバー「モディフィウス」で変更容易性の向上をスケールする / modifius
minodriven
4
830
Temporal Knowledge Graphで作る! 時間変化するナレッジを扱うAI Agentの世界
po3rin
5
1.2k
SwiftDataを使って10万件のデータを読み書きする
akidon0000
0
250
ネストしたdata classの面倒な更新にさようなら!Lensを作って理解するArrowのOpticsの世界
shiita0903
1
260
モテるデスク環境
mozumasu
3
1.4k
React Nativeならぬ"Vue Native"が実現するかも?_新世代マルチプラットフォーム開発フレームワークのLynxとLynxのVue.js対応を追ってみよう_Vue Lynx
yut0naga1_fa
2
2k
Making Angular Apps Smarter with Generative AI: Local and Offline-capable
christianliebel
PRO
0
110
問題の見方を変える「システム思考」超入門
panda_program
0
100
予防に勝る防御なし(2025年版) - 堅牢なコードを導く様々な設計のヒント / Growing Reliable Code PHP Conference Fukuoka 2025
twada
PRO
13
3.3k
data-viz-talk-cz-2025
lcolladotor
0
110
Migration to Signals, Resource API, and NgRx Signal Store
manfredsteyer
PRO
0
140
AI時代に必須!状況言語化スキル / ai-context-verbalization
minodriven
2
320
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.1k
What's in a price? How to price your products and services
michaelherold
246
12k
Testing 201, or: Great Expectations
jmmastey
46
7.7k
It's Worth the Effort
3n
187
28k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Designing for Performance
lara
610
69k
Building Applications with DynamoDB
mza
96
6.7k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
54k
The Cult of Friendly URLs
andyhume
79
6.7k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
Bash Introduction
62gerente
615
210k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Transcript
C++でつくる 歴史シミュレーションGIS C++ MIX #9 2023-02-09
GitHubリポジトリのQRコードと URLを表示するのでお手持ちの スマホ or パソコンをご用意ください
https:// github.com/ AsPJT/PAX_SAPIENTICA GitHubリポジトリ
PAX SAPIENTICA 文献学・考古学・人類学データを用いた ABS & GIS 各国・各時代の暦表示機能や各時代の環境復元機能を持つ XYZ タイルや地物を自由に追加することが可能
補足(学問) 文献学:日本書紀,古事記等の文字資料から歴史を考察 考古学:遺跡から出た遺物・遺構から歴史を考察 人類学:人骨の形質や遺伝子の情報から歴史を考察
補足(用語) ABS:Agent-based Simulation(後に解説) GIS:地理情報システム - Geographic Information System XYZタイル・地物:GISで表示する地図や点のこと
PAX SAPIENTICA 文献学・考古学・人類学データを用いた ABS & GIS 各国・各時代の暦表示機能や各時代の環境復元機能を持つ XYZ タイルや地物を自由に追加することが可能
None
開発期間 2023年1月10日から現在まで(1年ちょっと) 927 コミット / 96 プルリクエスト 2024年1月10日 ソフトウェア正式リリース
開発意義 歴史的事象の分析を得意とするGISは少ない 一般のGISは空間情報の扱いに長けているが 歴史にとって重要な時間情報の扱いは不向きなことが多い
開発意義 そのため,歴史的事象の分析のためのABSとGISの 双方の機能を持つソフトウェアを開発した 時間情報,空間情報,シミュレーションの3つの機能を 持つ汎用性・拡張性の高いソフトウェアを目指した
開発者(2人体制) 企画の立案が得意 Windows環境で開発 厳密な設計が得意 Mac環境で開発 私 相方
開発担当 データ作成・デザイン 描画関連・仕様の作成 暦と地図機能の作成 Windows/Android 対応 CI/CD・自動化周り CMake・ビルド環境整備 シミュレーションの作成 Mac/Linux
対応 私 相方
サポート環境 両方が担当
対応言語 C++17 をサポート 【理由】スマホ対応のためAndroid NDKに合わせた ※最近C++20に対応した噂を聞いている(要確認) いずれC++20や23へと対応していきたい 両方が担当
コンパイラ GCC・Clang・MSVCをサポート CI (GitHub Actions) ではGCCとClangでビルド実行 私の手元ではMSVCでビルド実行 相方の手元ではClangでビルド実行 主に相方が担当
CI/CD関連 CI は GitHub Actionsを使用 単体テスト,全体ビルド等がある 現在は6種類存在 テストはGoogle Test を使用
相方が担当
スクリプト一覧 CodeCounter.py:コード行数をカウント / CTest.*: CTestを実行 DevelopmentBuild.sh(.bat): MapViewerの開発ビルドを行う ProductionBuild.sh(.bat): MapViewerの本番ビルドを行う SyncSubmodule.sh(.bat):
submoduleを同期する UbuntuBuild/Build.sh: Ubuntu上でのビルドを行う UbuntuBuild/docker-compose.yml: build環境を 構築するためのdocker-composeファイル 相方が担当
ライブラリ行数 内製ライブラリの行数の合計は 「10803行」 意外とたくさん書いている (大規模なのか,それとも無駄が多くて汚いコードなのか) 両方が担当
ライブラリの構造 3種類用意 PAX_SAPIENTICA:描画ライブラリに依存しないもの PAX_GRAPHICA:描画ライブラリをラップするもの PAX_MAHOROBA:描画ライブラリに依存するもの 私が担当
描画Libraryのラップ 書籍のように100年後も扱える製品にしたい 大きい外部ライブラリの依存を少なくしたい 長方形の描画など基本的な機能を追加 マクロ分岐で自由に描画ライブラリを選択 私が担当
対応した描画Library OpenSiv3D・SFML・DxLibに対応 DirectX, Vulkan, Metal 等を直接使用はしていない 時間がかかるので簡単に描画できるものを使用 Qt などにも対応したらより便利かも 本質じゃないのであまり時間はかけたくない
主に私が担当
開発時の主な描画 OpenSiv3Dが便利で使いやすいので愛用 スマホ対応で究極のC++描画ライブラリになると期待 Android対応でDxLib,外で人前で作品を見せるときに スマホやタブレットで動くものがあると便利 私が担当
その他のライブラリ Google Test:テストに使用 stb:画像の入出力に使用 OpenMP:並列化に使用(ただしほぼ未使用) 今後更に追加される可能性あり 両方が担当
対応OS(GUI) Windows・Mac・Android・Linuxをサポート iOS はサポート無し(いずれサポートしたい) 入力デバイスも自由:マウスのみ,キーボードのみ, タッチのみでも基本動作はほぼすべて対応 両方が担当
None
開発環境(GUI) 【 SFML 】 CMake,ソリューション (.sln) 【 OpenSiv3D 】 ソリューション
(.sln) 【 DxLib (Windows) 】 ソリューション (.sln) 【 DxLib (Android) 】 Android Studio 両方が担当
地図機能 私が担当
地図の描画 GISなので地図を描画する機能が必要 様々な地図投影法が存在するが,メルカトル図法のみ使用 メルカトル図法とは経度と緯度が常に直交する図法 メルカトル図法の地図を分割して表示する形式が望ましい その形式である「XYZタイル形式」をサポートした 私が担当
XYZタイルとは 世界測地系の経緯度が正方形に変換されるよう極域の 一部地域(北緯及び南緯約85.05112878度以上)を 除外した範囲をメルカトル投影を使って変換された地図 地図をコンピュータで管理しやすくした形式 Z(Zは0以上の整数)がズームレベル,2のZ乗が分割数 私が担当
XYZタイルの座標 私が担当
初期の地図表示 二次元 std::vector で管理 表示範囲が変わった時に画像全て読み直し トンデモ実装・めちゃくちゃ重い 私が担当
初期の地図表示 表示範囲が変わった時に 元々読み込んであるものを保持しつつも 新しい画像を読み込んで管理する良い方法ないかな std::unordered_map を使えば簡単にできるのでは? 私が担当
地図の仕組み std::unordered_map の Key の型は uint64 を使用 Z=8bit, Y=24bit, X=24bit
としている(※8bit 余っている) XYZタイルのズームレベルとX・Y座標を入れるだけで 簡単かつ高速に管理が可能となった 私が担当
地図の仕組み Z=7が約1km間隔,Z=17が約1m間隔 つまり、Z=24が約7.6mm間隔 基本的にタイルはZ=17までのものがほとんど Z=24まで対応しているが24まで使用することはほぼ無い 私が担当
None
列挙型撲滅プロジェクト 私が担当
enum定義の問題点 ユーザが自由に定義できない点 ソースファイルに直接書き込んでしまう点 数値で管理するため,文字列と相性が悪い点 などなど 私が担当
文字列で管理 自由にユーザが追加しやすい 一方でenumや数値管理よりも処理が重くなる 自由度を保ち,処理を軽くするには 文字列を数値へ変換すれば良い 私が担当
文字列を数値へ変換 文字列を数値へ変換して管理する MurmurHash3関数という 文字列をuint32へ変換する機能を用意 コードの大部分を改修 私が担当
TSV読み込みと管理 ・画像 ・地名/人名 ・言語/テキスト ・暦 ・シミュレーション ・その他設定 私が担当
TSV読み込みと管理 1行目を読み込む→MurMur3で数値に変換し,数値で保持 対応する構造体へ変換,2行目以降を格納 文字列データを数値として保持することによって 高速にもなり,汎用性も上がった 私が担当
主に相方が担当 シミュレーション
ABSとは エージェントを用いた仮想実験(シミュレーション) 日本ではマルチエージェントシミュレーション(MAS)と 呼ばれることが多い 「マルチエージェントシステム」や「エージェントベース モデル」等の似た用語がある 主に相方が担当
None
主に相方が担当 シミュレーションは巨大で 今回の時間内で話すのは不可能 また次の機会に……
簡単なまとめ CIでGCC/Clangをビルド実行,C++17を使用 開発環境はCMake・VS sln・Android Studioに対応 分割された地図は std::unordered_map で管理 文字列をMurMur3で uint32
へ変換して処理高速化
https:// github.com/ AsPJT/PAX_SAPIENTICA GitHubリポジトリ
PAX SAPIENTICA 文献学・考古学・人類学データを用いた ABS & GIS 各国・各時代の暦表示機能や各時代の環境復元機能を持つ XYZ タイルや地物を自由に追加することが可能