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).

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:

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
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

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.