在Rust中提取GeoJson中MultiPolygon坐标的技术求助
在Rust中直接提取GeoJSON MultiPolygon的坐标
你可以通过匹配geojson::Value枚举的MultiPolygon变体,逐层解构嵌套向量来直接访问坐标,无需字符串解析。以下是修改后的代码:
use std::convert::TryFrom; use std::fs::read_to_string; use geojson::{FeatureCollection, GeoJson, Value}; fn main() { let geojson_filename: &str = "C:\\Users\\grego\\Documents\\Rust\\tryout\\Data\\ATP2052.geojson"; let geojson_str = read_to_string(geojson_filename).unwrap(); let geojson = geojson_str.parse::<GeoJson>().unwrap(); let features = FeatureCollection::try_from(geojson).unwrap(); for feature in features { if let Some(geom) = feature.geometry { match geom.value { Value::MultiPolygon(polygons) => { // 遍历MultiPolygon中的每个Polygon for polygon in polygons { // 遍历每个Polygon的环(外环+内环) for ring in polygon { // 遍历环中的每个坐标点 for coord in ring { let x = coord[0]; let y = coord[1]; println!("x: {}, y: {}", x, y); } } } } // 可按需添加其他几何类型的处理逻辑 _ => println!("非MultiPolygon类型"), } } } }
结构说明
GeoJSON的MultiPolygon在geojson库中对应嵌套向量结构:
- 最外层:
Vec<Vec<Vec<Vec<f64>>>>→ 代表MultiPolygon包含的多个Polygon - 第二层:
Vec<Vec<Vec<f64>>>→ 代表单个Polygon的所有环(第一个是外环,后续是内环) - 第三层:
Vec<Vec<f64>>→ 代表单个环的所有坐标点 - 最内层:
Vec<f64>→ 代表单个坐标点的[x, y]值
结合geo库的更优方案
如果需要对坐标做几何运算,可以将geojson结构转换为geo库的MultiPolygon类型,操作更直观:
use geo::MultiPolygon; use std::convert::TryInto; // 在上面的Value::MultiPolygon分支中添加: if let Ok(geo_multi_poly) = polygons.try_into() { for polygon in geo_multi_poly { // 处理外环坐标 println!("外环坐标:"); for coord in polygon.exterior().points_iter() { println!("x: {}, y: {}", coord.x(), coord.y()); } // 处理内环坐标 for (idx, interior) in polygon.interiors().iter().enumerate() { println!("第{}个内环坐标:", idx + 1); for coord in interior.points_iter() { println!("x: {}, y: {}", coord.x(), coord.y()); } } } }
内容的提问来源于stack exchange,提问作者PMG
相关产品推荐
相关产品推荐

