Skip to content

Instantly share code, notes, and snippets.

@dnanto
Created June 25, 2020 18:14
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save dnanto/f37a80c5498c6a32ae8f72d7372415f3 to your computer and use it in GitHub Desktop.
Save dnanto/f37a80c5498c6a32ae8f72d7372415f3 to your computer and use it in GitHub Desktop.
Calculate the geographic midpoint given a list of geographic coordinates in R.
library(tidyverse)
geomid <- function(lat, lon)
{
# http://www.geomidpoint.com/calculation.html
lat <- lat * pi / 180
lon <- lon * pi / 180
x <- mean(sum(cos(lat) * cos(lon)))
y <- mean(sum(cos(lat) * sin(lon)))
z <- mean(sum(sin(lat)))
lat <- atan2(y, x)
hyp <- sqrt(x * x + y * y)
lon <- atan2(z, hyp)
c(lat = lat * 180 / pi, lon = lon * 180 / pi)
}
# calculate the geographic midpoint for each county in the US
map_data("county") %>%
mutate(polyname = str_c(region, subregion, sep = ",")) %>%
group_by(polyname) %>%
group_modify(~ {
as.data.frame(t(geomid(.x$lat, .x$long)))
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment