Полилиния, указывающая с помощью Rust -шейп-файла

#rust #shapefile

#Ржавчина #шейп-файл

Вопрос:

С помощью приведенного ниже кода я могу создать полилинию и записать ее в файл формы. Но я также хотел бы прочитать файл формы типа Polyline и преобразовать точку, чтобы получить x: f64 и y: f64.

 use shapefile::{Point, Polyline};
let points = vec![
    Point::new(1.0, 1.0),
    Point::new(2.0, 2.0),
];
let poly = Polyline::new(points);
  

Если я напечатаю poly, «результат» будет:

 GenericPolyline { bbox: GenericBBox { max: Point { x: 2.0, y: 2.0 }, min: Point { x: 1.0, y: 1.0 } }, parts: [[Point { x: 1.0, y: 1.0 }, Point { x: 2.0, y: 2.0 }]] }
  

Я ищу код для получения этого «результата» и извлечения координат x и y.

Комментарии:

1.Для чтения файла формы я использую: let shapes = shapefile::read("INFILL_13.shp").unwrap(); let multilines = convert_shapes_to_vec_of::<Polyline&&t;(shapes);

2. Проверьте lib.rs/search ? q=шейп-файл для ящиков, которые могут анализировать шейп-файлы.

Ответ №1:

В документации API говорится:

Если вы заранее знаете точный тип, из которого сделан файл .shp, вы можете использовать другие функции *_as::().:

  • read_as Для чтения всех фигур как указанного типа iter_shapes_as для
  • повторите фигуры как фигуры указанного типа
  • iter_shapes_and_records_as Для перебора как фигур, так и записей

Итак, вы могли бы сделать это:

 let reader = shapefile::Reader::from_path("yourfile").unwrap();
let polylines = reader.read_as::<shapefile::Polyline&&t;().unwrap();
  

Обратите внимание, что read_as возвращает Result — одна из ошибок, которая может возникнуть, заключается в том, что файл содержит что-то отличное от полилиний, поэтому unwrap его следует заменить некоторой надлежащей обработкой ошибок.

Ответ №2:

Решение, которое я нашел, чтобы получить только x и y из файлов формы полилинии, было:

 let reader = Reader::from_path("INFILL_13.shp").unwrap();
for result in reader.iter_shapes_and_records_as::<Polyline&&t;().unwrap() {
        let (shape, _record) = result.unwrap();
        for vpoints in shape.into_inner() {
            let mut Ss = Strin&::new();
            for ponto in vpoints {
                let s1: Strin& = ponto.x.to_strin&();
                let s2: Strin& = ponto.y.to_strin&();
                Ss.push_str(amp;s1);
                Ss.push_str(",");
                Ss.push_str(amp;s2);
            }
            println!("{}", Ss);
        }
    }
  

Напечатанная строка Ss:

 433403.6336002172,9548194.73184583449320.9987682806,9548289.982036332
433578.2589494678,9545958.998207698447687.92377904576,9545934.337120913
432939.3578235788,9542948.50823259443405.9999662347,9542971.00001528
439195.75016969733,9555649.486134548435244.52425377554,9538460.087277636
  

Если у кого-нибудь есть идея для более элегантного кода, спасибо.