An open API service indexing awesome lists of open source software.

https://github.com/josiahparry/anime

Approximate Network Integration, Matching, and Enrichment
https://github.com/josiahparry/anime

python r-spatial rstats rust transportation-network

Last synced: 2 months ago
JSON representation

Approximate Network Integration, Matching, and Enrichment

Awesome Lists containing this project

README

          

# ANIME: Approximate Network Integration, Matching, and Enrichment

ANIME is a fast and efficient algorithm to perform partial linestring
matching and attribute interpolation between two sets of linestrings.

The core algorithm is implemented in the `anime` Rust crate ([see Rust
docs](https://docs.rs/anime/)) with bindings to the algorithm in both R
and Python.

## What it does

The `anime` algorithm calculates the approximate shared length between
two sets of linestrings within a specified **distance** and **angle**
tolerance.

For each source linestring, the distance of overlap with a target
linestring is stored. The distance of overlap is then used to perform
intensive or extensive interpolation of attributes.

## Example

``` r
library(sf)
library(dplyr)
library(anime)
library(ggplot2)

# get sample lines from package
targets_fp <- system.file("extdata", "maine-osm-targets.fgb", package = "anime")
sources_fp <- system.file("extdata", "maine-tigris-sources.fgb", package = "anime")

# read files
targets <- read_sf(targets_fp)
sources <- read_sf(sources_fp)

matches <- anime(
sources,
targets,
10, 5
)

# extract matches as a data.frame
match_tbl <- get_matches(matches)
match_tbl
```

# A data frame: 23 × 5
target_id source_id shared_len source_weighted target_weighted
*
1 1 1 73.5 1.00 1.25
2 2 1 50.0 0.680 0.933
3 3 1 73.5 1.00 0.991
4 4 2 0 0 0
5 6 1 0 0 0
6 7 2 0 0 0
7 8 2 0 0 0
8 11 1 18.7 0.255 0.752
9 12 2 170. 0.895 0.894
10 13 3 132. 0.983 0.993
# ℹ 13 more rows

``` r
# find most matched source
most_matched_source <- count(match_tbl, source_id, sort = TRUE) |>
slice(1) |>
pull(source_id)

# find the matched targets in the sf object
matched_tars <- match_tbl |>
filter(source_id == most_matched_source, shared_len > 0) |>
inner_join(transmute(targets, target_id = row_number())) |>
st_as_sf()

# visualize them
ggplot() +
geom_sf(aes(color = shared_len), matched_tars, lwd = 2) +
geom_sf(data = sources[most_matched_source, ], lty = 2) +
scale_color_binned() +
theme_void()
```

![](README_files/figure-commonmark/unnamed-chunk-1-1.png)