Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sckott/geoops
geoops does spatial operations on GeoJSON
https://github.com/sckott/geoops
geojson geospatial polygon r r-package rstats
Last synced: 18 days ago
JSON representation
geoops does spatial operations on GeoJSON
- Host: GitHub
- URL: https://github.com/sckott/geoops
- Owner: sckott
- License: other
- Created: 2016-04-12T21:25:23.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2020-12-21T20:09:55.000Z (almost 4 years ago)
- Last Synced: 2024-10-09T15:45:22.055Z (29 days ago)
- Topics: geojson, geospatial, polygon, r, r-package, rstats
- Language: C++
- Homepage:
- Size: 7.29 MB
- Stars: 23
- Watchers: 8
- Forks: 4
- Open Issues: 3
-
Metadata Files:
- Readme: README.Rmd
- Contributing: .github/CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Codemeta: codemeta.json
Awesome Lists containing this project
README
geoops
======```{r echo=FALSE}
library("knitr")
hook_output <- knitr::knit_hooks$get("output")
knitr::knit_hooks$set(output = function(x, options) {
lines <- options$output.lines
if (is.null(lines)) {
return(hook_output(x, options)) # pass to default hook
}
x <- unlist(strsplit(x, "\n"))
more <- "..."
if (length(lines)==1) { # first n lines
if (length(x) > lines) {
# truncate the output, but add ....
x <- c(head(x, lines), more)
}
} else {
x <- c(if (abs(lines[1])>1) more else NULL,
x[lines],
if (length(x)>lines[abs(length(lines))]) more else NULL
)
}
# paste these lines together
x <- paste(c(x, ""), collapse = "\n")
hook_output(x, options)
})knitr::opts_chunk$set(
comment = "#>",
collapse = TRUE,
warning = FALSE,
message = FALSE,
fig.path = "man/figures/"
)
```[![Project Status: Active - The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active)
![R-CMD-check](https://github.com/sckott/geoops/workflows/R-CMD-check/badge.svg)
[![codecov](https://codecov.io/gh/sckott/geoops/branch/master/graph/badge.svg)](https://codecov.io/gh/sckott/geoops)
[![cran checks](https://cranchecks.info/badges/worst/geoops)](https://cranchecks.info/pkgs/geoops)
[![rstudio mirror downloads](https://cranlogs.r-pkg.org/badges/geoops)](https://github.com/metacran/cranlogs.app)
[![cran version](https://www.r-pkg.org/badges/version/geoops)](https://cran.r-project.org/package=geoops)`geoops` does spatial operations on GeoJSON.
`geoops` is inspired by the JS library turf (http://turfjs.org/). It's
tagline is _Advanced geospatial analysis for browsers and node_.
Turf works only with GeoJSON, as does `geoops`. I don't know JS that well,
but it's easy enough to understand the language, so I've been porting
Turf to C++ wrapped up in R. The C++ so we can have fast performance. We've
also wrapped the Turf JS library itself in the package
lawn (https://github.com/ropensci/lawn), but we should be able to get better
performance out of C++.`geoops` has a ways to go to include all the methods that Turf has, but
we'll get there eventually.All data is expected to be in WGS-84.
We use a library from Niels Lohmann (https://github.com/nlohmann/json)
for working with JSON in C++.See also:
* geojson: https://github.com/ropensci/geojson
Package API:
```{r echo=FALSE}
cat(paste(" -", paste(getNamespaceExports("geoops"), collapse = "\n - ")))
```## Installation
Stable version
```{r eval=FALSE}
install.packages("geoops")
```Dev version
```{r eval=FALSE}
remotes::install_github("sckott/geoops")
``````{r}
library("geoops")
```See the vignette (link here) to get started.
## comparison to rgeos
### distance
```{r}
pt1 <- '{"type":"Feature","properties":{"marker-color":"#f00"},"geometry":{"type":"Point","coordinates":[-75.343,39.984]}}'
pt2 <- '{"type":"Feature","properties":{"marker-color":"#0f0"},"geometry":{"type":"Point","coordinates":[-75.534,39.123]}}'
library(rgeos)
rgeospt1 <- rgeos::readWKT("POINT(0.5 0.5)")
rgeospt2 <- rgeos::readWKT("POINT(2 2)")
``````{r}
microbenchmark::microbenchmark(
rgeos = rgeos::gDistance(rgeospt1, rgeospt2),
geoops = geoops::geo_distance(pt1, pt2, units = "miles"),
times = 10000L
)
```### nearest
```{r}
point1 <- '{"type":["Feature"],"properties":{"marker-color":["#0f0"]},"geometry":{"type":["Point"],"coordinates":[28.9658,41.0101]}}'
point2 <- '{"type":["FeatureCollection"],"features":[{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[28.9739,41.0111]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[28.9485,41.0242]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[28.9387,41.0133]}}]}'
points <- '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[28.9739,41.0111]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[28.9485,41.0242]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[28.9387,41.0133]}}]}'
g1 <- readWKT("MULTILINESTRING((34 54, 60 34), (0 10, 50 10, 100 50))")
g2 <- readWKT("POINT(100 30)")
``````{r}
microbenchmark::microbenchmark(
rgeos = rgeos::gNearestPoints(g1, g2),
geoops = geoops::geo_nearest(point1, points),
times = 10000L
)
```## Example use case
expand
Get some GeoJSON data, a FeatureCollection of Polygons
```{r}
file <- system.file("examples/zillow_or.geojson", package = "geoops")
x <- paste0(readLines(file), collapse = "")
```Break each polygon into separate JSON string
```{r}
library("jqr")
polys <- unclass(jq(x, ".features[]"))
```Using `geo_area`, calculate the area of the polygon
```{r}
areas <- vapply(polys, geo_area, 1, USE.NAMES = FALSE)
```Visualize area of the polygons as a histogram
```{r}
hist(areas, main = "")
```Visualize some of the polygons, all of them
```{r}
library(leaflet)
leaflet() %>%
addProviderTiles(provider = "OpenStreetMap.Mapnik") %>%
addGeoJSON(geojson = x) %>%
setView(lng = -123, lat = 45, zoom = 7)
```Just one of them
```{r}
leaflet() %>%
addProviderTiles(provider = "OpenStreetMap.Mapnik") %>%
addGeoJSON(geojson = polys[1]) %>%
setView(lng = -122.7, lat = 45.48, zoom = 13)
```## Meta
* Please [report any issues or bugs](https://github.com/sckott/geoops/issues).
* License: MIT
* Get citation information for `geoops` in R doing `citation(package = 'geoops')`
* Please note that this project is released with a [Contributor Code of Conduct][coc].
By participating in this project you agree to abide by its terms.[coc]: https://github.com/sckott/geoops/blob/master/CODE_OF_CONDUCT.md