You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:25:08