#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
Если у кого-нибудь есть идея для более элегантного кода, спасибо.