Search code examples
pythonapipython-requestselevation

Efficiently using the OpenElevation API using Python


I have a large set of latitude/longitude coordinates and would like to get the elevation for each. I want to use the OpenElevation API. According to their API Docs, I can get elevation data through the URL: https://api.open-elevation.com/api/v1/lookup?locations=10,10|20,20|41.161758,-8.583933. As you can see from the example URL, it is possible to get many elevations in a single request (provided you are using POST). However, when I try to implement the example they have used:


elevation = requests.post('https://api.open-elevation.com/api/v1/lookup', params={"locations": "10,10"}).content
print(elevation)

This is the result: b'{"error": "Invalid JSON."}'

The URL being submitted is: https://api.open-elevation.com/api/v1/lookup?locations=10%2C10 which is definitely in incorrect format.


Solution

  • After taking a quick look at the documentation. The POST endpoint requires the parameters be sent in the request body in JSON format with the appropriate headers

    Here is a working example:

    import requests
    import json
    
    response = requests.post(
                url="https://api.open-elevation.com/api/v1/lookup",
                headers={
                    "Accept": "application/json",
                    "Content-Type": "application/json; charset=utf-8",
                },
                data=json.dumps({
                    "locations": [
                        {
                            "longitude": 10,
                            "latitude": 10
                        },
                        {
                            "longitude": 20,
                            "latitude": 20
                        }
                    ]
                })
            )
    
    print('Response HTTP Status Code: {status_code}'.format(status_code=response.status_code))
    print('Response HTTP Response Body: {content}'.format(content=response.content))
    

    Response:

    Response HTTP Status Code: 200
    Response HTTP Response Body: b'{"results": [{"latitude": 10, "longitude": 10, "elevation": 515}, {"latitude": 20, "longitude": 20, "elevation": 545}]}'