6
6
from .errors import (OverpassSyntaxError , TimeoutError , MultipleRequestsError ,
7
7
ServerLoadError , UnknownOverpassError , ServerRuntimeError )
8
8
9
+
9
10
class API (object ):
10
- """A simple Python wrapper for the OpenStreetMap Overpass API"""
11
+ """A simple Python wrapper for the OpenStreetMap Overpass API. """
11
12
12
13
SUPPORTED_FORMATS = ["geojson" , "json" , "xml" ]
13
14
14
15
# defaults for the API class
15
16
_timeout = 25 # second
16
- _endpoint = "http ://overpass-api.de/api/interpreter"
17
+ _endpoint = "https ://overpass-api.de/api/interpreter"
17
18
_debug = False
18
19
19
20
_QUERY_TEMPLATE = "[out:{out}];{query}out {verbosity};"
@@ -26,45 +27,52 @@ def __init__(self, *args, **kwargs):
26
27
self ._status = None
27
28
28
29
if self .debug :
29
- # http ://stackoverflow.com/a/16630836
30
+ # https ://stackoverflow.com/a/16630836
30
31
try :
31
32
import http .client as http_client
32
33
except ImportError :
33
34
# Python 2
34
35
import httplib as http_client
35
36
http_client .HTTPConnection .debuglevel = 1
36
37
37
- # You must initialize logging, otherwise you'll not see debug output.
38
+ # You must initialize logging,
39
+ # otherwise you'll not see debug output.
38
40
logging .basicConfig ()
39
41
logging .getLogger ().setLevel (logging .DEBUG )
40
42
requests_log = logging .getLogger ("requests.packages.urllib3" )
41
43
requests_log .setLevel (logging .DEBUG )
42
44
requests_log .propagate = True
43
45
44
-
45
- def Get (self , query , responseformat = "geojson" , verbosity = "body" , build = True ):
46
- """Pass in an Overpass query in Overpass QL"""
47
-
46
+ def Get (self ,
47
+ query ,
48
+ responseformat = "geojson" ,
49
+ verbosity = "body" ,
50
+ build = True ):
51
+ """Pass in an Overpass query in Overpass QL."""
48
52
# Construct full Overpass query
49
53
if build :
50
- full_query = self ._ConstructQLQuery (query , responseformat = responseformat , verbosity = verbosity )
54
+ full_query = self ._ConstructQLQuery (query ,
55
+ responseformat = responseformat ,
56
+ verbosity = verbosity )
51
57
else :
52
58
full_query = query
53
59
54
60
if self .debug :
55
61
logging .getLogger ().info (query )
56
-
62
+
57
63
# Get the response from Overpass
58
64
raw_response = self ._GetFromOverpass (full_query )
59
65
60
66
if responseformat == "xml" or responseformat .startswith ("csv" ):
61
67
return raw_response
62
-
68
+
63
69
response = json .loads (raw_response )
64
70
65
- # Check for valid answer from Overpass. A valid answer contains an 'elements' key at the root level.
71
+ # Check for valid answer from Overpass.
72
+ # A valid answer contains an 'elements' key at the root level.
66
73
if "elements" not in response :
67
- raise UnknownOverpassError ("Received an invalid answer from Overpass." )
74
+ raise UnknownOverpassError (
75
+ "Received an invalid answer from Overpass." )
68
76
69
77
# If there is a 'remark' key, it spells trouble.
70
78
overpass_remark = response .get ('remark' , None )
@@ -88,10 +96,15 @@ def _ConstructQLQuery(self, userquery, responseformat, verbosity):
88
96
89
97
if responseformat == "geojson" :
90
98
template = self ._GEOJSON_QUERY_TEMPLATE
91
- complete_query = template .format (query = raw_query , verbosity = verbosity )
99
+ complete_query = template .format (
100
+ query = raw_query ,
101
+ verbosity = verbosity )
92
102
else :
93
103
template = self ._QUERY_TEMPLATE
94
- complete_query = template .format (query = raw_query , out = responseformat , verbosity = verbosity )
104
+ complete_query = template .format (
105
+ query = raw_query ,
106
+ out = responseformat ,
107
+ verbosity = verbosity )
95
108
96
109
if self .debug :
97
110
print (complete_query )
@@ -110,7 +123,7 @@ def _GetFromOverpass(self, query):
110
123
timeout = self .timeout ,
111
124
headers = {'Accept-Charset' : 'utf-8;q=0.7,*;q=0.7' }
112
125
)
113
-
126
+
114
127
except requests .exceptions .Timeout :
115
128
raise TimeoutError (self ._timeout )
116
129
@@ -125,9 +138,7 @@ def _GetFromOverpass(self, query):
125
138
raise ServerLoadError (self ._timeout )
126
139
raise UnknownOverpassError (
127
140
"The request returned status code {code}" .format (
128
- code = self ._status
129
- )
130
- )
141
+ code = self ._status ))
131
142
else :
132
143
r .encoding = 'utf-8'
133
144
return r .text
0 commit comments