rgoogle-mapslatitude-longitudegoogle-latitudegoogle-elevation-api

How to extract altitude above sea level given latitude and longitude?


I am trying to extract altitude data for a given set of lats and longs in my data. I tried to look up some older answers (from 9-10 years ago)..but many of the methods are obsolete or the functions don't work. Any fresh suggestions?

lat <- c(45.08323,40.08323)
long <- c(-82.46797,-81.46797)
df <- data.frame(lat, long)

I have tried the following suggestions:

  1. Using the geonames package, and get the value from the srtm3 digital elevation model

I run into errors that say: Error in url(url, open = "r") : cannot open the connection to 'http://api.geonames.org/srtm3JSON?lat=NA&lng=NA&

  1. I tried using the googleway and elevatr pacakages as suggested in the linked answers

The elevatr package would not download for the latest R > 4.0 version.

I get an error that says   Configuration failed because libudunits2.so was not found. Try installing:
    * deb: libudunits2-dev (Debian, Ubuntu, ...)
    * rpm: udunits2-devel (Fedora, EPEL, ...)
    * brew: udunits (OSX)
  If udunits2 is already installed in a non-standard location, use:
    --configure-args='--with-udunits2-lib=/usr/local/lib'
  if the library was not found, and/or:
    --configure-args='--with-udunits2-include=/usr/include/udunits2'
  if the header was not found, replacing paths with appropriate values.
  You can alternatively set UDUNITS2_INCLUDE and UDUNITS2_LIBS manually. 

When I try installing the required package:

"package ‘libudunits2’ is not available for this version of R"

###EDIT: What worked?

library(geonames)
readLines(url("http://api.geonames.org/",open="r"))
options(geonamesUsername= "MyUsername") #Note you have to create a username one the website AND enable webservices on your geonames user account at https://www.geonames.org/manageaccount. 

GNsrtm3(54.481084,-3.220625)

Solution

  • This manages to get the second point, but not the first.

    library(elevatr)
    library(rgdal)
    lat <- c(45.08323,40.08323)
    long <- c(-82.46797,-81.46797)
    df <- data.frame(long, lat)
    get_elev_point(df, prj="EPSG:4326")
    # Note: Elevation units are in &units=Meters 
    # Note:. The coordinate reference system is:
    #  GEOGCRS["WGS 84 (with axis order normalized for visualization)",
    #     DATUM["World Geodetic System 1984",
    #         ELLIPSOID["WGS 84",6378137,298.257223563,
    #             LENGTHUNIT["metre",1]]],
    #     PRIMEM["Greenwich",0,
    #         ANGLEUNIT["degree",0.0174532925199433]],
    #     CS[ellipsoidal,2],
    #         AXIS["geodetic longitude (Lon)",east,
    #             ORDER[1],
    #             ANGLEUNIT["degree",0.0174532925199433,
    #                 ID["EPSG",9122]]],
    #         AXIS["geodetic latitude (Lat)",north,
    #             ORDER[2],
    #             ANGLEUNIT["degree",0.0174532925199433,
    #                 ID["EPSG",9122]]]]
    #             coordinates elevation elev_units
    # 1 (-82.46797, 45.08323)        NA     meters
    # 2 (-81.46797, 40.08323)    271.82     meters