Skip to content

Commit

Permalink
parser: gml:MultiGeometry をパースできるようにする (#463)
Browse files Browse the repository at this point in the history
gml:MultiGeometry で記述されたジオメトリをパースできるようにする。

(ジオメトリの表現に MultiGeometry を使うのはPLATEAUの仕様に違反しているようではあるが)

Close #462

gml:MultiGeometry が使われている事例
`08220_tsukuba-shi_city_2022_citygml_3_op/udx/frn/54400099_*_6697_op.gml`
の変換結果:


![Untitled](https://github.com/MIERUNE/PLATEAU-GIS-Converter/assets/5351911/c2fdde1c-34cc-49bc-a2a6-759ca11c8757)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **新機能**
	- 複数のジオメトリをループ内で処理するための新しい関数`parse_multi_geometry`を追加しました。
-
`MultiGeometry`要素の解析を`parse_multi_geometry`を呼び出すことによって処理するように`parse_geometry_prop`を更新しました。
	- 解析中に予期しない要素やテキスト内容に対するエラー処理を改善しました。

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
  • Loading branch information
ciscorn authored Mar 13, 2024
1 parent 0270246 commit 91e4afd
Showing 1 changed file with 48 additions and 1 deletion.
49 changes: 48 additions & 1 deletion nusamai-citygml/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,49 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> {
Ok(())
}

fn parse_multi_geometry(
&mut self,
geomrefs: &mut GeometryRefs,
lod: u8,
) -> Result<(), ParseError> {
let mut inside_member = false;
loop {
match self.reader.read_event_into(&mut self.state.buf1) {
Ok(Event::Start(start)) => {
let (nsres, localname) = self.reader.resolve_element(start.name());

match (nsres, localname.as_ref()) {
(Bound(GML31_NS), b"geometryMember") => {
inside_member = true;
self.parse_geometry_prop(geomrefs, lod)?;
}
_ => {
return Err(ParseError::SchemaViolation(format!(
"Unexpected geometry elements <{}>",
String::from_utf8_lossy(start.name().as_ref())
)))
}
};
}
Ok(Event::End(_)) => {
if inside_member {
inside_member = false;
} else {
break;
}
}
Ok(Event::Text(_)) => {
return Err(ParseError::SchemaViolation(
"Unexpected text content".into(),
))
}
Ok(_) => (),
Err(e) => return Err(e.into()),
}
}
Ok(())
}

fn parse_geometry_prop(
&mut self,
geomrefs: &mut GeometryRefs,
Expand All @@ -482,6 +525,10 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> {
}

let geomtype = match (nsres, localname.as_ref()) {
(Bound(GML31_NS), b"MultiGeometry") => {
self.parse_multi_geometry(geomrefs, lod)?;
return Ok(());
}
(Bound(GML31_NS), b"Solid") => {
self.parse_solid()?;
GeometryType::Solid
Expand Down Expand Up @@ -924,7 +971,7 @@ impl<'b, R: BufRead> SubTreeReader<'_, 'b, R> {
}
_ => {
return Err(ParseError::SchemaViolation(format!(
"Unexpected geometry elements <{}>",
"TexCoordList is expected but found <{}>",
String::from_utf8_lossy(start.name().as_ref())
)))
}
Expand Down

0 comments on commit 91e4afd

Please sign in to comment.