From 5749a08d0f6b8827f1e9228b9e2e4d4c053b5d5c Mon Sep 17 00:00:00 2001 From: yanorei32 Date: Wed, 8 Apr 2026 12:08:57 +0900 Subject: [PATCH 1/2] Apply JMA Style naming --- asset-preprocessor/src/parse_shapefile.rs | 114 ++++++++++-------- .../src/parse_tsunami_shapefile.rs | 13 +- renderer-assets/build.rs | 2 +- renderer-assets/src/lib.rs | 30 +++-- renderer-assets/station_codes_parser.rs | 26 ++-- renderer-types/src/codes.rs | 28 ++++- renderer/src/rendering_context.rs | 46 +++---- renderer/src/web/mod.rs | 22 ++-- renderer/src/worker/drawer_intensity_icon.rs | 2 +- renderer/src/worker/drawer_tsunami.rs | 4 +- renderer/src/worker/mod.rs | 2 +- 11 files changed, 162 insertions(+), 127 deletions(-) diff --git a/asset-preprocessor/src/parse_shapefile.rs b/asset-preprocessor/src/parse_shapefile.rs index 5abb14b..9675a6a 100644 --- a/asset-preprocessor/src/parse_shapefile.rs +++ b/asset-preprocessor/src/parse_shapefile.rs @@ -79,7 +79,7 @@ Please follow: } struct AreaRings { - area_code: codes::Area, + 地震情報細分区域: codes::地震情報細分区域, bounding_box: BoundingBox, rings: Vec, } @@ -89,14 +89,17 @@ impl AreaRings { let Shape::Polygon(polygon) = shape else { return None; }; - let area_code: codes::Area = match record.get("code").unwrap() { + + let 地震情報細分区域: codes::地震情報細分区域 = match record.get("code").unwrap() { FieldValue::Character(Some(c)) => match c.parse() { - Ok(c) => c, + Ok(c) => codes::地震情報細分区域(c), Err(_) => panic!("コワッ…コワれたshapefileきた!"), }, - FieldValue::Character(None) => codes::UNNUMBERED_AREA, // 北方領土・諸外国等がNoneになる + + FieldValue::Character(None) => codes::地震情報細分区域::UNNUMBERED, // 北方領土・諸外国等がNoneになる _ => panic!("知らないshapefileきた?🤔"), }; + let bounding_box = (*polygon.bbox()).into(); let rings = polygon .rings() @@ -105,7 +108,7 @@ impl AreaRings { .collect(); Some(Self { - area_code, + 地震情報細分区域, bounding_box, rings, }) @@ -119,12 +122,12 @@ pub(crate) struct PointReferences<'a> { impl<'a> PointReferences<'a> { fn tally_of( shapefile: &'a Shapefile, - area_to_pref: &'a HashMap, + area_to_pref: &'a HashMap, ) -> Self { let mut map: HashMap = HashMap::new(); shapefile.entries.iter().for_each(|area_rings| { - let area_code = area_rings.area_code; + let 地震情報細分区域 = area_rings.地震情報細分区域; area_rings.rings.iter().for_each(|ring| { ring.iter_adjacent_points().for_each(|point_set| { @@ -132,7 +135,7 @@ impl<'a> PointReferences<'a> { .entry(point_set.current) .or_insert(PointReference::new(area_to_pref)); - reference.mark_area(area_code); + reference.mark_area(地震情報細分区域); reference.mark_point(point_set.previous); reference.mark_point(point_set.next); }); @@ -162,13 +165,15 @@ impl<'a> PointReferences<'a> { } pub(crate) struct PointReference<'a> { - area_to_pref: &'a HashMap, - areas: HashSet, + area_to_pref: &'a HashMap, + areas: HashSet, adjacent_points: HashSet, } impl<'a> PointReference<'a> { - fn new(area_to_pref: &'a HashMap) -> Self { + fn new( + area_to_pref: &'a HashMap + ) -> Self { Self { area_to_pref, areas: HashSet::new(), @@ -176,7 +181,7 @@ impl<'a> PointReference<'a> { } } - fn mark_area(&mut self, area: codes::Area) { + fn mark_area(&mut self, area: codes::地震情報細分区域) { self.areas.insert(area); } @@ -184,16 +189,17 @@ impl<'a> PointReference<'a> { self.adjacent_points.insert(point); } - fn area_references(&self) -> &HashSet { + fn area_references(&self) -> &HashSet { &self.areas } - pub(crate) fn pref_references(&self) -> HashSet { + pub(crate) fn pref_references(&self) -> HashSet { let areas = self .area_references() .iter() - .filter(|a| **a != codes::UNNUMBERED_AREA) + .filter(|a| **a != codes::地震情報細分区域::UNNUMBERED) .map(|a| *self.area_to_pref.get(a).unwrap()); + HashSet::from_iter(areas) } @@ -202,15 +208,18 @@ impl<'a> PointReference<'a> { } } pub fn read( - #[allow(non_snake_case)] area_code__pref_code: &HashMap, + #[allow(non_snake_case)] area_code__pref_code: &HashMap< + codes::地震情報細分区域, + codes::地震情報都道府県等, + >, ) -> ( - HashMap>, // area_bounding_box - HashMap>, // area_centers - Vec<(f32, f32)>, // vertex_buffer - Vec, // map_indices - Vec>, // area_lines - Vec>, // pref_lines - Vec<(f32, usize)>, // scale_level_map + HashMap>, // area_bounding_box + HashMap>, // area_centers + Vec<(f32, f32)>, // vertex_buffer + Vec, // map_indices + Vec>, // area_lines + Vec>, // pref_lines + Vec<(f32, usize)>, // scale_level_map ) { let shapefile = Shapefile::new( "../assets/shapefile/earthquake_detailed/earthquake_detailed_simplified.shp", @@ -220,21 +229,24 @@ pub fn read( // @Siro_256 にゃ~っ…! (ΦωΦ) - let area_centers = calculate_area_centers(&shapefile); + let 地震情報細分区域_centers = calculate_地震情報細分区域_centers(&shapefile); - let area_bounding_box: HashMap> = shapefile - .entries - .iter() - .filter(|area_rings| area_rings.area_code != codes::UNNUMBERED_AREA) - .map(|area_rings| (area_rings.area_code, area_rings.bounding_box)) - .collect(); + let 地震情報細分区域_bounding_box: HashMap> = + shapefile + .entries + .iter() + .filter(|rings| { + rings.地震情報細分区域 != codes::地震情報細分区域::UNNUMBERED + }) + .map(|rings| (rings.地震情報細分区域, rings.bounding_box)) + .collect(); let map_indices = shapefile .entries .iter() - .flat_map(|area_rings| &area_rings.rings) - .flat_map(|r| r.triangulate()) - .map(|p| vertex_buffer.insert(p.into()) as u32) + .flat_map(|rings| &rings.rings) + .flat_map(|ring| ring.triangulate()) + .map(|point| vertex_buffer.insert(point.into()) as u32) .collect(); let references = PointReferences::tally_of(&shapefile, area_code__pref_code); @@ -322,8 +334,8 @@ pub fn read( // (ΦωΦ) < Meow ! { ( - area_bounding_box, - area_centers, + 地震情報細分区域_bounding_box, + 地震情報細分区域_centers, vertex_buffer.into_buffer(), map_indices, area_lines, @@ -400,18 +412,20 @@ fn gen_lod( .collect() } -fn calculate_area_centers(shapefile: &Shapefile) -> HashMap> { +fn calculate_地震情報細分区域_centers( + shapefile: &Shapefile, +) -> HashMap> { use geo::{ algorithm::{Area, Centroid}, LineString, Polygon, }; - let area_weighted_vectors: HashMap> = shapefile + let weighted_vectors: HashMap> = shapefile .entries .iter() - .filter(|area_rings| area_rings.area_code != codes::UNNUMBERED_AREA) - .map(|area_rings| { - let area_polygons: Vec<(f64, geo::Point)> = area_rings + .filter(|rings| rings.地震情報細分区域 != codes::地震情報細分区域::UNNUMBERED) + .map(|rings| { + let polygons: Vec<(f64, geo::Point)> = rings .rings .iter() .map(|ring| LineString::new(ring.points().iter().map(|p| p.into()).collect_vec())) @@ -419,19 +433,19 @@ fn calculate_area_centers(shapefile: &Shapefile) -> HashMap = area_weighted_vectors + let centers: HashMap = weighted_vectors .into_iter() - .map(|(area_code, weighted_vectors)| { - let area_weight: f64 = weighted_vectors + .map(|(地震情報細分区域, weighted_vectors)| { + let weight: f64 = weighted_vectors .iter() .map(|(weight, _vector)| weight) .sum(); - let area_vector: Point = weighted_vectors + let vector: Point = weighted_vectors .iter() .map(|(weight, vector)| { let vector: Point = vector.into(); @@ -439,19 +453,19 @@ fn calculate_area_centers(shapefile: &Shapefile) -> HashMap> = area_centers + let centers: HashMap> = centers .into_iter() - .map(|(area_code, center)| { + .map(|(code, center)| { ( - area_code, + code, Vertex::new(center.latitude.into(), center.longitude.into()), ) }) .collect(); - area_centers + centers } diff --git a/asset-preprocessor/src/parse_tsunami_shapefile.rs b/asset-preprocessor/src/parse_tsunami_shapefile.rs index 80c528d..429257b 100644 --- a/asset-preprocessor/src/parse_tsunami_shapefile.rs +++ b/asset-preprocessor/src/parse_tsunami_shapefile.rs @@ -72,7 +72,7 @@ impl VertexBuffer { struct AreaLines { lines: Vec, - tsunami_area_code: codes::TsunamiArea, + 津波予報区: codes::津波予報区, } impl AreaLines { @@ -81,17 +81,16 @@ impl AreaLines { return None; }; - let tsunami_area_code: codes::TsunamiArea = match record.get("code").unwrap() { + let 津波予報区: codes::津波予報区 = match record.get("code").unwrap() { FieldValue::Character(Some(c)) => match c.parse() { - Ok(c) => c, + Ok(c) => codes::津波予報区(c), Err(_) => panic!("Failed to parse code"), }, FieldValue::Character(None) => panic!("UNNUMBERED_AREA DETECTED!"), _ => panic!("Failed to get code"), }; - // 帰属未定 (極小の島など) - if tsunami_area_code == 0 { + if 津波予報区 == codes::津波予報区::帰属未定 { return None; } @@ -103,7 +102,7 @@ impl AreaLines { Some(Self { lines, - tsunami_area_code, + 津波予報区, }) } } @@ -167,7 +166,7 @@ pub fn read() -> ( vertex_buffer.insert(( Of32::from(v.longitude), Of32::from(v.latitude), - tsunami_area_code_buffer.insert(e.tsunami_area_code), + tsunami_area_code_buffer.insert(e.津波予報区.0), )) as u32 }) .collect(); diff --git a/renderer-assets/build.rs b/renderer-assets/build.rs index 7aedd1f..da7c4f0 100644 --- a/renderer-assets/build.rs +++ b/renderer-assets/build.rs @@ -60,7 +60,7 @@ fn main() { .expect("エリア内に一つも観測点がない"); ( - *code, + code.0, (nearest_intensity_station_index, bbox_to_tuple(bbox)), ) }) diff --git a/renderer-assets/src/lib.rs b/renderer-assets/src/lib.rs index b25ff8d..2b64baf 100644 --- a/renderer-assets/src/lib.rs +++ b/renderer-assets/src/lib.rs @@ -48,37 +48,41 @@ impl QueryInterface { } } - pub fn is_valid_earthquake_area_code(area_code: codes::Area) -> bool { - AREAS.contains_key(&area_code) + pub fn is_valid_地震情報細分区域(code: codes::地震情報細分区域) -> bool { + AREAS.contains_key(&code.0) } - pub fn is_valid_tsunami_area_code(area_code: codes::Area) -> bool { - TSUNAMI_AREA_CODE_TO_INTERNAL_CODE.contains_key(&area_code) + pub fn is_valid_津波予報区(code: codes::津波予報区) -> bool { + TSUNAMI_AREA_CODE_TO_INTERNAL_CODE.contains_key(&code.0) } - pub fn tsunami_area_code_to_internal_code(area_code: codes::TsunamiArea) -> Option { - TSUNAMI_AREA_CODE_TO_INTERNAL_CODE.get(&area_code).copied() + pub fn 津波予報区_to_internal_tsunami_area_code( + code: codes::津波予報区, + ) -> Option { + TSUNAMI_AREA_CODE_TO_INTERNAL_CODE + .get(&code.0) + .map(|code| codes::InternalTsunamiAreaCode(*code)) } - pub fn tsunami_area_code_count() -> usize { + pub fn internal_tsunami_area_code_count() -> usize { TSUNAMI_AREA_CODE_TO_INTERNAL_CODE.len() } - pub fn query_bounding_box_by_area(area_code: codes::Area) -> Option> { - let tuple = AREAS.get(&area_code)?.1; + pub fn query_bounding_box_by_地震情報細分区域(code: codes::地震情報細分区域) -> Option> { + let tuple = AREAS.get(&code.0)?.1; let min = Vertex::new(tuple.0, tuple.1); let max = Vertex::new(tuple.2, tuple.3); Some(BoundingBox::new(min, max)) } - pub fn query_rendering_center_by_area(area_code: codes::Area) -> Option> { - Some(INTENSITY_STATION_POSITIONS[AREAS.get(&area_code)?.0].into()) + pub fn query_intensity_icon_center_by_地震情報細分区域(code: codes::地震情報細分区域) -> Option> { + Some(INTENSITY_STATION_POSITIONS[AREAS.get(&code.0)?.0].into()) } pub fn query_position_by_station_code( - intensity_station_code: codes::IntensityStation, + code: codes::震度観測点, ) -> Option> { - Some(INTENSITY_STATION_POSITIONS[*STATION_CODES.get(&intensity_station_code)?].into()) + Some(INTENSITY_STATION_POSITIONS[*STATION_CODES.get(&code.0)?].into()) } pub fn query_lod_level_by_scale(scale: f32) -> Option { diff --git a/renderer-assets/station_codes_parser.rs b/renderer-assets/station_codes_parser.rs index 4e8315f..6b50983 100644 --- a/renderer-assets/station_codes_parser.rs +++ b/renderer-assets/station_codes_parser.rs @@ -30,9 +30,9 @@ enum Lon { #[derive(Debug)] pub struct IntensityStationInternal { - pub area_code: codes::Area, - pub station_code: codes::IntensityStation, - pub pref_code: codes::Pref, + pub 地震情報細分区域: codes::地震情報細分区域, + pub 震度観測点: codes::震度観測点, + pub 地震情報都道府県等: codes::地震情報都道府県等, pub position: (f32, f32), } @@ -46,9 +46,9 @@ pub fn read( s: &str, ) -> ( Vec<(f32, f32)>, - HashMap, - HashMap, - HashMap, + HashMap, + HashMap, + HashMap, ) { let stations: Vec = serde_json::from_str(s).unwrap(); @@ -63,19 +63,19 @@ pub fn read( }; IntensityStationInternal { - area_code: v.area_code.parse().unwrap(), - station_code: v.station_code.parse().unwrap(), - pref_code: v.pref.parse().unwrap(), + 地震情報細分区域: codes::地震情報細分区域(v.area_code.parse().unwrap()), + 震度観測点: codes::震度観測点(v.station_code.parse().unwrap()), + 地震情報都道府県等: codes::地震情報都道府県等(v.pref.parse().unwrap()), position: (lon, lat), } }) - .sorted_by_key(|v| v.area_code) + .sorted_by_key(|v| v.地震情報細分区域) .collect(); #[allow(non_snake_case)] let area_code__intensity_station_range: HashMap<_, _> = intensity_station_internal .iter() - .map(|v| v.area_code) + .map(|v| v.地震情報細分区域) .dedup_with_count() .sorted_by_key(|(_len, area_code)| *area_code) .scan(0, |offset, (len, area_code)| { @@ -93,14 +93,14 @@ pub fn read( #[allow(non_snake_case)] let area_code__pref_code: HashMap<_, _> = intensity_station_internal .iter() - .map(|v| (v.area_code, v.pref_code)) + .map(|v| (v.地震情報細分区域, v.地震情報都道府県等)) .collect(); #[allow(non_snake_case)] let station_code__index: HashMap<_, _> = intensity_station_internal .iter() .enumerate() - .map(|(i, v)| (v.station_code, i)) + .map(|(i, v)| (v.震度観測点.0, i)) .collect(); let intensity_station_positions: Vec<_> = intensity_station_internal diff --git a/renderer-types/src/codes.rs b/renderer-types/src/codes.rs index e4f68c3..db90f4c 100644 --- a/renderer-types/src/codes.rs +++ b/renderer-types/src/codes.rs @@ -1,6 +1,24 @@ -pub type Area = u32; -pub type TsunamiArea = u32; -pub type IntensityStation = u32; -pub type Pref = u32; +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub struct 地震情報細分区域(pub u32); -pub const UNNUMBERED_AREA: Area = 65535; +impl 地震情報細分区域 { + /// 諸外国や北方領土など + pub const UNNUMBERED: Self = Self(65535); +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub struct 津波予報区(pub u32); + +impl 津波予報区 { + /// 極小の島など + pub const 帰属未定: Self = Self(0); +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub struct 震度観測点(pub u32); + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub struct 地震情報都道府県等(pub u32); + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub struct InternalTsunamiAreaCode(pub u16); diff --git a/renderer/src/rendering_context.rs b/renderer/src/rendering_context.rs index bbbfb14..0cba434 100644 --- a/renderer/src/rendering_context.rs +++ b/renderer/src/rendering_context.rs @@ -4,7 +4,7 @@ use chrono::{DateTime, Utc}; use enum_map::enum_map; use enum_map::EnumMap; use renderer_assets::QueryInterface; -use renderer_types::codes::{Area, TsunamiArea}; +use renderer_types::codes; use renderer_types::{GeoDegree, Vertex}; #[derive(Debug)] @@ -33,21 +33,21 @@ impl TryFrom for RenderingPayload { fn try_from(data: proto::QuakePrefectureV0) -> Result { let area_intensities = enum_map! { - 震度::震度1 => data.one.clone().map(|v| v.codes).unwrap_or(vec![]), - 震度::震度2 => data.two.clone().map(|v| v.codes).unwrap_or(vec![]), - 震度::震度3 => data.three.clone().map(|v| v.codes).unwrap_or(vec![]), - 震度::震度4 => data.four.clone().map(|v| v.codes).unwrap_or(vec![]), - 震度::震度5弱 => data.five_minus.clone().map(|v| v.codes).unwrap_or(vec![]), - 震度::震度5強 => data.five_plus.clone().map(|v| v.codes).unwrap_or(vec![]), - 震度::震度6弱 => data.six_minus.clone().map(|v| v.codes).unwrap_or(vec![]), - 震度::震度6強 => data.six_plus.clone().map(|v| v.codes).unwrap_or(vec![]), - 震度::震度7 => data.seven.clone().map(|v| v.codes).unwrap_or(vec![]), + 震度::震度1 => data.one.clone().map(|v| v.codes.iter().map(|code| codes::地震情報細分区域(*code)).collect()).unwrap_or(vec![]), + 震度::震度2 => data.two.clone().map(|v| v.codes.iter().map(|code| codes::地震情報細分区域(*code)).collect()).unwrap_or(vec![]), + 震度::震度3 => data.three.clone().map(|v| v.codes.iter().map(|code| codes::地震情報細分区域(*code)).collect()).unwrap_or(vec![]), + 震度::震度4 => data.four.clone().map(|v| v.codes.iter().map(|code| codes::地震情報細分区域(*code)).collect()).unwrap_or(vec![]), + 震度::震度5弱 => data.five_minus.clone().map(|v| v.codes.iter().map(|code| codes::地震情報細分区域(*code)).collect()).unwrap_or(vec![]), + 震度::震度5強 => data.five_plus.clone().map(|v| v.codes.iter().map(|code| codes::地震情報細分区域(*code)).collect()).unwrap_or(vec![]), + 震度::震度6弱 => data.six_minus.clone().map(|v| v.codes.iter().map(|code| codes::地震情報細分区域(*code)).collect()).unwrap_or(vec![]), + 震度::震度6強 => data.six_plus.clone().map(|v| v.codes.iter().map(|code| codes::地震情報細分区域(*code)).collect()).unwrap_or(vec![]), + 震度::震度7 => data.seven.clone().map(|v| v.codes.iter().map(|code| codes::地震情報細分区域(*code)).collect()).unwrap_or(vec![]), }; if !area_intensities.iter().all(|(_, areas)| { areas .iter() - .all(|area| QueryInterface::is_valid_earthquake_area_code(*area)) + .all(|area| QueryInterface::is_valid_地震情報細分区域(*area)) }) { return Err(PayloadError::InvalidAreaCodeIsProvided); } @@ -75,16 +75,16 @@ impl TryFrom for RenderingPayload { fn try_from(data: proto::TsunamiForecastV0) -> Result { let forecast_levels = enum_map! { - 津波情報::津波予報 => data.forecast.clone().map(|v| v.codes).unwrap_or(vec![]), - 津波情報::津波注意報 => data.advisory.clone().map(|v| v.codes).unwrap_or(vec![]), - 津波情報::津波警報 => data.warning.clone().map(|v| v.codes).unwrap_or(vec![]), - 津波情報::大津波警報 => data.major_warning.clone().map(|v| v.codes).unwrap_or(vec![]), + 津波情報::津波予報 => data.forecast.clone().map(|v| v.codes.iter().map(|code| codes::津波予報区(*code)).collect()).unwrap_or(vec![]), + 津波情報::津波注意報 => data.advisory.clone().map(|v| v.codes.iter().map(|code| codes::津波予報区(*code)).collect()).unwrap_or(vec![]), + 津波情報::津波警報 => data.warning.clone().map(|v| v.codes.iter().map(|code| codes::津波予報区(*code)).collect()).unwrap_or(vec![]), + 津波情報::大津波警報 => data.major_warning.clone().map(|v| v.codes.iter().map(|code| codes::津波予報区(*code)).collect()).unwrap_or(vec![]), }; if !forecast_levels.iter().all(|(_, areas)| { areas .iter() - .all(|area| QueryInterface::is_valid_tsunami_area_code(*area)) + .all(|area| QueryInterface::is_valid_津波予報区(*area)) }) { return Err(PayloadError::InvalidAreaCodeIsProvided); } @@ -108,16 +108,16 @@ impl TryFrom for RenderingPayload { fn try_from(data: proto::TsunamiForecastV1) -> Result { let forecast_levels = enum_map! { - 津波情報::津波予報 => data.forecast.clone().map(|v| v.codes).unwrap_or(vec![]), - 津波情報::津波注意報 => data.advisory.clone().map(|v| v.codes).unwrap_or(vec![]), - 津波情報::津波警報 => data.warning.clone().map(|v| v.codes).unwrap_or(vec![]), - 津波情報::大津波警報 => data.major_warning.clone().map(|v| v.codes).unwrap_or(vec![]), + 津波情報::津波予報 => data.forecast.clone().map(|v| v.codes.iter().map(|code| codes::津波予報区(*code)).collect()).unwrap_or(vec![]), + 津波情報::津波注意報 => data.advisory.clone().map(|v| v.codes.iter().map(|code| codes::津波予報区(*code)).collect()).unwrap_or(vec![]), + 津波情報::津波警報 => data.warning.clone().map(|v| v.codes.iter().map(|code| codes::津波予報区(*code)).collect()).unwrap_or(vec![]), + 津波情報::大津波警報 => data.major_warning.clone().map(|v| v.codes.iter().map(|code| codes::津波予報区(*code)).collect()).unwrap_or(vec![]), }; if !forecast_levels.iter().all(|(_, areas)| { areas .iter() - .all(|area| QueryInterface::is_valid_tsunami_area_code(*area)) + .all(|area| QueryInterface::is_valid_津波予報区(*area)) }) { return Err(PayloadError::InvalidAreaCodeIsProvided); } @@ -140,7 +140,7 @@ impl TryFrom for RenderingPayload { pub struct EarthquakePayload { pub time: DateTime, pub epicenter: Vec>, - pub area_intensities: EnumMap<震度, Vec>, + pub area_intensities: EnumMap<震度, Vec>, } impl HasTime for EarthquakePayload { @@ -163,7 +163,7 @@ impl HasEpicenter for EarthquakePayload { pub struct TsunamiPayload { pub time: DateTime, pub epicenter: Vec>, - pub forecast_levels: EnumMap<津波情報, Vec>, + pub forecast_levels: EnumMap<津波情報, Vec>, } impl HasTime for TsunamiPayload { diff --git a/renderer/src/web/mod.rs b/renderer/src/web/mod.rs index f3a74dd..dd20024 100644 --- a/renderer/src/web/mod.rs +++ b/renderer/src/web/mod.rs @@ -295,15 +295,15 @@ async fn demo_handler( .to_utc(), epicenter: vec![Vertex::::new(137.2, 37.5)], area_intensities: enum_map! { - 震度::震度1 => vec![211, 355, 357, 203, 590, 622, 632, 741, 101, 106, 107, 161, 700, 703, 704, 711, 713], - 震度::震度2 => vec![332, 440, 532, 210, 213, 351, 352, 354, 356, 551, 571, 601, 611, 200, 201, 202, 591, 592, 620, 621, 630, 631, 721, 740, 751, 763, 770], - 震度::震度3 => vec![241, 251, 301, 311, 321, 331, 441, 442, 450, 461, 462, 510, 521, 531, 535, 562, 563, 212, 220, 221, 222, 230, 231, 232, 233, 340, 341, 342, 350, 360, 361, 411, 412, 550, 570, 575, 580, 581, 600, 610], - 震度::震度4 => vec![401, 421, 422, 431, 432, 240, 242, 243, 250, 252, 300, 310, 320, 330, 443, 451, 460, 500, 501, 511, 520, 530, 540, 560], - 震度::震度5弱 => vec![420, 430], - 震度::震度5強 => vec![391, 370, 372, 375, 380, 381, 400], - 震度::震度6弱 => vec![371], + 震度::震度1 => vec![codes::地震情報細分区域(211), codes::地震情報細分区域(355), codes::地震情報細分区域(357), codes::地震情報細分区域(203), codes::地震情報細分区域(590), codes::地震情報細分区域(622), codes::地震情報細分区域(632), codes::地震情報細分区域(741), codes::地震情報細分区域(101), codes::地震情報細分区域(106), codes::地震情報細分区域(107), codes::地震情報細分区域(161), codes::地震情報細分区域(700), codes::地震情報細分区域(703), codes::地震情報細分区域(704), codes::地震情報細分区域(711), codes::地震情報細分区域(713)], + 震度::震度2 => vec![codes::地震情報細分区域(332), codes::地震情報細分区域(440), codes::地震情報細分区域(532), codes::地震情報細分区域(210), codes::地震情報細分区域(213), codes::地震情報細分区域(351), codes::地震情報細分区域(352), codes::地震情報細分区域(354), codes::地震情報細分区域(356), codes::地震情報細分区域(551), codes::地震情報細分区域(571), codes::地震情報細分区域(601), codes::地震情報細分区域(611), codes::地震情報細分区域(200), codes::地震情報細分区域(201), codes::地震情報細分区域(202), codes::地震情報細分区域(591), codes::地震情報細分区域(592), codes::地震情報細分区域(620), codes::地震情報細分区域(621), codes::地震情報細分区域(630), codes::地震情報細分区域(631), codes::地震情報細分区域(721), codes::地震情報細分区域(740), codes::地震情報細分区域(751), codes::地震情報細分区域(763), codes::地震情報細分区域(770)], + 震度::震度3 => vec![codes::地震情報細分区域(241), codes::地震情報細分区域(251), codes::地震情報細分区域(301), codes::地震情報細分区域(311), codes::地震情報細分区域(321), codes::地震情報細分区域(331), codes::地震情報細分区域(441), codes::地震情報細分区域(442), codes::地震情報細分区域(450), codes::地震情報細分区域(461), codes::地震情報細分区域(462), codes::地震情報細分区域(510), codes::地震情報細分区域(521), codes::地震情報細分区域(531), codes::地震情報細分区域(535), codes::地震情報細分区域(562), codes::地震情報細分区域(563), codes::地震情報細分区域(212), codes::地震情報細分区域(220), codes::地震情報細分区域(221), codes::地震情報細分区域(222), codes::地震情報細分区域(230), codes::地震情報細分区域(231), codes::地震情報細分区域(232), codes::地震情報細分区域(233), codes::地震情報細分区域(340), codes::地震情報細分区域(341), codes::地震情報細分区域(342), codes::地震情報細分区域(350), codes::地震情報細分区域(360), codes::地震情報細分区域(361), codes::地震情報細分区域(411), codes::地震情報細分区域(412), codes::地震情報細分区域(550), codes::地震情報細分区域(570), codes::地震情報細分区域(575), codes::地震情報細分区域(580), codes::地震情報細分区域(581), codes::地震情報細分区域(600), codes::地震情報細分区域(610)], + 震度::震度4 => vec![codes::地震情報細分区域(401), codes::地震情報細分区域(421), codes::地震情報細分区域(422), codes::地震情報細分区域(431), codes::地震情報細分区域(432), codes::地震情報細分区域(240), codes::地震情報細分区域(242), codes::地震情報細分区域(243), codes::地震情報細分区域(250), codes::地震情報細分区域(252), codes::地震情報細分区域(300), codes::地震情報細分区域(310), codes::地震情報細分区域(320), codes::地震情報細分区域(330), codes::地震情報細分区域(443), codes::地震情報細分区域(451), codes::地震情報細分区域(460), codes::地震情報細分区域(500), codes::地震情報細分区域(501), codes::地震情報細分区域(511), codes::地震情報細分区域(520), codes::地震情報細分区域(530), codes::地震情報細分区域(540), codes::地震情報細分区域(560)], + 震度::震度5弱 => vec![codes::地震情報細分区域(420), codes::地震情報細分区域(430)], + 震度::震度5強 => vec![codes::地震情報細分区域(391), codes::地震情報細分区域(370), codes::地震情報細分区域(372), codes::地震情報細分区域(375), codes::地震情報細分区域(380), codes::地震情報細分区域(381), codes::地震情報細分区域(400)], + 震度::震度6弱 => vec![codes::地震情報細分区域(371)], 震度::震度6強 => vec![], - 震度::震度7 => vec![390], + 震度::震度7 => vec![codes::地震情報細分区域(390)], }, }); @@ -362,9 +362,9 @@ async fn tsunami_demo_handler( .to_utc(), epicenter: vec![Vertex::::new(142.3, 41.0)], forecast_levels: enum_map! { - 津波情報::津波予報 => vec![111, 202, 300, 310, 311, 312, 320, 321, 330, 380, 400, 580, 610, 771, 772], - 津波情報::津波注意報 => vec![100, 102, 200, 220, 250], - 津波情報::津波警報 => vec![101, 201, 210], + 津波情報::津波予報 => vec![codes::津波予報区(111), codes::津波予報区(202), codes::津波予報区(300), codes::津波予報区(310), codes::津波予報区(311), codes::津波予報区(312), codes::津波予報区(320), codes::津波予報区(321), codes::津波予報区(330), codes::津波予報区(380), codes::津波予報区(400), codes::津波予報区(580), codes::津波予報区(610), codes::津波予報区(771), codes::津波予報区(772)], + 津波情報::津波注意報 => vec![codes::津波予報区(100), codes::津波予報区(102), codes::津波予報区(200), codes::津波予報区(220), codes::津波予報区(250)], + 津波情報::津波警報 => vec![codes::津波予報区(101), codes::津波予報区(201), codes::津波予報区(210)], _ => vec![], }, }); diff --git a/renderer/src/worker/drawer_intensity_icon.rs b/renderer/src/worker/drawer_intensity_icon.rs index 5ecddda..4efe31e 100644 --- a/renderer/src/worker/drawer_intensity_icon.rs +++ b/renderer/src/worker/drawer_intensity_icon.rs @@ -44,7 +44,7 @@ pub fn draw_all( area_codes.iter().filter_map(|code| { let nearest_station_coord = - renderer_assets::QueryInterface::query_rendering_center_by_area(*code)?; + renderer_assets::QueryInterface::query_intensity_icon_center_by_地震情報細分区域(*code)?; Some(IntensityIconVertex { position: nearest_station_coord.into(), diff --git a/renderer/src/worker/drawer_tsunami.rs b/renderer/src/worker/drawer_tsunami.rs index 0dbf6f4..2daa972 100644 --- a/renderer/src/worker/drawer_tsunami.rs +++ b/renderer/src/worker/drawer_tsunami.rs @@ -25,7 +25,7 @@ pub fn draw( let draw_parameters = frame_context.draw_parameters; let theme = frame_context.theme; - let area_code_count = QueryInterface::tsunami_area_code_count(); + let area_code_count = QueryInterface::internal_tsunami_area_code_count(); // println!("AreaCodeCount: {area_code_count}"); let mut levels = vec![0_u8; area_code_count]; @@ -36,7 +36,7 @@ pub fn draw( .for_each(|(level, areas)| { areas.iter().for_each(|area| { levels - [QueryInterface::tsunami_area_code_to_internal_code(*area).unwrap() as usize] = + [QueryInterface::津波予報区_to_internal_tsunami_area_code(*area).unwrap().0 as usize] = level as u8 }) }); diff --git a/renderer/src/worker/mod.rs b/renderer/src/worker/mod.rs index 1ac302d..54ebaa4 100644 --- a/renderer/src/worker/mod.rs +++ b/renderer/src/worker/mod.rs @@ -322,7 +322,7 @@ pub fn calculate_bounding_box(payload: &RenderingPayload) -> BoundingBox Date: Mon, 27 Apr 2026 11:17:47 +0900 Subject: [PATCH 2/2] More JMA --- asset-preprocessor/src/parse_shapefile.rs | 103 +++++++++++----------- 1 file changed, 52 insertions(+), 51 deletions(-) diff --git a/asset-preprocessor/src/parse_shapefile.rs b/asset-preprocessor/src/parse_shapefile.rs index 9675a6a..20746ac 100644 --- a/asset-preprocessor/src/parse_shapefile.rs +++ b/asset-preprocessor/src/parse_shapefile.rs @@ -43,7 +43,7 @@ impl VertexBuffer { } struct Shapefile { - entries: Vec, + entries: Vec<細分区域Rings>, } impl Shapefile { @@ -71,26 +71,26 @@ Please follow: let entries = reader .iter_shapes_and_records() .flatten() - .flat_map(|shape_record| AreaRings::try_new(shape_record.0, shape_record.1)) + .flat_map(|shape_record| 細分区域Rings::try_new(shape_record.0, shape_record.1)) .collect(); Self { entries } } } -struct AreaRings { - 地震情報細分区域: codes::地震情報細分区域, +struct 細分区域Rings { + 細分区域: codes::地震情報細分区域, bounding_box: BoundingBox, rings: Vec, } -impl AreaRings { +impl 細分区域Rings { fn try_new(shape: Shape, record: Record) -> Option { let Shape::Polygon(polygon) = shape else { return None; }; - let 地震情報細分区域: codes::地震情報細分区域 = match record.get("code").unwrap() { + let 細分区域: codes::地震情報細分区域 = match record.get("code").unwrap() { FieldValue::Character(Some(c)) => match c.parse() { Ok(c) => codes::地震情報細分区域(c), Err(_) => panic!("コワッ…コワれたshapefileきた!"), @@ -108,7 +108,7 @@ impl AreaRings { .collect(); Some(Self { - 地震情報細分区域, + 細分区域, bounding_box, rings, }) @@ -122,20 +122,20 @@ pub(crate) struct PointReferences<'a> { impl<'a> PointReferences<'a> { fn tally_of( shapefile: &'a Shapefile, - area_to_pref: &'a HashMap, + 細分区域_to_都道府県等: &'a HashMap, ) -> Self { let mut map: HashMap = HashMap::new(); - shapefile.entries.iter().for_each(|area_rings| { - let 地震情報細分区域 = area_rings.地震情報細分区域; + shapefile.entries.iter().for_each(|rings| { + let 細分区域 = rings.細分区域; - area_rings.rings.iter().for_each(|ring| { + rings.rings.iter().for_each(|ring| { ring.iter_adjacent_points().for_each(|point_set| { let reference = map .entry(point_set.current) - .or_insert(PointReference::new(area_to_pref)); + .or_insert(PointReference::new(細分区域_to_都道府県等)); - reference.mark_area(地震情報細分区域); + reference.mark_細分区域(細分区域); reference.mark_point(point_set.previous); reference.mark_point(point_set.next); }); @@ -153,62 +153,63 @@ impl<'a> PointReferences<'a> { .collect() } - fn pref_reference_count(&self, line: &Line) -> usize { + fn 都道府県等_reference_count(&self, line: &Line) -> usize { let first = self.map.get(line.vertices.first().unwrap()).unwrap(); let last = self.map.get(line.vertices.last().unwrap()).unwrap(); first - .pref_references() - .intersection(&last.pref_references()) + .都道府県等_references() + .intersection(&last.都道府県等_references()) .count() } } pub(crate) struct PointReference<'a> { - area_to_pref: &'a HashMap, - areas: HashSet, + 細分区域_to_都道府県等: &'a HashMap, + 細分区域s: HashSet, adjacent_points: HashSet, } impl<'a> PointReference<'a> { fn new( - area_to_pref: &'a HashMap + 細分区域_to_都道府県等: &'a HashMap ) -> Self { Self { - area_to_pref, - areas: HashSet::new(), + 細分区域_to_都道府県等, + 細分区域s: HashSet::new(), adjacent_points: HashSet::new(), } } - fn mark_area(&mut self, area: codes::地震情報細分区域) { - self.areas.insert(area); + fn mark_細分区域(&mut self, 細分区域: codes::地震情報細分区域) { + self.細分区域s.insert(細分区域); } fn mark_point(&mut self, point: Point) { self.adjacent_points.insert(point); } - fn area_references(&self) -> &HashSet { - &self.areas + fn 細分区域_references(&self) -> &HashSet { + &self.細分区域s } - pub(crate) fn pref_references(&self) -> HashSet { - let areas = self - .area_references() + pub(crate) fn 都道府県等_references(&self) -> HashSet { + let 都道府県等s = self + .細分区域_references() .iter() .filter(|a| **a != codes::地震情報細分区域::UNNUMBERED) - .map(|a| *self.area_to_pref.get(a).unwrap()); + .map(|a| *self.細分区域_to_都道府県等.get(a).unwrap()); - HashSet::from_iter(areas) + HashSet::from_iter(都道府県等s) } fn adjacent_points_count(&self) -> usize { self.adjacent_points.len() } } + pub fn read( - #[allow(non_snake_case)] area_code__pref_code: &HashMap< + #[allow(non_snake_case)] 細分区域_to_都道府県等: &HashMap< codes::地震情報細分区域, codes::地震情報都道府県等, >, @@ -229,16 +230,16 @@ pub fn read( // @Siro_256 にゃ~っ…! (ΦωΦ) - let 地震情報細分区域_centers = calculate_地震情報細分区域_centers(&shapefile); + let 細分区域_centers = calculate_細分区域_centers(&shapefile); - let 地震情報細分区域_bounding_box: HashMap> = + let 細分区域_bounding_box: HashMap> = shapefile .entries .iter() .filter(|rings| { - rings.地震情報細分区域 != codes::地震情報細分区域::UNNUMBERED + rings.細分区域 != codes::地震情報細分区域::UNNUMBERED }) - .map(|rings| (rings.地震情報細分区域, rings.bounding_box)) + .map(|rings| (rings.細分区域, rings.bounding_box)) .collect(); let map_indices = shapefile @@ -249,7 +250,7 @@ pub fn read( .map(|point| vertex_buffer.insert(point.into()) as u32) .collect(); - let references = PointReferences::tally_of(&shapefile, area_code__pref_code); + let references = PointReferences::tally_of(&shapefile, 細分区域_to_都道府県等); let rings = shapefile .entries @@ -267,14 +268,14 @@ pub fn read( .filter_map(|(l, c)| if c > 1 { Some(l) } else { None }) .collect(); - let area_lines = lines + let 細分区域_lines = lines .iter() - .filter(|l| references.pref_reference_count(l) == 1) + .filter(|l| references.都道府県等_reference_count(l) == 1) .collect_vec(); - let pref_lines = lines + let 都道府県等_lines = lines .iter() - .filter(|l| references.pref_reference_count(l) >= 2) + .filter(|l| references.都道府県等_reference_count(l) >= 2) .collect_vec(); let lod_details = [ @@ -320,8 +321,8 @@ pub fn read( (100.0_f32.powf(0.24), 0.117), ]; - let area_lines = gen_lod(&mut vertex_buffer, &lod_details, &area_lines); - let pref_lines = gen_lod(&mut vertex_buffer, &lod_details, &pref_lines); + let 細分区域_lines = gen_lod(&mut vertex_buffer, &lod_details, &細分区域_lines); + let 都道府県等_lines = gen_lod(&mut vertex_buffer, &lod_details, &都道府県等_lines); let scale_level_map = lod_details .into_iter() @@ -334,12 +335,12 @@ pub fn read( // (ΦωΦ) < Meow ! { ( - 地震情報細分区域_bounding_box, - 地震情報細分区域_centers, + 細分区域_bounding_box, + 細分区域_centers, vertex_buffer.into_buffer(), map_indices, - area_lines, - pref_lines, + 細分区域_lines, + 都道府県等_lines, scale_level_map, ) } @@ -412,7 +413,7 @@ fn gen_lod( .collect() } -fn calculate_地震情報細分区域_centers( +fn calculate_細分区域_centers( shapefile: &Shapefile, ) -> HashMap> { use geo::{ @@ -423,7 +424,7 @@ fn calculate_地震情報細分区域_centers( let weighted_vectors: HashMap> = shapefile .entries .iter() - .filter(|rings| rings.地震情報細分区域 != codes::地震情報細分区域::UNNUMBERED) + .filter(|rings| rings.細分区域 != codes::地震情報細分区域::UNNUMBERED) .map(|rings| { let polygons: Vec<(f64, geo::Point)> = rings .rings @@ -433,13 +434,13 @@ fn calculate_地震情報細分区域_centers( .map(|geo_polygon| (geo_polygon.unsigned_area(), geo_polygon.centroid().unwrap())) .collect(); - (rings.地震情報細分区域, polygons) + (rings.細分区域, polygons) }) .collect(); let centers: HashMap = weighted_vectors .into_iter() - .map(|(地震情報細分区域, weighted_vectors)| { + .map(|(細分区域, weighted_vectors)| { let weight: f64 = weighted_vectors .iter() .map(|(weight, _vector)| weight) @@ -453,7 +454,7 @@ fn calculate_地震情報細分区域_centers( }) .fold(Point::new(0.0.into(), 0.0.into()), |a, b| a + b); - (地震情報細分区域, vector.divide_by(weight as f32)) + (細分区域, vector.divide_by(weight as f32)) }) .collect();