{"id":13398212,"url":"https://github.com/UrbanAnalyst/dodgr","last_synced_at":"2025-03-14T02:30:45.891Z","repository":{"id":37778641,"uuid":"98281618","full_name":"UrbanAnalyst/dodgr","owner":"UrbanAnalyst","description":"Distances on Directed Graphs in R","archived":false,"fork":false,"pushed_at":"2024-09-30T16:05:38.000Z","size":12972,"stargazers_count":128,"open_issues_count":16,"forks_count":16,"subscribers_count":7,"default_branch":"main","last_synced_at":"2024-10-30T08:18:42.139Z","etag":null,"topics":["distance","openstreetmap","r","router","shortest-paths","street-networks"],"latest_commit_sha":null,"homepage":"https://urbananalyst.github.io/dodgr/","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/UrbanAnalyst.png","metadata":{"files":{"readme":"README.Rmd","changelog":"NEWS.md","contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":"codemeta.json"}},"created_at":"2017-07-25T08:12:09.000Z","updated_at":"2024-10-01T08:38:21.000Z","dependencies_parsed_at":"2023-11-19T21:43:27.883Z","dependency_job_id":"a798e8f5-a05a-4c5c-a8d4-253cddf35523","html_url":"https://github.com/UrbanAnalyst/dodgr","commit_stats":{"total_commits":1959,"total_committers":11,"mean_commits":178.0909090909091,"dds":0.02143950995405819,"last_synced_commit":"671fabdd6282f522234471094c2b3d7bebeb947f"},"previous_names":["urbananalyst/dodgr","atfutures/dodgr"],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UrbanAnalyst%2Fdodgr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UrbanAnalyst%2Fdodgr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UrbanAnalyst%2Fdodgr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UrbanAnalyst%2Fdodgr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/UrbanAnalyst","download_url":"https://codeload.github.com/UrbanAnalyst/dodgr/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243511577,"owners_count":20302576,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["distance","openstreetmap","r","router","shortest-paths","street-networks"],"created_at":"2024-07-30T19:00:20.367Z","updated_at":"2025-03-14T02:30:45.843Z","avatar_url":"https://github.com/UrbanAnalyst.png","language":"C++","funding_links":[],"categories":["Uncategorized","C++"],"sub_categories":["Uncategorized"],"readme":"---\ntitle: \"dodgr: Distances on Directed Graphs in R\"\noutput:\n  md_document:\n    variant: markdown_github\n\n  rmarkdown::html_vignette:\n    self_contained: no\n---\n\n\u003c!-- README.md is generated from README.Rmd. Please edit that file --\u003e\n\n```{r opts, echo = FALSE}\nknitr::opts_chunk$set (\n    collapse = TRUE,\n    warning = TRUE,\n    message = TRUE,\n    width = 120,\n    comment = \"#\u003e\",\n    fig.retina = 2,\n    fig.path = \"README-\"\n)\n```\n\n[![R build\nstatus](https://github.com/UrbanAnalyst/dodgr/workflows/R-CMD-check/badge.svg)](https://github.com/UrbanAnalyst/dodgr/actions?query=workflow%3AR-CMD-check)\n[![codecov](https://codecov.io/gh/UrbanAnalyst/dodgr/branch/main/graph/badge.svg)](https://app.codecov.io/gh/UrbanAnalyst/dodgr)\n[![Project Status: Active](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active)\n\n[![CRAN_Status_Badge](https://www.r-pkg.org/badges/version/dodgr)](https://cran.r-project.org/package=dodgr) \n[![CRAN Downloads](https://cranlogs.r-pkg.org/badges/grand-total/dodgr?color=orange)](https://cran.r-project.org/package=dodgr)\n[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/1396/badge)](https://bestpractices.coreinfrastructure.org/projects/1396)\n\n# dodgr: Distances on Directed Graphs in R\n\n`dodgr` is an R package for efficient calculation of many-to-many pairwise\ndistances on dual-weighted directed graphs, for aggregation of flows throughout\nnetworks, and for highly realistic routing through street networks (time-based\nrouting considering incline, turn-angles, surface quality, everything).\n\nNote that most `dodgr` algorithms implement parallel computation with the\n[`RcppParallel` library](https://rcppcore.github.io/RcppParallel/), and by\ndefault use the maximal number of available cores or threads. If you do not\nwish `dodgr`to use all available threads, please reduce the number manually by\nfirst specifying a value via\n```{r num_threads, eval = FALSE}\nRcppParallel::setThreadOptions (numThreads = 1L) # or desired number\n```\n\n\n## What's so special?\n\nFour aspects. First, while other packages exist for calculating distances on\ndirected graphs, notably [`igraph`](https://igraph.org/r/), even that otherwise\nfabulous package does not (readily) permit analysis of *dual-weighted* graphs.\nDual-weighted graphs have two sets of weights for each edge, so routing can be\nevaluated with one set of weights, while distances can be calculated with the\nother.  A canonical example is a street network, where *weighted distances* are\nassigned depending on mode of transport (for example, weighted distances for\npedestrians on multi-lane vehicular roads are longer than equivalent distances\nalong isolated walking paths), yet the desired output remains direct,\nunweighted distances. Accurate calculation of distances on street networks\nrequires a dual-weighted representation. In **R**, `dodgr` is currently the\nonly package that offers this functionality (without excessive data wrangling).\n\nSecond, while [`igraph`](https://igraph.org/r/) and almost all other routing\npackages are primarily designed for one-to-one routing, `dodgr` is specifically\ndesigned for many-to-many routing, and will generally outperform equivalent\npackages in large routing tasks.\n\nThird, `dodgr` goes beyond the functionality of comparable packages through\nincluding routines to aggregate flows throughout a network, through specifying\norigins, destinations, and flow densities between each pair of points.\nAlternatively, flows can be aggregated according to a network dispersal model\nfrom a set of origin points and associated densities, and a user-specified\ndispersal model.\n\nFourth and finally, `dodgr` implements highly realistic and fully-customisable\nprofiles for routing through street networks with various modes of transport,\nand using either distance- or time-based routing. Routing can include such\nfactors as waiting times at traffic lights, delays for turning across oncoming\ntraffic, access restrictions, and the effects of elevation on both cyclists and\npedestrians. See the dedicated vignette on [street networks and\ntime-based routing](https://UrbanAnalyst.github.io/dodgr/articles/times.html) for\nmore detail.\n\n\n## Installation\n\nYou can install latest stable version of `dodgr` from CRAN with:\n```{r cran-installation, eval = FALSE}\ninstall.packages (\"dodgr\") # current CRAN version\n```\nAlternatively, current development versions can be installed using any of the\nfollowing options:\n```{r gh-installation, eval = FALSE}\n# install.packages(\"remotes\")\nremotes::install_git (\"https://git.sr.ht/~mpadge/dodgr\")\nremotes::install_git (\"https://codeberg.org/UrbanAnalyst/dodgr\")\nremotes::install_bitbucket (\"UrbanAnalyst/dodgr\")\nremotes::install_gitlab (\"UrbanAnalyst/dodgr\")\nremotes::install_github (\"UrbanAnalyst/dodgr\")\n```\nThen load with\n```{r library}\nlibrary (dodgr)\npackageVersion (\"dodgr\")\n```\n\n## Important Note\n\nWhile `dodgr` works with any arbitrary networks, it also includes numerous\nfunctions explicitly intended to be applied to geodesic coordinates, which are\nidentified whenever input data have columns labelled \"longitude\" and\n\"latitude\", or similar. Coordinates for such data must be in the EPSG:4326\n(WGS84) coordinate system. `dodgr` treats coordinates as numbers only, and it\nis up to the user to ensure appropriate transformation to WGS84 coordinates\nprior to submitting data to `dodgr` functions.\n\n## Usage: Sample Data and `dodgr` networks\n\nTo illustrate functionality, the package includes an example data set\ncontaining the Open Street Map network for [Hampi,\nIndia](https://www.openstreetmap.org/#map=15/15.3368/76.4601) (a primarily\npedestrian village in the middle of a large World Heritage zone). These data\nare in [Simple Features (`sf`)](https://cran.r-project.org/package=sf) format,\nas a collection of `LINESTRING` objects. `dodgr` represents networks as\na simple rectangular graph, with each row representing an edge segment between\ntwo points or vertices. `sf`-format objects can be converted to equivalent\n`dodgr` representations with the `weight_streetnet()` function:\n```{r hampi}\nclass (hampi)\ndim (hampi)\ngraph \u003c- weight_streetnet (hampi, wt_profile = \"foot\")\nclass (graph)\ndim (graph)\n```\nThe `sf`-format network contained `r nrow (hampi)` `LINESTRING` objects, with\nthe `weight_streetnet()` function decomposing these into `r format (nrow (graph),\nbig.mark = \",\")` distinct edges, indicating that the `sf` representation had\naround `r round (nrow (graph) / nrow (hampi))` edges or segments in each\n`LINESTRING` object. The `dodgr` network then looks like this:\n```{r hampi-net-fakey, eval = FALSE}\nhead (graph)\n```\n```{r hampi-net, echo = FALSE}\nknitr::kable (head (graph))\n```\n\nThe `geom_num` column maps directly onto the sequence of `LINESTRING` objects\nwithin the `sf`-formatted data.  The `highway` column is taken directly from\nOpen Street Map, and denotes the kind of \"highway\" represented by each edge. The\n`component` column is an integer value describing which of the connected\ncomponents of the network each edge belongs to (with `1` always being the\nlargest component; `2` the second largest; and so on).\n\nNote that the `d_weighted` values are often greater than the geometric\ndistances, `d`. In the example shown, `service` highways are not ideal for\npedestrians, and so weighted distances are slightly greater than actual\ndistances. Compare this with:\n```{r hampi-net-faken2, eval = FALSE}\nhead (graph [graph$highway == \"path\", ])\n```\n```{r hampi-net2, echo = FALSE}\nknitr::kable (head (graph [graph$highway == \"path\", ]))\n```\n\nA `\"path\"` offers ideal walking conditions, and so weighted distances are equal\nto actual distances.\n\n\n\n\n\n## Usage: Distances and Times\n\nThe many-to-many nature of `dodgr` means that the function to calculate\ndistances,\n[`dodgr_distances()`](https://UrbanAnalyst.github.io/dodgr/reference/dodgr_distances.html)\nor, for street networks, times,\n[`dodgr_times()`](https://UrbanAnalyst.github.io/dodgr/reference/dodgr_times.html),\naccepts two vectors or matrices of routing\npoints as inputs (describing origins and destinations), and returns\na corresponding matrix of pairwise distances. If an input graph has columns for\nboth distances and weighted distances, and/or times and weighted times, the\nweighted versions are used to determine the effectively shortest or fastest\nroutes through a network, while actual distances or times are summed along the\nroutes to calculate final values. It is of course also possible to calculate\ndistances along fastest routes, times along shortest routes, or any combination\nthereof, as detailed in the package vignette on [street networks and time-based\nrouting](https://UrbanAnalyst.github.io/dodgr/articles/times.html).\n\nRouting points can, for example, be randomly selected from the vertices of a\ngraph. The vertices can in turn be extracted with the `dodgr_vertices()`\nfunction:\n```{r verts-fakey, eval = FALSE}\nv \u003c- dodgr_vertices (graph)\nhead (v)\n```\n```{r verts, echo = FALSE}\nv \u003c- dodgr_vertices (graph)\nknitr::kable (head (v))\n```\n\nFor OSM data extracted with the `osmdata` package (or, equivalently, via the\n`dodgr::dodgr_streetnet()` function), each object (vertices, ways, and\nhigh-level relations between these objects) is assigned a unique identifying\nnumber. These are retained both in `osmdata` and `dodgr`, as the `way_id` column\nin the above `graph`, and as the `id` column in the vertices. Random vertices\nmay be generated in this case through selecting `id` values:\n```{r random-verts}\nfrom \u003c- sample (v$id, size = 20)\nto \u003c- sample (v$id, size = 50)\nd \u003c- dodgr_dists (graph = graph, from = from, to = to)\ndim (d)\n```\nAlternatively, the points may be specified as matrices of geographic\ncoordinates:\n```{r}\nfrom_x \u003c- min (graph$from_lon) + runif (20) * diff (range (graph$from_lon))\nfrom_y \u003c- min (graph$from_lat) + runif (20) * diff (range (graph$from_lat))\nto_x \u003c- min (graph$from_lon) + runif (50) * diff (range (graph$from_lon))\nto_y \u003c- min (graph$from_lat) + runif (50) * diff (range (graph$from_lat))\nd \u003c- dodgr_dists (graph = graph, from = cbind (from_x, from_y), to = cbind (to_x, to_y))\n```\nIn this case, the random points will be mapped on to the nearest points on the\nstreet network. This may, of course, map some points onto minor, disconnected\ncomponents of the graph. This can be controlled either by reducing the graph to\nit's largest connected component only:\n```{r large-comp, eval = FALSE}\ngraph \u003c- graph [graph$component == 1, ]\nnrow (graph)\n```\nor by explicitly using the `match_points_to_verts()` function with the option\n`connected = TRUE`:\n```{r}\nfrom \u003c- match_points_to_verts (v, cbind (from_x, from_y), connected = TRUE)\nto \u003c- match_points_to_verts (v, cbind (to_x, to_y), connected = TRUE)\n```\nThis function returns an index into the result of `dodgr_vertices`, and so\npoints to use for routing must then be extracted as follows:\n```{r}\nfrom \u003c- v$id [from] # or from \u003c- v [from, c (\"x\", \"y\")]\nto \u003c- v$id [to]\nd \u003c- dodgr_dists (graph = graph, from = from, to = to)\n```\n\n## Usage: Flow Aggregation\n\nFlow aggregation refers to the procedure of routing along multiple ways\naccording to specified densities of flow between defined origin and destination\npoints, and aggregating flows along each edge of the network. The procedure is\nfunctionally similar to the above procedure for distances, with the addition of\na matrix specifying pairwise flow densities between the input set of origin\n(`from`) and destination (`to`) points. The following example illustrates use\nwith a random \"flow matrix\":\n\n```{r flows}\nflows \u003c- array (runif (length (from) * length (to)), dim = c (length (from), length (to)))\nlength (from)\nlength (to)\ndim (flows)\nf \u003c- dodgr_flows_aggregate (graph = graph, from = from, to = to, flows = flows)\n```\nThe result is simply the input `graph` with an additional column quantifying\nthe aggregate flows along each edge:\n```{r flows-out-fakey, eval = FALSE}\nhead (f)\n```\n```{r flows-out, echo = FALSE}\nknitr::kable (head (f))\n```\n\nAn additional flow aggregation function can be applied in cases where only\ndensities at origin points are known, and movement throughout a graph is\ndispersive:\n\n```{r, eval = FALSE}\nf \u003c- dodgr_flows_disperse (graph = graph, from = from, dens = runif (length (from)))\n```\n\n## Further detail\n\nFor more detail, see the [main package\nvignette](https://UrbanAnalyst.github.io/dodgr/articles/dodgr.html), and the second\nvignette on [street networks and time-based\nrouting](https://UrbanAnalyst.github.io/dodgr/articles/times.html)\n\n\n## Contributors\n\n\n\n\n\n\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\nAll contributions to this project are gratefully acknowledged using the [`allcontributors` package](https://github.com/ropensci/allcontributors) following the [allcontributors](https://allcontributors.org) specification. Contributions of any kind are welcome!\n\n### Code\n\n\u003ctable\u003e\n\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/mpadge\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/6697851?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/commits?author=mpadge\"\u003empadge\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/karpfen\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/11758039?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/commits?author=karpfen\"\u003ekarpfen\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/Robinlovelace\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/1825120?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/commits?author=Robinlovelace\"\u003eRobinlovelace\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/agila5\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/22221146?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/commits?author=agila5\"\u003eagila5\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/JimShady\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/2901470?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/commits?author=JimShady\"\u003eJimShady\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/DavisVaughan\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/19150088?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/commits?author=DavisVaughan\"\u003eDavisVaughan\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/leoniedu\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/54786?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/commits?author=leoniedu\"\u003eleoniedu\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/layik\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/408568?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/commits?author=layik\"\u003elayik\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/olivroy\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/52606734?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/commits?author=olivroy\"\u003eolivroy\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n\n### Issue Authors\n\n\u003ctable\u003e\n\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/chrjangit\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/13800425?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Achrjangit\"\u003echrjangit\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/rafapereirabr\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/7448421?u=01aed495e612154e54be4c51221e706cdff7779d\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Arafapereirabr\"\u003erafapereirabr\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/chrijo\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/37801457?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Achrijo\"\u003echrijo\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/dataandcrowd\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/25252172?u=2c62dac1ac9bfef3f26ee56c3d63b18dccc553a3\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Adataandcrowd\"\u003edataandcrowd\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/mem48\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/15819577?u=0c128db4e7567656c23e83e4314111fcea424526\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Amem48\"\u003emem48\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/fzenoni\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/6040873?u=bf32b8c1bc7ffc30c34bb09a1b0ae0f851414a48\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Afzenoni\"\u003efzenoni\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/mdsumner\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/4107631?u=77e928f4bb904a5c2e8927a02194b86662408329\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Amdsumner\"\u003emdsumner\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/nacnudus\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/3522552?u=53524b68ca89335d9079b7272ee6c2b0afda340a\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Anacnudus\"\u003enacnudus\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/mkvasnicka\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/8019045?u=16ba8f6406bcb20ade64481fbc177998bd1549fb\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Amkvasnicka\"\u003emkvasnicka\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/orlando-sabogal\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/7365739?u=047a8fa924d2be94b99e88e83c2634668ae1f005\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Aorlando-sabogal\"\u003eorlando-sabogal\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/tbuckl\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/98956?u=9580c2ee3c03cbbe44ac8180b0f6a6725b0415f0\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Atbuckl\"\u003etbuckl\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/douglascm\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/29764356?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Adouglascm\"\u003edouglascm\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/darinchristensen\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/6937320?u=987f49819efb67eda19f14e59f9c37b122ebc289\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Adarinchristensen\"\u003edarinchristensen\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/romainFr\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/1626262?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3AromainFr\"\u003eromainFr\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/dcooley\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/8093396?u=2c8d9162f246d90d433034d212b29a19e0f245c1\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Adcooley\"\u003edcooley\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/Hussein-Mahfouz\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/45176416?u=ceef68f4fec4aed25b069522e8c90fde3629c7f0\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3AHussein-Mahfouz\"\u003eHussein-Mahfouz\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/sigmafelix\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/25448786?u=92f45291c06443ff01cba29555f309ff3ceccee7\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Asigmafelix\"\u003esigmafelix\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/polettif\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/17431069?u=757eac2821736acbb02e7c90b456411d256d5780\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Apolettif\"\u003epolettif\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/edzer\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/520851?u=9bc892c3523be428dc211f2ccbcf04e8e0e564ff\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Aedzer\"\u003eedzer\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/FlxPo\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/5145583?u=cbd02ee0a0fa0447429f38bd7e3a1da57c841239\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3AFlxPo\"\u003eFlxPo\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/LeshunXu\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/48538622?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3ALeshunXu\"\u003eLeshunXu\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/deanmarchiori\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/9559770?u=5abd6534fd7f1cf94a54f894cdb12e017db1a9af\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Adeanmarchiori\"\u003edeanmarchiori\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/demcortillas\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/41303271?u=de6dad5177d4a0db395a751ba9a4f9acb32c9ef7\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Ademcortillas\"\u003edemcortillas\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/Urban-JonathanCohen\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/51330244?u=b67ded6a42ccf69116ed9999ba183b8523e8fde9\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3AUrban-JonathanCohen\"\u003eUrban-JonathanCohen\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/sriramab\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/12668606?u=353aaf316777539836fbd9b9f8e7ec5ae6527666\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Asriramab\"\u003esriramab\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/xiaofanliang\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/22874361?u=7d6ade584aeaf34e1fde47c400ffae1a82b79a25\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Axiaofanliang\"\u003exiaofanliang\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/grobins\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/4343493?u=48c1092702254899739e853db95cb1f704f99971\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Agrobins\"\u003egrobins\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/jucardwell\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/91475282?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Ajucardwell\"\u003ejucardwell\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/diegoteca\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/39192686?u=cca8991aa0bcabb4a3547aa81eacf99efcabcbfb\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Adiegoteca\"\u003ediegoteca\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/xtimbeau\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/54633745?u=578caa070217a333e22be67990e42e8bdf434512\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Axtimbeau\"\u003extimbeau\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/pasipasi123\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/34722481?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Apasipasi123\"\u003epasipasi123\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/jamiedtor\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/90428083?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Ajamiedtor\"\u003ejamiedtor\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/chinhqho\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/47441312?u=577d1dca03b4bb904bb45f1e6205b11144c900cd\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Achinhqho\"\u003echinhqho\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/szhorvat\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/1212871?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Aszhorvat\"\u003eszhorvat\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/nataliamush\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/21228099?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Anataliamush\"\u003enataliamush\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/juanfonsecaLS1\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/69847296?u=c6451574213e6cef9ce77d937970355d244240d5\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3AjuanfonsecaLS1\"\u003ejuanfonsecaLS1\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/luukvdmeer\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/26540305?u=c576e87314499815cbf698b7781ee58fd1d773e2\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Aluukvdmeer\"\u003eluukvdmeer\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/jonas260492\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/59968564?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+author%3Ajonas260492\"\u003ejonas260492\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n\n### Issue Contributors\n\n\u003ctable\u003e\n\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/virgesmith\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/19323577?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+commenter%3Avirgesmith\"\u003evirgesmith\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/richardellison\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/10625733?u=8d7cd55a61f1a1b3f9973ddff5adbb45e0b193c6\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+commenter%3Arichardellison\"\u003erichardellison\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/coatless\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/833642?u=d7a2ccb381bd1517d2d51778670ef227cbd8d3aa\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+commenter%3Acoatless\"\u003ecoatless\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/znmeb\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/4938?u=e9e8d4bececded56a36606575ae85ab55ab7633c\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+commenter%3Aznmeb\"\u003eznmeb\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/yihui\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/163582?v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+commenter%3Ayihui\"\u003eyihui\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\n\u003ca href=\"https://github.com/MartinLHazelton\"\u003e\n\u003cimg src=\"https://avatars.githubusercontent.com/u/36397695?u=bc2261049e9b33f2c5d8e25f0bd56d4b1d6275df\u0026v=4\" width=\"100px;\" alt=\"\"/\u003e\n\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/UrbanAnalyst/dodgr/issues?q=is%3Aissue+commenter%3AMartinLHazelton\"\u003eMartinLHazelton\u003c/a\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n\u003c!-- markdownlint-enable --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FUrbanAnalyst%2Fdodgr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FUrbanAnalyst%2Fdodgr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FUrbanAnalyst%2Fdodgr/lists"}