geoarrow-csv 0.6.2

CSV reader and writer for GeoArrow
Documentation
# geoarrow-csv

Read and write CSV files with a geometry column encoded as [Well-Known Text (WKT)](https://libgeos.org/specifications/wkt/).

This crate provides efficient streaming readers and writers for CSV files containing geospatial data, converting between WKT string representations and GeoArrow's columnar format.

## Reading CSV Files

Use `CsvReader` to read CSV files with WKT-encoded geometry columns. The reader implements `RecordBatchReader` for batched processing.

### Example

`example.csv` contains sample data:

```csv
address,type,datetime,report location,incident number
904 7th Ave,Car Fire,05/22/19,POINT (-122.329051 47.6069),F190051945
9610 53rd Av S,Aid Response,"05/22/2019 12:55:00 PM,",POINT (-122.266529 47.515984),F190051946
```

```rust
use std::fs::File;
use std::io::BufReader;
use arrow_csv::ReaderBuilder;
use geoarrow_csv::reader::{CsvReader, CsvReaderOptions};
use geoarrow_schema::{GeoArrowType, PointType, Dimension};

let file = File::open("example.csv").unwrap();
let mut buf_reader = BufReader::new(file);

// Create Arrow CSV reader with schema inference
let format = arrow_csv::reader::Format::default().with_header(true);
let (schema, _) = format.infer_schema(&mut buf_reader, None).unwrap();
let arrow_reader = ReaderBuilder::new(schema.into())
    .with_format(format)
    .build(buf_reader).unwrap();

let point_type = PointType::new(Dimension::XY, Default::default());
let options = CsvReaderOptions {
    geometry_column_name: Some("report location".to_string()),
    to_type: GeoArrowType::Point(point_type),
};

// Create the GeoArrow CSV reader
let mut geo_reader = CsvReader::try_new(arrow_reader, options).unwrap();

for batch_result in geo_reader {
    let batch = batch_result.unwrap();
    println!("Read {} rows", batch.num_rows());
}
```

## Writing CSV Files

Use `CsvWriter` to export GeoArrow data to CSV format with WKT-encoded geometries.

### Example

```rust
use std::fs::File;
use std::io::BufReader;

use arrow_csv::WriterBuilder;
use arrow_csv::ReaderBuilder;
use geoarrow_csv::writer::CsvWriter;
use geoarrow_csv::reader::{CsvReader, CsvReaderOptions};
use geoarrow_schema::{PointType, Dimension, GeoArrowType};

let in_file = File::open("example.csv").unwrap();
let out_file = File::create("output.csv").unwrap();

// Setting up a Reader for in_file to read batches to write to out_file
let mut buf_reader = BufReader::new(in_file);
let format = arrow_csv::reader::Format::default().with_header(true);
let (schema, _) = format.infer_schema(&mut buf_reader, None).unwrap();
let arrow_reader = ReaderBuilder::new(schema.into())
    .with_format(format)
    .build(buf_reader).unwrap();
let point_type = PointType::new(Dimension::XY, Default::default());
let options = CsvReaderOptions {
    geometry_column_name: Some("report location".to_string()),
    to_type: GeoArrowType::Point(point_type),
};
let mut geo_reader = CsvReader::try_new(arrow_reader, options).unwrap();

// Setting up our Writer
let arrow_writer = WriterBuilder::new().with_header(true).build(out_file);
let mut csv_writer = CsvWriter::new(arrow_writer);

for batch_result in geo_reader {
    let batch = batch_result.unwrap();
    csv_writer.write(&batch).unwrap();
    println!("Wrote {} rows ", batch.num_rows())
}
```

## Supported WKT Geometries

All geometry types allowed by the GeoArrow WKT specification are supported. This includes 2D, 3D, and 4D geometries, but does not include extended types like curves.