Skip to content

Latest commit

 

History

History
264 lines (202 loc) · 6.07 KB

2017-04-20-randgeo.md

File metadata and controls

264 lines (202 loc) · 6.07 KB
slug title author date topicid tags
randgeo
Random GeoJSON and WKT with randgeo
Scott Chamberlain
Noam Ross
2017-04-20
665
geospatial
geojson
wkt
software
tech notes

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)

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

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"

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))

{{< figure src = "/img/blog-images/2017-04-20-randgeo/plot1.png" width = "300" class = "center" caption = "Shapes visualized in R with lawn" alt = "visualize shapes with the lawn package for R" >}}

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()

{{< figure src = "/img/blog-images/2017-04-20-randgeo/plot2.png" width = "300" class = "center" caption = "Shapes visualized in R with lawn" alt = "visualize shapes with the lawn package for R" >}}

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)))

{{< figure src = "/img/blog-images/2017-04-20-randgeo/plot3.png" width = "300" class = "center" caption = "Shapes visualized in R with lawn" alt = "visualize shapes with the lawn package for R" >}}

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.