# geoenrich
**geoenrich** is a small, fast command-line tool that adds geospatial
attributes to a table of points. Give it a file with `longitude` and `latitude`
columns and it appends any of: distance to the nearest coast, bathymetric depth,
the sea or ocean name, the nearest country and municipality, or the nearest
location in a second table you supply.
It is written in Rust, uses no PROJ or GDAL (the geometry is hand-rolled and
pure Rust), and reads and writes Parquet, CSV, TSV, and the gzip variants
`csv.gz` and `tsv.gz`.
## What you can do
| [`coast`](./commands/coast.md) | Distance to the nearest shoreline (GSHHG). |
| [`depth`](./commands/depth.md) | Bathymetric depth at the point (GEBCO grid). |
| [`sea`](./commands/sea.md) | Sea or ocean name at the point (IHO Sea Areas). |
| [`place`](./commands/place.md) | Nearest country and municipality (Natural Earth + GISCO). |
| [`nearest`](./commands/nearest.md) | Nearest location in a second table you supply, with its distance. |
## How it works
Every command follows the same pipeline: read the input, reduce it to unique
locations with rounded coordinates (3 decimals by default), enrich those unique
locations in parallel, then join the results back onto every input row. A file
with millions of rows but few distinct positions is therefore cheap to enrich,
because only the distinct positions are ever looked up.
## Quick example
```bash
# Distance to the nearest coast, in kilometers
geoenrich coast cores.parquet \
--data ./data/gshhg/gshhg-shp-2.3.7/GSHHS_shp/f
# Nearest fish farm to each measurement
geoenrich nearest cores.parquet --to farms.parquet --name-field farm_name
```
New here? Start with [Installation](./installation.md), skim the
[Commands](./commands/coast.md), then see the
[reference datasets](./data.md) each command needs.