Search code examples
python-3.xapiurllib

Python urllib.request shows RemoteDisconnected error with OpenElevation API


I have an application (written in PyQt5) that returns x, y, and elevation of a location. When the user fills up the x, y, and hits getz button, the app calls the function below:

def getz(self, i):
    """calculates the elevation"""
    import urllib
    url = "https://api.open-elevation.com/api/v1/lookup"
    x = self.lineEditX.text()
    y = self.lineEditY.text()
    url = url + "\?locations\={},{}".format(x, y)
    print(url)
    if i is "pushButtonSiteZ":
        response = urllib.request.Request(url)
        fp= urllib.request.urlopen(response)
        print('response is '+ response)
        self.lineEditSiteZ.setText(fp)

according to Open Elevation guide, it says that you have to make requests in the form of:

curl https://api.open-elevation.com/api/v1/lookup\?locations\=50.3354,10.4567

in order to get elevation data as a JSON object. But in my case it returns an error saying:

raise RemoteDisconnected("Remote end closed connection without"

RemoteDisconnected: Remote end closed connection without response

and nothing happens. How can I fix this?


Solution

  • There is no other way than to create a loop (try until the response is ok). Because the Open Elevation API's handling of so many responses is still problematic. But the following piece of code works after a possibly long delay:

    def getz(self, i):
        import json
        import requests
        url = "https://api.open-elevation.com/api/v1/lookup"
        """calculates the elevation"""
        if i is 'pushButtonSiteZ':
            x = self.lineEditSiteX.text()
            y = self.lineEditSiteY.text()
            param = url + '?locations={},{}'.format(x,y)
            print(param)
            while True:
                try:
                    response = requests.get(param)
                    print(response.status_code)
                    if str(response.status_code) == '200':
                        r = response.text
                        r = json.loads(r)
                        out = r['results'][0]['elevation']
                        print(out)
                        self.lineEditSiteZ.setText(str(out))
                        cal_rng(self)
                        break
                except ConnectionError:
                    continue
                except json.decoder.JSONDecodeError:
                    continue
                except KeyboardInterrupt:
                    continue
                except requests.exceptions.SSLError:
                    continue
                except requests.exceptions.ConnectionError:
                    continue