By Scott Chamberlain, Noam Ross

**rOpenSci Blog**, and kindly contributed to R-bloggers)

**randgeo** generates random points and shapes in GeoJSON and WKT formats for

use in examples, teaching, or statistical applications.

Points and shapes are generated in the long/lat coordinate system and with

appropriate spherical geometry; random points are distributed evenly across

the globe, and random shapes are sized according to a maximum great-circle

distance from the center of the shape.

**randgeo** was adapted from https://github.com/tmcw/geojson-random to have

a pure R implementation without any dependencies as well as appropriate

geometry. Data generated by **randgeo** may be processed or displayed of with

packages such as **sf**,**wicket**,**geojson**,**wellknown**,**geojsonio**, or**lawn**.

Package API:

`rg_position`

– random position (lon, lat)`geo_point`

– random GeoJSON point`geo_polygon`

– random GeoJSON polygon`wkt_point`

– random WKT point`wkt_polygon`

– random WKT polygon

## setup

Install `randgeo`

– and we’ll need a few other packages for examples below.

```
install.packages("randgeo")
install.packages(c('leaflet', 'lawn'))
```

```
library(randgeo)
```

## GeoJSON

Functions that start with `geo`

are for creating GeoJSON data in JSON format.

If you want to create an R list or data.frame, you can use `jsonlite::fromJSON`

.

### Random point

Evenly distributed across the sphere. The `bbox`

option allows

you to limit points to within long/lat bounds.

```
geo_point()
#> $type
#> [1] "FeatureCollection"
#>
#> $features
#> $features[[1]]
#> $features[[1]]$type
#> [1] "Feature"
#>
#> $features[[1]]$geometry
#> $features[[1]]$geometry$type
#> [1] "Point"
#>
#> $features[[1]]$geometry$coordinates
#> [1] 105.95999 -46.58477
#>
#>
#> $features[[1]]$properties
#> NULL
#>
#>
#>
#> attr(,"class")
#> [1] "geo_list"
```

### Random polygon

Centered on a random point, with default maximum size

```
geo_polygon()
#> $type
#> [1] "FeatureCollection"
#>
#> $features
#> $features[[1]]
#> $features[[1]]$type
#> [1] "Feature"
#>
#> $features[[1]]$geometry
#> $features[[1]]$geometry$type
#> [1] "Polygon"
#>
#> $features[[1]]$geometry$coordinates
#> $features[[1]]$geometry$coordinates[[1]]
#> $features[[1]]$geometry$coordinates[[1]][[1]]
#> [1] -138.49434 -25.11895
#>
#> $features[[1]]$geometry$coordinates[[1]][[2]]
#> [1] -145.95566 -28.17623
#>
#> $features[[1]]$geometry$coordinates[[1]][[3]]
#> [1] -145.87817 -28.74364
#>
#> $features[[1]]$geometry$coordinates[[1]][[4]]
#> [1] -146.61325 -28.59748
#>
#> $features[[1]]$geometry$coordinates[[1]][[5]]
#> [1] -139.18167 -31.07703
#>
#> $features[[1]]$geometry$coordinates[[1]][[6]]
#> [1] -140.88748 -31.24708
#>
#> $features[[1]]$geometry$coordinates[[1]][[7]]
#> [1] -143.50402 -33.93551
#>
#> $features[[1]]$geometry$coordinates[[1]][[8]]
#> [1] -146.48114 -30.43185
#>
#> $features[[1]]$geometry$coordinates[[1]][[9]]
#> [1] -144.68315 -35.45465
#>
#> $features[[1]]$geometry$coordinates[[1]][[10]]
#> [1] -157.58084 -24.52897
#>
#> $features[[1]]$geometry$coordinates[[1]][[11]]
#> [1] -138.49434 -25.11895
#>
#>
#>
#>
#> $features[[1]]$properties
#> NULL
#>
#>
#>
#> attr(,"class")
#> [1] "geo_list"
```

Visualize your shapes with **lawn**.

```
lawn::view(jsonlite::toJSON(unclass(geo_polygon(count = 4)), auto_unbox = TRUE))
```

## WKT

Functions prefixed with `wkt`

create random Well-Known Text (WKT) data. These functions

wrap the GeoJSON versions, but then convert the data to WKT.

### Random point

```
wkt_point()
#> [1] "POINT (179.8795330 -29.1106238)"
```

### Random polygon

```
wkt_polygon()
#> [1] "POLYGON ((-60.0870329 -12.9315478, -61.5073816 -25.3204334, -62.6987366 -24.5766272, -64.1853669 -24.0497260, -67.7152546 -27.4752321, -68.4190340 -26.9510818, -67.6018452 -21.5489551, -64.3083560 -21.6772242, -63.1471630 -21.9415438, -64.1137279 -14.2398013, -60.0870329 -12.9315478))"
```

## Use case

Example of geospatial data manipulation, using `randgeo`

, `leaflet`

and`lawn`

.

Steps:

- Generate random overlapping polygons
- Calculate a single polygon from overlapping polygons
- Map polygon
- Generate random locaitons (points)
- Clip locations to the polygon
- Overlay locations (more random points) on the polygon

```
library(randgeo)
library(lawn)
library(leaflet)
```

### generate random data

```
set.seed(5)
polys <- randgeo::geo_polygon(count = 2, num_vertices = 4, bbox = c(-120, 40, -100, 50))
```

### Get intersection of polygons

```
polysinter <- lawn::lawn_intersect(polys$features[[1]], polys$features[[2]])
```

### map polygons

```
polysinter %>% lawn::view()
```

### generate random points – clip points to polygon

```
pts <- randgeo::geo_point(count = 500, bbox = c(-120, 40, -100, 50))
pts <- lawn::lawn_within(
points = lawn_featurecollection(pts),
polygons = lawn_featurecollection(polysinter)
)
```

### Draw polygon + points on map

```
polysinter %>%
view() %>%
addGeoJSON(geojson = jsonlite::toJSON(unclass(pts)))
```

## Feedback

Let us know what you think! `randgeo`

doesn’t have any revdep’s on CRAN yet, but

is being used in one package on GitHub.

**leave a comment**for the author, please follow the link and comment on their blog:

**rOpenSci Blog**.

R-bloggers.com offers

**daily e-mail updates**about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more…

Source:: R News