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
検証!会津は本当に地盤が硬いのか?
Search
noharu36
December 01, 2025
Programming
27
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
検証!会津は本当に地盤が硬いのか?
noharu36
December 01, 2025
More Decks by noharu36
See All by noharu36
皆さんはHaskellをご存知です_しかし皆さんはHaskellが読めません_.pdf
noharu36
0
39
自作オブジェクトストレージをRustで
noharu36
0
61
ファミコンに思いを馳せる〜エミュレータ自作を添えて〜
noharu36
0
33
shell自作した話
noharu36
0
27
Rustを布教したい
noharu36
0
26
neofetchよ、永遠に
noharu36
0
32
ISSの軌道計算をRustで
noharu36
0
26
Other Decks in Programming
See All in Programming
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
250
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
400
dRuby over BLE
makicamel
2
340
Webフレームワークの ベンチマークについて
yusukebe
0
160
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
250
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
540
Oxlintのカスタムルールの現況
syumai
6
1.1k
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
さぁV100、メモリをお食べ・・・
nilpe
0
140
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
610
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
5.9k
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
Featured
See All Featured
The browser strikes back
jonoalderson
0
1.2k
Producing Creativity
orderedlist
PRO
348
40k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
610
It's Worth the Effort
3n
188
29k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
280
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
430
Building Applications with DynamoDB
mza
96
7.1k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Transcript
検証!会津は本当に地盤が硬いのか? 学部2年 harukun
自己紹介 { name: 能島明希 handle: harukun origin: 広島->岡山->大阪->東京->会津 tech: {
front-end: React+TS backend: Rust, Go etc: Rust, Haskell Rust: Rust } favorites: Game, Tobacco, BoyScout, Rust, Neovim Twitter(x): https://twitter.com/pieceofharuki Blog: https://zenn.dev/haru_blog }
会津、地盤硬いってよく言われる気がする ... それ本当?
技術スタック
[dependencies] reqwest = { version = "0.12.9", features = ["json"]
} tokio = { version = "1.41.1", features = ["full"] } serde = { version = "1.0.215", features = ["derive"] } serde_json = "1.0.133" chrono = {version = "0.4.38", features = ["serde"] } scraper = "0.21.0" plotters = "0.3.7" geojson = "0.24.1" geo-types = "0.7.14" 使用した外部クレート
説明 • requwest: HTTPリクエストを送信するためのライブラリ • tokio: 非同期処理をするためのライブラリ • serde, serde_json:
シリアライズ、デシリアライズを行うためのライブラリ • chrono: 時刻を扱うライブラリ • scraper: スクレイピングをするためのライブラリ • plotters:いわゆる描画ライブラリ。いろんな形式をサポートしている • geojson: GeoJsonを読み込むためのライブラリ • geo-types: Rustで地理空間情報を扱うための基本的なデータ型と構造体を提供するライブラリ
やりたいこと (それなりの大きさの)地震は複数の観測点を持つ 同じ震度を観測した観測点は(概ね)(例外はあるが)(一概には言えないが)扇形の弧のように並ぶはず 同じ震度の点を繋いで、その線の内側を震度ごとに色分けして、複数の地震の情報を重ねてあげれば、地震が 多い||強い揺れをよく観測する地域は濃い色に、地震が少ない ||小さな揺れのみを観測している地域は薄い色 になるはず 色分けは、単純に震度で考えると間違っているので(震度6は震度3の倍の強さではない) Galで計算してあげれ ば論理的に色分けできる気がする
いめーじ
が... 扇形の弧、どうやって求めんねん! 作れたとしても、その弧どうやって描画すんねん! 弧の内側どうやって描画すんねん! となったので一旦断念 とりあえず都道府県ごとに色付けしてみることにする
気象庁の地震速報 参考: https://www.p2pquake.net/develop/json_api_v2 async fn main() -> Result<(), Box<dyn std::error::Error>>
{ create_point_list().await?; let url = "https://api.p2pquake.net/v2/jma/quake"; let params = [ ("limit", "100"), ("order", "-1"), ("quake_type", "ScalePrompt"), ("min_scale", "20"), ]; let client = reqwest::Client::new(); let response = client .get(url) .query(¶ms) .header("accept", "application/json") .send() .await?; let json: serde_json::Value = response.json().await?; let quakes = parse_json(json)?; Ok(()) } apiを叩いて、とってきたJsonをstructに変換する
震度観測点と座標の変換 地震速報では震度観測点名称しかわからないので、気象庁のサ イトをスクレイピングして震度間測定名と座標を対応づける 変換した値はグローバル変数で保持 #[derive(Debug, Default, Deserialize, Clone)] pub struct
Addr { pub addr: String, pub latitude: f64, pub longitude: f64, } pub static POINT_MAP: OnceLock<HashMap<String, Addr>> = OnceLock::new();
{ "quakes": [ "Quake": { "time": "2024-12-09T21:00:00", "points": [ {
"location": { "addr": "九戸郡洋野町種市第23地割27(洋野町役場種市庁舎)", "latitude": 40.40833333333333, "longitude": 141.71833333333333 }, "scale": 30 }, { "location": { "addr": "八幡平市大更第35地割62(旧八幡平市役所西根総合支所)", "latitude": 39.92666666666667, "longitude": 141.095 }, "scale": 30 } ] } ] } #[derive(Deserialize, Debug)] pub struct Quake { #[serde(deserialize_with = "deserialize_naive_date_time_from_str")] pub time: NaiveDateTime, #[serde(deserialize_with = "create_point")] pub points: Vec<Point>, } #[derive(Deserialize, Debug)] pub struct Point { pub location: Addr, pub scale: usize, } 取得したデータの例→
日本地図の描画 geojsonという形式のデータを持ってきて、それを描画ライブラリでこねこねすると (理論上)日本地図が描画できてかつ都道府県と描画エリア(ポリゴン)を対応づけられる
なんかうまくいかない ...
なんとか解決しようと試みるも ... なんだか小島のあたりで縦線が沢山生じているので描画方法を変えてみた → うまく行きそうなので小島かどうかの判別(描画方法の決定) をする関数を書いた fn decide_area_or_line(v: &Vec<(f64, f64)>)
-> bool { let (min_x, max_x, min_y, max_y) = v.iter().fold( (f64::INFINITY, f64::NEG_INFINITY, f64::INFINITY, f64::NEG_INFINITY), |(acc_min_x, acc_max_x, acc_min_y, acc_max_y), &(x, y)| { ( acc_min_x.min(x), acc_max_x.max(x), acc_min_y.min(y), acc_max_y.max(y), ) }, ); let diff_x = max_x - min_x; let diff_y = max_y - min_y; if diff_x >= 1.0 || diff_y >= 1.0 { return true } false }
うまくいかない ... 小島はうまく描画できているっぽい? 東京近辺と大阪近辺で描画が失敗している
今後の展望 なんとかうまいこと日本地図を描画できるようにしたい →それができればとってきた地震のデータを描画して、都道府県に紐づけるのは簡単 とりあえず都道府県ごとに色分けして表示できるようにしたい 大LTまでに完成させるかも。でも浮気して別のことやるかも