├── conftest.py ├── .tool-versions ├── setup.cfg ├── MANIFEST.in ├── examples ├── .gitignore ├── readme_example.py ├── turn_restriction_relations_as_list.py ├── overpassify_example.py ├── unique_users_for_area.py ├── README.md └── plot_state_border │ └── main.py ├── assets └── overpass-demo.gif ├── tests ├── overpass_status │ ├── no_slots_waiting.txt │ ├── one_slot_running.txt │ ├── no_slots_waiting_six_lines.txt │ ├── one_slot_waiting.txt │ └── two_slots_waiting.txt ├── test_api.py ├── example_live.json ├── example_body.geojson ├── example_meta.geojson ├── example_body.json ├── example_meta.json └── example_singlenode.json ├── .gitignore ├── tox.ini ├── overpass ├── utils.py ├── __init__.py ├── errors.py ├── queries.py └── api.py ├── pyproject.toml ├── setup.py ├── README.rst ├── README.md ├── LICENSE.txt └── CHANGELOG.md /conftest.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.tool-versions: -------------------------------------------------------------------------------- 1 | python 3.11.9 2 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | description-file=README.md 3 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE.txt 2 | include tests/* 3 | include examples/* -------------------------------------------------------------------------------- /examples/.gitignore: -------------------------------------------------------------------------------- 1 | plot_state_border/* 2 | !plot_state_border/main.py 3 | -------------------------------------------------------------------------------- /assets/overpass-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mvexel/overpass-api-python-wrapper/HEAD/assets/overpass-demo.gif -------------------------------------------------------------------------------- /tests/overpass_status/no_slots_waiting.txt: -------------------------------------------------------------------------------- 1 | Connected as: 0123456789 2 | Current time: 2021-03-08T23:33:48Z 3 | Rate limit: 2 4 | 2 slots available now. 5 | Currently running queries (pid, space limit, time limit, start time): 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea/ 3 | .pytest_cache/ 4 | .vscode/ 5 | **/__pycache__/ 6 | *.py[cod] 7 | dist/ 8 | build/ 9 | eggs/ 10 | .eggs/ 11 | *.egg-info/ 12 | *.egg 13 | pip-log.txt 14 | docs/_build/ 15 | Pipfile.lock 16 | venv/ 17 | .tox 18 | -------------------------------------------------------------------------------- /tests/overpass_status/one_slot_running.txt: -------------------------------------------------------------------------------- 1 | Connected as: 0123456789 2 | Current time: 2021-03-08T20:22:55Z 3 | Rate limit: 2 4 | 1 slots available now. 5 | Currently running queries (pid, space limit, time limit, start time): 6 | 8030 536870912 180 2021-03-08T20:22:55Z 7 | -------------------------------------------------------------------------------- /tests/overpass_status/no_slots_waiting_six_lines.txt: -------------------------------------------------------------------------------- 1 | Connected as: 0123456789 2 | Current time: 2022-06-15T22:13:27Z 3 | Announced endpoint: lz4.overpass-api.de/api/ 4 | Rate limit: 2 5 | 2 slots available now. 6 | Currently running queries (pid, space limit, time limit, start time): 7 | -------------------------------------------------------------------------------- /tests/overpass_status/one_slot_waiting.txt: -------------------------------------------------------------------------------- 1 | Connected as: 0123456789 2 | Current time: 2021-03-08T20:23:25Z 3 | Rate limit: 2 4 | 1 slots available now. 5 | Slot available after: 2021-03-08T20:23:28Z, in 3 seconds. 6 | Currently running queries (pid, space limit, time limit, start time): 7 | -------------------------------------------------------------------------------- /tests/overpass_status/two_slots_waiting.txt: -------------------------------------------------------------------------------- 1 | Connected as: 0123456789 2 | Current time: 2021-03-08T20:26:49Z 3 | Rate limit: 2 4 | Slot available after: 2021-03-08T20:27:00Z, in 11 seconds. 5 | Slot available after: 2021-03-08T20:30:28Z, in 219 seconds. 6 | Currently running queries (pid, space limit, time limit, start time): 7 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | envlist = py{39,310,311} 3 | skip_missing_interpreters = true 4 | 5 | [testenv] 6 | allowlist_externals = poetry 7 | commands_pre = 8 | poetry install --no-root --sync 9 | commands = 10 | poetry run pytest tests/ --import-mode importlib 11 | 12 | [gh-actions] 13 | python = 14 | 3.9: py39 15 | 3.10: py310 16 | 3.11: py311 -------------------------------------------------------------------------------- /examples/readme_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # Copyright 2015-2018 Martijn van Exel. 4 | # This file is part of the overpass-api-python-wrapper project 5 | # which is licensed under Apache 2.0. 6 | # See LICENSE.txt for the full license text. 7 | 8 | import overpass 9 | 10 | api = overpass.API() 11 | response = api.get('node["name"="Salt Lake City"]') 12 | print( 13 | [(feature["id"], feature["properties"]["name"]) for feature in response["features"]] 14 | ) 15 | -------------------------------------------------------------------------------- /overpass/utils.py: -------------------------------------------------------------------------------- 1 | # Copyright 2015-2018 Martijn van Exel. 2 | # This file is part of the overpass-api-python-wrapper project 3 | # which is licensed under Apache 2.0. 4 | # See LICENSE.txt for the full license text. 5 | 6 | 7 | class Utils(object): 8 | 9 | @staticmethod 10 | def to_overpass_id(osmid, area=False): 11 | area_base = 2400000000 12 | relation_base = 3600000000 13 | if area: 14 | return int(osmid) + area_base 15 | return int(osmid) + relation_base 16 | -------------------------------------------------------------------------------- /overpass/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2015-2018 Martijn van Exel. 4 | # This file is part of the overpass-api-python-wrapper project 5 | # which is licensed under Apache 2.0. 6 | # See LICENSE.txt for the full license text. 7 | 8 | """Thin wrapper around the OpenStreetMap Overpass API.""" 9 | 10 | __title__ = "overpass" 11 | __version__ = "0.7" 12 | __license__ = "Apache 2.0" 13 | 14 | from .api import API 15 | from .queries import MapQuery, WayQuery 16 | from .errors import ( 17 | OverpassError, 18 | OverpassSyntaxError, 19 | TimeoutError, 20 | MultipleRequestsError, 21 | ServerLoadError, 22 | UnknownOverpassError, 23 | ) 24 | from .utils import * 25 | -------------------------------------------------------------------------------- /examples/turn_restriction_relations_as_list.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # Copyright 2015-2018 Martijn van Exel. 4 | # This file is part of the overpass-api-python-wrapper project 5 | # which is licensed under Apache 2.0. 6 | # See LICENSE.txt for the full license text. 7 | 8 | # Retrieves a list of turn restriction relations in Toronto. 9 | 10 | import overpass 11 | 12 | api = overpass.API() 13 | 14 | turn_restrictions_query = "relation[type=restriction](area:3600324211)" 15 | 16 | turn_restrictions_list = [] 17 | 18 | overpass_response = api.get( 19 | turn_restrictions_query, 20 | responseformat='csv(::"id",::"user",::"timestamp",restriction,"restriction:conditional")', 21 | verbosity="meta", 22 | ) 23 | 24 | print(overpass_response) 25 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "overpass" 3 | version = "0.7.2" 4 | description = "A Python interface to the OpenStreetMap Overpass API" 5 | authors = ["Martijn van Exel "] 6 | license = "Apache-2.0" 7 | readme = "README.md" 8 | homepage = "https://github.com/mvexel/overpass-api-python-wrapper" 9 | packages = [{ include = "overpass" }] 10 | 11 | 12 | [tool.poetry.dependencies] 13 | python = ">3.9, <3.12" 14 | osm2geojson = "^0.2.5" 15 | requests = "^2.32.3" 16 | 17 | [tool.poetry.group.dev.dependencies] 18 | pytest = "^7.4.0" 19 | geojson = "^3.1.0" 20 | requests-mock = { extras = ["fixtures"], version = "^1.12.1" } 21 | deepdiff = "^7.0.1" 22 | tox = "^4.17.1" 23 | 24 | [build-system] 25 | requires = ["poetry-core>=1.0.0"] 26 | build-backend = "poetry.core.masonry.api" 27 | -------------------------------------------------------------------------------- /examples/overpassify_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # Copyright 2015-2018 Martijn van Exel. 4 | # This file is part of the overpass-api-python-wrapper project 5 | # which is licensed under Apache 2.0. 6 | # See LICENSE.txt for the full license text. 7 | 8 | """An as yet not working example of using overpassify.""" 9 | 10 | import overpass 11 | from overpassify import overpassify 12 | 13 | api = overpass.API() 14 | 15 | 16 | @api.Get 17 | @overpassify 18 | def response(): 19 | Settings(timeout=1400) 20 | search = Area(3600134503) + Area(3600134502) 21 | ways = Way( 22 | search, 23 | maxspeed=None, 24 | highway=NotRegex("cycleway|footway|path|service"), 25 | access=NotRegex("private"), 26 | ) 27 | out(ways, body=True, geom=True, qt=True) 28 | noop() 29 | 30 | 31 | print(response) 32 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup( 4 | name="overpass", 5 | packages=["overpass"], 6 | version="0.7", 7 | description="Python wrapper for the OpenStreetMap Overpass API", 8 | long_description="See README.md", 9 | author="Martijn van Exel", 10 | author_email="m@rtijn.org", 11 | url="https://github.com/mvexel/overpass-api-python-wrapper", 12 | license="Apache", 13 | keywords=["openstreetmap", "overpass", "wrapper"], 14 | classifiers=[ 15 | "License :: OSI Approved :: Apache Software License", 16 | "Programming Language :: Python :: 3.8", 17 | "Programming Language :: Python :: 3.9", 18 | "Programming Language :: Python :: 3.10", 19 | "Programming Language :: Python :: 3.11", 20 | "Topic :: Scientific/Engineering :: GIS", 21 | "Topic :: Utilities", 22 | ], 23 | install_requires=["requests>=2.3.0", "osm2geojson"], 24 | extras_require={"test": ["pytest", "requests-mock[fixture]", "geojson>=1.0.9"]}, 25 | ) 26 | -------------------------------------------------------------------------------- /examples/unique_users_for_area.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # Copyright 2015-2018 Martijn van Exel. 4 | # This file is part of the overpass-api-python-wrapper project 5 | # which is licensed under Apache 2.0. 6 | # See LICENSE.txt for the full license text. 7 | 8 | # Retrieves a list of unique usernames and user IDs for a named area. 9 | 10 | import overpass 11 | 12 | # Change this to the name of the area you're interested in. 13 | # Keep it small to not abuse the Overpass server. 14 | area_name = "Kanab" 15 | 16 | query = """area[name="{}"]->.a;(node(area.a);<;);""".format(area_name) 17 | users = {"ids": [], "usernames": []} 18 | message_urls = [] 19 | api = overpass.API(debug=False) 20 | result = api.Get(query, responseformat="csv(::uid,::user)", verbosity="meta") 21 | del result[0] # header 22 | for row in result: 23 | uid = int(row[0]) 24 | username = row[1] 25 | if uid in users["ids"]: 26 | continue 27 | users["ids"].append(uid) 28 | users["usernames"].append(username) 29 | message_urls.append("https://www.openstreetmap.org/message/new/{}".format(username)) 30 | print(users) 31 | print(message_urls) 32 | -------------------------------------------------------------------------------- /examples/README.md: -------------------------------------------------------------------------------- 1 | # Examples 2 | 3 | Please contribute your examples, submit a pull request! 4 | 5 | ## Turn restrictions as a list 6 | 7 | File: `turn_restriction_relations_as_list.py` 8 | 9 | This example requests a CSV response from an Overpass query for turn restrictions within the Toronto city limits. 10 | 11 | The result is then converted to a Python list and printed to stdout. 12 | 13 | Sample output: 14 | 15 | ```python 16 | ['6809605', 'hoream_telenav', '2016-12-21T15:05:42Z', '', 'no_left_turn'], 17 | ... 18 | ``` 19 | 20 | ## Plot state border 21 | 22 | File: `plot_state_border/main.py` 23 | 24 | This example requests the boundary of a state of Germany called Saxony. The overpass response contains points that will be connected with each other to draw the outer border of the state. The lines are drawn using `matplotlib`. 25 | Since the response is quite big (~2 MB) the response will be saved in a XML file. 26 | 27 | Overpass query: 28 | ```osm 29 | area[name="Sachsen"][type="boundary"]->.saxony; 30 | rel(area.saxony)[admin_level=4][type="boundary"][boundary="administrative"]; 31 | out geom; 32 | ``` 33 | 34 | Output: 35 | ![Border of Saxony (Germany)](plot_state_border/output.png) 36 | 37 | -------------------------------------------------------------------------------- /overpass/errors.py: -------------------------------------------------------------------------------- 1 | # Copyright 2015-2018 Martijn van Exel. 2 | # This file is part of the overpass-api-python-wrapper project 3 | # which is licensed under Apache 2.0. 4 | # See LICENSE.txt for the full license text. 5 | 6 | 7 | class OverpassError(Exception): 8 | """An error during your request occurred. 9 | Super class for all Overpass api errors.""" 10 | pass 11 | 12 | 13 | class OverpassSyntaxError(OverpassError, ValueError): 14 | """The request contains a syntax error.""" 15 | 16 | def __init__(self, request): 17 | self.request = request 18 | 19 | 20 | class TimeoutError(OverpassError): 21 | """A request timeout occurred.""" 22 | 23 | def __init__(self, timeout): 24 | self.timeout = timeout 25 | 26 | 27 | class MultipleRequestsError(OverpassError): 28 | """You are trying to run multiple requests at the same time.""" 29 | pass 30 | 31 | 32 | class ServerLoadError(OverpassError): 33 | """The Overpass server is currently under load and declined the request. 34 | Try again later or retry with reduced timeout value.""" 35 | 36 | def __init__(self, timeout): 37 | self.timeout = timeout 38 | 39 | 40 | class UnknownOverpassError(OverpassError): 41 | """An unknown kind of error happened during the request.""" 42 | 43 | def __init__(self, message): 44 | self.message = message 45 | 46 | 47 | class ServerRuntimeError(OverpassError): 48 | """The Overpass server returned a runtime error""" 49 | 50 | def __init__(self, message): 51 | self.message = message 52 | -------------------------------------------------------------------------------- /overpass/queries.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2015-2018 Martijn van Exel. 4 | # This file is part of the overpass-api-python-wrapper project 5 | # which is licensed under Apache 2.0. 6 | # See LICENSE.txt for the full license text. 7 | 8 | 9 | class MapQuery(object): 10 | """Query to retrieve complete ways and relations in an area.""" 11 | 12 | _QUERY_TEMPLATE = "(node({south},{west},{north},{east});<;>;);" 13 | 14 | def __init__(self, south, west, north, east): 15 | """ 16 | Initialize query with given bounding box. 17 | 18 | :param bbox Bounding box with limit values in format west, south, 19 | east, north. 20 | """ 21 | self.west = west 22 | self.south = south 23 | self.east = east 24 | self.north = north 25 | 26 | def __str__(self): 27 | return self._QUERY_TEMPLATE.format( 28 | west=self.west, south=self.south, east=self.east, north=self.north 29 | ) 30 | 31 | 32 | class WayQuery(object): 33 | """Query to retrieve a set of ways and their dependent nodes satisfying the input parameters.""" 34 | 35 | _QUERY_TEMPLATE = "(way{query_parameters});(._;>;);" 36 | 37 | def __init__(self, query_parameters): 38 | """Initialize a query for a set of ways satisfying the given parameters. 39 | 40 | :param query_parameters Overpass QL query parameters 41 | """ 42 | self.query_parameters = query_parameters 43 | 44 | def __str__(self): 45 | return self._QUERY_TEMPLATE.format(query_parameters=self.query_parameters) 46 | -------------------------------------------------------------------------------- /examples/plot_state_border/main.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # Author: Florian Winkler (Fju) 2018 4 | # This file is part of the overpass-api-python-wrapper project 5 | # which is licensed under Apache 2.0. 6 | # See LICENSE.txt for the full license text. 7 | 8 | import os 9 | import xml.etree.ElementTree 10 | import matplotlib.pyplot as plt 11 | import numpy as np 12 | import overpass 13 | 14 | MAX_SIZE = 400 15 | XML_FILE = 'state_border_saxony.xml' 16 | QUERY = """area[name="Sachsen"][type="boundary"]->.saxony; 17 | rel(area.saxony)[admin_level=4][type="boundary"][boundary="administrative"]; 18 | out geom;""" 19 | 20 | # the query is can be quite big (multiple MB) so we save the servers response in a file 21 | # that can be re-opened the next time 22 | if not(os.path.isfile(XML_FILE)): 23 | # increase timeout because the response can be pretty heavy 24 | api = overpass.API(timeout=60) 25 | 26 | response = api.get(QUERY, responseformat="xml") 27 | 28 | # write xml file 29 | f = open(XML_FILE, 'w') 30 | # encode response in UTF-8 because name translation contain non-ascii characters 31 | f.write(response.encode('utf-8')) 32 | f.close() 33 | 34 | # free up memory 35 | #del response 36 | 37 | # open xml file 38 | root = xml.etree.ElementTree.parse(XML_FILE).getroot() 39 | 40 | # bounds element contains information of the width and height 41 | bounds = root.find('relation').find('bounds') 42 | min_lat = float(bounds.get('minlat')) 43 | min_lon = float(bounds.get('minlon')) 44 | max_lat = float(bounds.get('maxlat')) 45 | max_lon = float(bounds.get('maxlon')) 46 | 47 | # longitude: east - west (x) 48 | # latitude: north - south (y) 49 | box_width = max_lon - min_lon 50 | box_height = max_lat - min_lat 51 | 52 | # compute scale factors so that the biggest distance is equal to `MAX_SIZE` 53 | scale_x = int(MAX_SIZE * box_width / max(box_width, box_height)) 54 | scale_y = int(MAX_SIZE * box_height / max(box_width, box_height)) 55 | 56 | def outside(x1, y1, x2, y2, tolerance): 57 | # check if distance between two points is bigger than the given tolerance 58 | # since tolerance is a constant it doesn't have to be squared 59 | dx = x1 - x2 60 | dy = y1 - y2 61 | return (dx*dx + dy*dy) > tolerance 62 | 63 | 64 | point_count = 0 65 | # look through all `member` nodes 66 | for member in root.iter('member'): 67 | m_type, m_role = member.get('type'), member.get('role') 68 | 69 | # check if the element belongs to the outer border 70 | if m_type == 'way' and m_role == 'outer': 71 | # `nd` elements contain lon and lat coordinates 72 | m_points = member.findall('nd') 73 | 74 | prev_x, prev_y = -1, -1 75 | 76 | index = 0 77 | for mp in m_points: 78 | x, y = float(mp.get('lon')), float(mp.get('lat')) 79 | 80 | # convert lon and lat coordinates to pixel coordinates 81 | x = (x - min_lon) / box_width * scale_x 82 | y = (y - min_lat) / box_height * scale_y 83 | 84 | if index == 0: 85 | # first point 86 | prev_x = x 87 | prev_y = y 88 | elif outside(x, y, prev_x, prev_y, 1) or index == len(m_points) - 1: 89 | # check if points are not too close to each other (too much detail) or if it's the last point of the section 90 | # if the last point was ignored, there would be holes 91 | 92 | # draw line from current point to previous point 93 | plt.plot([x, prev_x], [y, prev_y], 'k-') 94 | point_count += 1 95 | # save coordinates 96 | prev_x = x 97 | prev_y = y 98 | 99 | index += 1 100 | 101 | print(point_count) 102 | # show plot 103 | plt.show() 104 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | Overpass API python wrapper 2 | =========================== 3 | 4 | .. image:: https://github.com/mvexel/overpass-api-python-wrapper/workflows/CI/badge.svg 5 | :target: https://github.com/mvexel/overpass-api-python-wrapper/actions?query=workflow%3ACI 6 | 7 | 8 | This is a thin wrapper around the OpenStreetMap `Overpass 9 | API `__. 10 | 11 | 12 | |Build Status| 13 | 14 | Install it 15 | ========== 16 | 17 | ``pip install overpass`` 18 | 19 | Usage 20 | ----- 21 | 22 | Simplest example: 23 | 24 | .. code:: python 25 | 26 | import overpass 27 | api = overpass.API() 28 | response = api.get('node["name"="Salt Lake City"]') 29 | 30 | ``response`` will be a dictionary representing the JSON output you would 31 | get `from the Overpass API 32 | directly `__. 33 | 34 | Note that the Overpass query passed to ``get()`` should not contain any 35 | ``out`` or other meta statements. 36 | 37 | Another example: 38 | 39 | .. code:: python 40 | 41 | >>> print [( 42 | ... feature['properties']['name'], 43 | ... feature['id']) for feature in response["features"]] 44 | [(u'Salt Lake City', 150935219), (u'Salt Lake City', 585370637)] 45 | 46 | You can find more examples in the ``examples/`` directory of this 47 | repository. 48 | 49 | Response formats 50 | ~~~~~~~~~~~~~~~~ 51 | 52 | You can set the response type of your query using ``get()``\ ’s 53 | ``responseformat`` parameter to GeoJSON (``geojson``, the default), 54 | plain JSON (``json``), CSV (``csv``), and OSM XML (``xml``). 55 | 56 | .. code:: python 57 | 58 | response = api.get('node["name"="Salt Lake City"]', responseformat="xml") 59 | 60 | Parameters 61 | ~~~~~~~~~~ 62 | 63 | The API object takes a few parameters: 64 | 65 | ``endpoint`` 66 | ^^^^^^^^^^^^ 67 | 68 | The default endpoint is ``https://overpass-api.de/api/interpreter`` but 69 | you can pass in another instance: 70 | 71 | .. code:: python 72 | 73 | api = overpass.API(endpoint=https://overpass.myserver/interpreter) 74 | 75 | ``timeout`` 76 | ^^^^^^^^^^^ 77 | 78 | The default timeout is 25 seconds, but you can set it to whatever you 79 | want. 80 | 81 | .. code:: python 82 | 83 | api = overpass.API(timeout=600) 84 | 85 | ``debug`` 86 | ^^^^^^^^^ 87 | 88 | Setting this to ``True`` will get you debug output. 89 | 90 | Simple queries 91 | ~~~~~~~~~~~~~~ 92 | 93 | In addition to just sending your query and parse the result, the wrapper 94 | provides shortcuts for often used map queries. To use them, just pass 95 | them like to normal query to the API. 96 | 97 | MapQuery 98 | ^^^^^^^^ 99 | 100 | This is a shorthand for a `complete ways and 101 | relations `__ 102 | query in a bounding box (the ‘map call’). You just pass the bounding box 103 | to the constructor: 104 | 105 | .. code:: python 106 | 107 | MapQuery = overpass.MapQuery(50.746,7.154,50.748,7.157) 108 | response = api.get(MapQuery) 109 | 110 | WayQuery 111 | ^^^^^^^^ 112 | 113 | This is shorthand for getting a set of ways and their child nodes that 114 | satisfy certain criteria. Pass the criteria as a Overpass QL stub to the 115 | constructor: 116 | 117 | .. code:: python 118 | 119 | WayQuery = overpass.WayQuery('[name="Highway 51"]') 120 | response = api.get(WayQuery) 121 | 122 | Testing 123 | ------- 124 | 125 | Using ``pytest``. 126 | 127 | ``py.test`` 128 | 129 | FAQ 130 | --- 131 | 132 | I need help or have an idea for a feature 133 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 134 | 135 | Create a `new 136 | issue `__. 137 | 138 | Where did the CLI tool go? 139 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 140 | 141 | The command line tool was deprecated in version 0.4.0. 142 | 143 | .. |Build Status| image:: https://travis-ci.org/mvexel/overpass-api-python-wrapper.svg?branch=master 144 | :target: https://travis-ci.org/mvexel/overpass-api-python-wrapper 145 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Overpass API python wrapper 2 | =========================== 3 | 4 | [Overpass 5 | API](http://wiki.openstreetmap.org/wiki/Overpass_API) for Python. 6 | 7 | ![shell recording](assets/overpass-demo.gif) 8 | 9 | Install it 10 | ========== 11 | 12 | `pip install overpass` 13 | 14 | ## Usage 15 | 16 | ### `API()` constructor 17 | 18 | First, create an API object. 19 | 20 | ```python 21 | import overpass 22 | api = overpass.API() 23 | ``` 24 | 25 | The API constructor takes several parameters, all optional: 26 | 27 | #### `endpoint` 28 | 29 | The default endpoint is `https://overpass-api.de/api/interpreter` but 30 | you can pass in another instance: 31 | 32 | ```python 33 | api = overpass.API(endpoint="https://overpass.myserver/interpreter") 34 | ``` 35 | 36 | #### `timeout` 37 | 38 | The default timeout is 25 seconds, but you can set it to whatever you 39 | want. 40 | 41 | ```python 42 | api = overpass.API(timeout=600) 43 | ``` 44 | 45 | #### `debug` 46 | 47 | Setting this to `True` will get you debug output. 48 | 49 | ### Getting data from Overpass: `get()` 50 | 51 | Most users will only ever need to use the `get()` method. There are some convenience query methods for common queries as well, see below. 52 | 53 | ```python 54 | response = api.get('node["name"="Salt Lake City"]') 55 | ``` 56 | 57 | `response` will be a dictionary representing the 58 | JSON output you would get [from the Overpass API 59 | directly](https://overpass-api.de/output_formats.html#json). 60 | 61 | **Note that the Overpass query passed to `get()` should not contain any `out` or other meta statements.** See `verbosity` below for how to control the output. 62 | 63 | Another example: 64 | 65 | ```python 66 | >>> print [( 67 | ... feature['properties']['name'], 68 | ... feature['id']) for feature in response["features"]] 69 | [(u'Salt Lake City', 150935219), (u'Salt Lake City', 585370637)] 70 | ``` 71 | 72 | You can find more examples in the `examples/` directory of this repository. 73 | 74 | The `get()` method takes a few parameters, all optional having sensible defaults. 75 | 76 | #### `verbosity` 77 | 78 | You can set the verbosity of the [Overpass query `out` directive](https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#out) using the same keywords Overpass does. In order of increased verbosity: `ids`, `skel`, `body`, `tags`, `meta`. As is the case with the Overpass API itself, `body` is the default. 79 | 80 | ```python 81 | >>> import overpass 82 | >>> api = overpass.API() 83 | >>> data = api.get('way(42.819,-73.881,42.820,-73.880);(._;>;)', verbosity='geom') 84 | >>> [f for f in data.features if f.geometry['type'] == "LineString"] 85 | ``` 86 | 87 | (from [a question on GIS Stackexchange](https://gis.stackexchange.com/questions/294152/getting-all-information-about-ways-from-python-overpass-library/294358#294358)) 88 | 89 | #### `responseformat` 90 | 91 | You can set the response type of your query using `get()`'s `responseformat` parameter to GeoJSON (`geojson`, the default), plain JSON (`json`), CSV (`csv`), and OSM XML (`xml`). 92 | 93 | ```python 94 | response = api.get('node["name"="Salt Lake City"]', responseformat="xml") 95 | ``` 96 | 97 | If you choose `csv`, you will need to specify which fields you want, as described [here](https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#CSV_output_mode) in the Overpass QL documentation. An example: 98 | 99 | ```python 100 | response = api.get('node["name"="Springfield"]["place"]', responseformat="csv(name,::lon,::lat)") 101 | ``` 102 | 103 | The response will be a list of lists: 104 | 105 | ```python 106 | [ 107 | ['name', '@lon', '@lat'], 108 | ['Springfield', '-3.0645656', '56.2952787'], 109 | ['Springfield', '0.4937446', '51.7487585'], 110 | ['Springfield', '-2.4194716', '53.5732892'], 111 | ['Springfield', '25.5454526', '-33.9814866'], 112 | .... 113 | ] 114 | ``` 115 | 116 | #### `build` 117 | 118 | We will construct a valid Overpass QL query from the parameters you set by default. This means you don't have to include 'meta' statements like `[out:json]`, `[timeout:60]`, `[out body]`, etcetera. You just supply the meat of the query, the part that actually tells Overpass what to query for. If for whatever reason you want to override this and supply a full, valid Overpass QL query, you can set `build` to `False` to make the API not do any pre-processing. 119 | 120 | #### `date` 121 | 122 | You can query the data as it was on a given date. You can give either a standard ISO date alone (YYYY-MM-DD) or a full overpass date and time (YYYY-MM-DDTHH:MM:SSZ, i.e. 2020-04-28T00:00:00Z). 123 | You can also directly pass a `date` or `datetime` object from the `datetime` library. 124 | 125 | ### Pre-cooked Queries: `MapQuery`, `WayQuery` 126 | 127 | In addition to just sending your query and parse the result, `overpass` 128 | provides shortcuts for often used map queries. To use them, just pass 129 | them like to normal query to the API. 130 | 131 | #### MapQuery 132 | 133 | This is a shorthand for a [complete ways and 134 | relations](https://wiki.openstreetmap.org/wiki/Overpass_API/Language_Guide#Recursing_up_and_down:_Completed_ways_and_relations) 135 | query in a bounding box (the 'map call'). You just pass the bounding box 136 | to the constructor: 137 | 138 | ```python 139 | MapQuery = overpass.MapQuery(50.746,7.154,50.748,7.157) 140 | response = api.get(MapQuery) 141 | ``` 142 | 143 | #### WayQuery 144 | 145 | This is shorthand for getting a set of ways and their child nodes that 146 | satisfy certain criteria. Pass the criteria as a Overpass QL stub to the 147 | constructor: 148 | 149 | ```python 150 | WayQuery = overpass.WayQuery('[name="Highway 51"]') 151 | response = api.get(WayQuery) 152 | ``` 153 | 154 | ## Testing 155 | 156 | Using `pytest`. 157 | 158 | `py.test` 159 | 160 | ## FAQ 161 | 162 | ### I need help or have an idea for a feature 163 | 164 | Create a [new 165 | issue](https://github.com/mvexel/overpass-api-python-wrapper/issues). 166 | 167 | ### Where did the CLI tool go? 168 | 169 | The command line tool was deprecated in version 0.4.0. 170 | 171 | ## See also 172 | 173 | There are other python modules that do similar things. 174 | 175 | * https://github.com/mocnik-science/osm-python-tools 176 | * https://github.com/DinoTools/python-overpy 177 | -------------------------------------------------------------------------------- /tests/test_api.py: -------------------------------------------------------------------------------- 1 | # Copyright 2015-2018 Martijn van Exel. 2 | # This file is part of the overpass-api-python-wrapper project 3 | # which is licensed under Apache 2.0. 4 | # See LICENSE.txt for the full license text. 5 | 6 | import json 7 | import os 8 | from datetime import datetime, timezone 9 | from pathlib import Path 10 | from typing import Tuple, Union 11 | 12 | import geojson 13 | import pytest 14 | from deepdiff import DeepDiff 15 | 16 | import overpass 17 | 18 | USE_LIVE_API = bool(os.getenv("USE_LIVE_API", "false")) 19 | 20 | 21 | def test_initialize_api(): 22 | api = overpass.API() 23 | assert isinstance(api, overpass.API) 24 | assert api.debug is False 25 | 26 | 27 | @pytest.mark.parametrize( 28 | "query,length,response", 29 | [ 30 | ( 31 | overpass.MapQuery(37.86517, -122.31851, 37.86687, -122.31635), 32 | 1, 33 | Path("tests/example_mapquery.json"), 34 | ), 35 | ( 36 | "node(area:3602758138)[amenity=cafe]", 37 | 1, 38 | Path("tests/example_singlenode.json"), 39 | ), 40 | ], 41 | ) 42 | def test_geojson( 43 | query: Union[overpass.MapQuery, str], length: int, response: Path, requests_mock 44 | ): 45 | api = overpass.API(debug=True) 46 | 47 | with response.open() as fp: 48 | mock_response = json.load(fp) 49 | requests_mock.post("//overpass-api.de/api/interpreter", json=mock_response) 50 | 51 | osm_geo = api.get(query) 52 | assert len(osm_geo["features"]) > length 53 | 54 | 55 | def test_multipolygon(): 56 | """ 57 | Test that multipolygons are processed without error 58 | """ 59 | api = overpass.API() 60 | api.get("rel(11038555)", verbosity="body geom") 61 | 62 | 63 | @pytest.mark.parametrize( 64 | "verbosity,response,output", 65 | [ 66 | ("body geom", "tests/example_body.json", "tests/example_body.geojson"), 67 | # ("tags geom", "tests/example.json", "tests/example.geojson"), 68 | ("meta geom", "tests/example_meta.json", "tests/example_meta.geojson"), 69 | ], 70 | ) 71 | def test_geojson_extended(verbosity, response, output, requests_mock): 72 | api = overpass.API(debug=True) 73 | 74 | with Path(response).open() as fp: 75 | mock_response = json.load(fp) 76 | requests_mock.post("//overpass-api.de/api/interpreter", json=mock_response) 77 | 78 | osm_geo = sorted( 79 | api.get( 80 | f"rel(6518385);out {verbosity};way(10322303);out {verbosity};node(4927326183);", 81 | verbosity=verbosity, 82 | ) 83 | ) 84 | 85 | with Path(output).open() as fp: 86 | ref_geo = sorted(geojson.load(fp)) 87 | assert osm_geo == ref_geo 88 | 89 | 90 | # You can also comment the pytest decorator to run the test against the live API 91 | @pytest.mark.skipif( 92 | not USE_LIVE_API, reason="USE_LIVE_API environment variable not set to True" 93 | ) 94 | def test_geojson_live(): 95 | """ 96 | This code should only be executed once when major changes to the Overpass API and/or to this 97 | wrapper are introduced. One than has to manually verify that the date in the example.geojson 98 | file from the Overpass API matches the data in the example.geojson file generated by this 99 | wrapper. 100 | 101 | The reason for this approach is the following: It is not safe to make calls to the actual API in 102 | this test as the API might momentarily be unavailable and the underlying data can also change 103 | at any moment. 104 | """ 105 | api = overpass.API(debug=True) 106 | osm_geo = api.get( 107 | "rel(6518385);out body geom;way(10322303);out body geom;node(4927326183);", 108 | verbosity="body geom", 109 | ) 110 | 111 | with Path("tests/example_live.json").open("r") as fp: 112 | ref_geo = json.load(fp) 113 | 114 | # assert that the dictionaries are the same 115 | # diff = DeepDiff(osm_geo, ref_geo, include_paths="[root]['features']") 116 | diff = DeepDiff(osm_geo, ref_geo, include_paths="[root]['features']") 117 | print(diff if diff else "No differences found") 118 | 119 | assert not diff 120 | 121 | 122 | @pytest.mark.parametrize( 123 | "response,slots_available,slots_running,slots_waiting", 124 | [ 125 | (Path("tests/overpass_status/no_slots_waiting_six_lines.txt"), 2, (), ()), 126 | (Path("tests/overpass_status/no_slots_waiting.txt"), 2, (), ()), 127 | ( 128 | Path("tests/overpass_status/one_slot_running.txt"), 129 | 1, 130 | ( 131 | datetime( 132 | year=2021, 133 | month=3, 134 | day=8, 135 | hour=20, 136 | minute=22, 137 | second=55, 138 | tzinfo=timezone.utc, 139 | ), 140 | ), 141 | (), 142 | ), 143 | ( 144 | Path("tests/overpass_status/one_slot_waiting.txt"), 145 | 1, 146 | (), 147 | ( 148 | datetime( 149 | year=2021, 150 | month=3, 151 | day=8, 152 | hour=20, 153 | minute=23, 154 | second=28, 155 | tzinfo=timezone.utc, 156 | ), 157 | ), 158 | ), 159 | ( 160 | Path("tests/overpass_status/two_slots_waiting.txt"), 161 | 0, 162 | (), 163 | ( 164 | datetime( 165 | year=2021, 166 | month=3, 167 | day=8, 168 | hour=20, 169 | minute=27, 170 | second=00, 171 | tzinfo=timezone.utc, 172 | ), 173 | datetime( 174 | year=2021, 175 | month=3, 176 | day=8, 177 | hour=20, 178 | minute=30, 179 | second=28, 180 | tzinfo=timezone.utc, 181 | ), 182 | ), 183 | ), 184 | ], 185 | ) 186 | def test_api_status( 187 | response: Path, 188 | slots_available: int, 189 | slots_running: Tuple[datetime], 190 | slots_waiting: Tuple[datetime], 191 | requests_mock, 192 | ): 193 | mock_response = response.read_text() 194 | requests_mock.get("https://overpass-api.de/api/status", text=mock_response) 195 | 196 | api = overpass.API(debug=True) 197 | 198 | requests_mock.post("https://overpass-api.de/api/interpreter", json={"elements": []}) 199 | map_query = overpass.MapQuery(37.86517, -122.31851, 37.86687, -122.31635) 200 | api.get(map_query) 201 | 202 | assert 0 <= api.slots_available <= 2 203 | assert api.slots_available == slots_available 204 | 205 | assert isinstance(api.slots_running, tuple) 206 | assert api.slots_running == slots_running 207 | 208 | assert isinstance(api.slots_waiting, tuple) 209 | assert api.slots_waiting == slots_waiting 210 | 211 | assert isinstance(api.slot_available_countdown, int) 212 | assert api.slot_available_countdown >= 0 213 | 214 | assert api.slot_available_datetime is None or isinstance( 215 | api.slot_available_datetime, datetime 216 | ) 217 | -------------------------------------------------------------------------------- /overpass/api.py: -------------------------------------------------------------------------------- 1 | # Copyright 2015-2018 Martijn van Exel. 2 | # This file is part of the overpass-api-python-wrapper project 3 | # which is licensed under Apache 2.0. 4 | # See LICENSE.txt for the full license text. 5 | 6 | import csv 7 | import json 8 | import logging 9 | import re 10 | from datetime import datetime, timezone 11 | from io import StringIO 12 | from math import ceil 13 | from typing import Optional 14 | 15 | import requests 16 | from osm2geojson import json2geojson 17 | 18 | from .errors import ( 19 | MultipleRequestsError, 20 | OverpassSyntaxError, 21 | ServerLoadError, 22 | ServerRuntimeError, 23 | TimeoutError, 24 | UnknownOverpassError, 25 | ) 26 | 27 | 28 | class API(object): 29 | """A simple Python wrapper for the OpenStreetMap Overpass API. 30 | 31 | :param timeout: If a single number, the TCP connection timeout for the request. If a tuple 32 | of two numbers, the connection timeout and the read timeout respectively. 33 | Timeouts can be integers or floats. 34 | :param endpoint: URL of overpass interpreter 35 | :param headers: HTTP headers to include when making requests to the overpass endpoint 36 | :param debug: Boolean to turn on debugging output 37 | :param proxies: Dictionary of proxies to pass to the request library. See 38 | requests documentation for details. 39 | """ 40 | 41 | SUPPORTED_FORMATS = ["geojson", "json", "xml", "csv"] 42 | 43 | # defaults for the API class 44 | _timeout = 25 # second 45 | _endpoint = "https://overpass-api.de/api/interpreter" 46 | _headers = {"Accept-Charset": "utf-8;q=0.7,*;q=0.7"} 47 | _debug = False 48 | _proxies = None 49 | 50 | _QUERY_TEMPLATE = "[out:{out}]{date};{query}out {verbosity};" 51 | _GEOJSON_QUERY_TEMPLATE = "[out:json]{date};{query}out {verbosity};" 52 | 53 | def __init__(self, *args, **kwargs): 54 | self.endpoint = kwargs.get("endpoint", self._endpoint) 55 | self.headers = kwargs.get("headers", self._headers) 56 | self.timeout = kwargs.get("timeout", self._timeout) 57 | self.debug = kwargs.get("debug", self._debug) 58 | self.proxies = kwargs.get("proxies", self._proxies) 59 | self._status = None 60 | 61 | if self.debug: 62 | import http.client as http_client 63 | http_client.HTTPConnection.debuglevel = 1 64 | 65 | # You must initialize logging, 66 | # otherwise you'll not see debug output. 67 | logging.basicConfig() 68 | logging.getLogger().setLevel(logging.DEBUG) 69 | requests_log = logging.getLogger("requests.packages.urllib3") 70 | requests_log.setLevel(logging.DEBUG) 71 | requests_log.propagate = True 72 | 73 | def get(self, query, responseformat="geojson", verbosity="body", build=True, date=''): 74 | """Pass in an Overpass query in Overpass QL. 75 | 76 | :param query: the Overpass QL query to send to the endpoint 77 | :param responseformat: one of the supported output formats ["geojson", "json", "xml", "csv"] 78 | :param verbosity: one of the supported levels out data verbosity ["ids", 79 | "skel", "body", "tags", "meta"] and optionally modifiers ["geom", "bb", 80 | "center"] followed by an optional sorting indicator ["asc", "qt"]. Example: 81 | "body geom qt" 82 | :param build: boolean to indicate whether to build the overpass query from a template (True) 83 | or allow the programmer to specify full query manually (False) 84 | :param date: a date with an optional time. Example: 2020-04-27 or 2020-04-27T00:00:00Z 85 | """ 86 | if date and isinstance(date, str): 87 | # If date is given and is not already a datetime, attempt to parse from string 88 | try: 89 | date = datetime.fromisoformat(date) 90 | except ValueError: 91 | # The 'Z' in a standard overpass date will throw fromisoformat() off 92 | date = datetime.strptime(date, '%Y-%m-%dT%H:%M:%SZ') 93 | # Construct full Overpass query 94 | if build: 95 | full_query = self._construct_ql_query( 96 | query, responseformat=responseformat, verbosity=verbosity, date=date 97 | ) 98 | else: 99 | full_query = query 100 | if self.debug: 101 | logging.getLogger().info(query) 102 | 103 | # Get the response from Overpass 104 | r = self._get_from_overpass(full_query) 105 | content_type = r.headers.get("content-type") 106 | 107 | if self.debug: 108 | print(content_type) 109 | if content_type == "text/csv": 110 | return list(csv.reader(StringIO(r.text), delimiter="\t")) 111 | elif content_type in ("text/xml", "application/xml", "application/osm3s+xml"): 112 | return r.text 113 | else: 114 | response = json.loads(r.text) 115 | 116 | if not build: 117 | return response 118 | 119 | # Check for valid answer from Overpass. 120 | # A valid answer contains an 'elements' key at the root level. 121 | if "elements" not in response: 122 | raise UnknownOverpassError("Received an invalid answer from Overpass.") 123 | 124 | # If there is a 'remark' key, it spells trouble. 125 | overpass_remark = response.get("remark", None) 126 | if overpass_remark and overpass_remark.startswith("runtime error"): 127 | raise ServerRuntimeError(overpass_remark) 128 | 129 | if responseformat != "geojson": 130 | return response 131 | 132 | # construct geojson 133 | return json2geojson(response) 134 | 135 | @staticmethod 136 | def _api_status() -> dict: 137 | """ 138 | :returns: dict describing the client's status with the API 139 | """ 140 | endpoint = "https://overpass-api.de/api/status" 141 | 142 | r = requests.get(endpoint) 143 | lines = tuple(r.text.splitlines()) 144 | 145 | available_re = re.compile(r'\d(?= slots? available)') 146 | available_slots = int( 147 | next( 148 | ( 149 | m.group() 150 | for line in lines 151 | if (m := available_re.search(line)) 152 | ), 0 153 | ) 154 | ) 155 | 156 | waiting_re = re.compile(r'(?<=Slot available after: )[\d\-TZ:]{20}') 157 | waiting_slots = tuple( 158 | datetime.strptime(m.group(), "%Y-%m-%dT%H:%M:%S%z") 159 | for line in lines 160 | if (m := waiting_re.search(line)) 161 | ) 162 | 163 | current_idx = next( 164 | i for i, word in enumerate(lines) 165 | if word.startswith('Currently running queries') 166 | ) 167 | running_slots = tuple(tuple(line.split()) for line in lines[current_idx + 1:]) 168 | running_slots_datetimes = tuple( 169 | datetime.strptime( 170 | slot[3], "%Y-%m-%dT%H:%M:%S%z" 171 | ) 172 | for slot in running_slots 173 | ) 174 | 175 | return { 176 | "available_slots": available_slots, 177 | "waiting_slots": waiting_slots, 178 | "running_slots": running_slots_datetimes, 179 | } 180 | 181 | @property 182 | def slots_available(self) -> int: 183 | """ 184 | :returns: count of open slots the client has on the server 185 | """ 186 | return self._api_status()["available_slots"] 187 | 188 | @property 189 | def slots_waiting(self) -> tuple: 190 | """ 191 | :returns: tuple of datetimes representing waiting slots and when they will be available 192 | """ 193 | return self._api_status()["waiting_slots"] 194 | 195 | @property 196 | def slots_running(self) -> tuple: 197 | """ 198 | :returns: tuple of datetimes representing running slots and when they will be freed 199 | """ 200 | return self._api_status()["running_slots"] 201 | 202 | @property 203 | def slot_available_datetime(self) -> Optional[datetime]: 204 | """ 205 | :returns: None if a slot is available now (no wait needed) or a datetime representing when the next slot will become available 206 | """ 207 | if self.slots_available: 208 | return None 209 | return min(self.slots_running + self.slots_waiting) 210 | 211 | @property 212 | def slot_available_countdown(self) -> int: 213 | """ 214 | :returns: 0 if a slot is available now, or an int of seconds until the next slot is free 215 | """ 216 | try: 217 | return max( 218 | ceil( 219 | ( 220 | self.slot_available_datetime - 221 | datetime.now(timezone.utc) 222 | ).total_seconds() 223 | ), 224 | 0 225 | ) 226 | except TypeError: 227 | # Can't subtract from None, which means slot is available now 228 | return 0 229 | 230 | def search(self, feature_type, regex=False): 231 | """Search for something.""" 232 | raise NotImplementedError() 233 | 234 | # deprecation of upper case functions 235 | Get = get 236 | Search = search 237 | 238 | def _construct_ql_query(self, userquery, responseformat, verbosity, date): 239 | raw_query = str(userquery).rstrip() 240 | if not raw_query.endswith(";"): 241 | raw_query += ";" 242 | 243 | if date: 244 | date = f'[date:"{date:%Y-%m-%dT%H:%M:%SZ}"]' 245 | 246 | if responseformat == "geojson": 247 | template = self._GEOJSON_QUERY_TEMPLATE 248 | complete_query = template.format( 249 | query=raw_query, verbosity=verbosity, date=date) 250 | else: 251 | template = self._QUERY_TEMPLATE 252 | complete_query = template.format( 253 | query=raw_query, out=responseformat, verbosity=verbosity, date=date 254 | ) 255 | 256 | if self.debug: 257 | print(complete_query) 258 | return complete_query 259 | 260 | def _get_from_overpass(self, query): 261 | payload = {"data": query} 262 | 263 | try: 264 | r = requests.post( 265 | self.endpoint, 266 | data=payload, 267 | timeout=self.timeout, 268 | proxies=self.proxies, 269 | headers=self.headers, 270 | ) 271 | 272 | except requests.exceptions.Timeout: 273 | raise TimeoutError(self._timeout) 274 | 275 | self._status = r.status_code 276 | 277 | if self._status != 200: 278 | if self._status == 400: 279 | raise OverpassSyntaxError(query) 280 | elif self._status == 429: 281 | raise MultipleRequestsError() 282 | elif self._status == 504: 283 | raise ServerLoadError(self._timeout) 284 | raise UnknownOverpassError( 285 | "The request returned status code {code}".format(code=self._status) 286 | ) 287 | else: 288 | r.encoding = "utf-8" 289 | return r 290 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [Unreleased](https://github.com/mvexel/overpass-api-python-wrapper/compare/v0.7.2...HEAD) 9 | 10 | ## [v0.7.2](https://github.com/mvexel/overpass-api-python-wrapper/compare/0.7.1...v0.7.2) - 2024-08-10 11 | 12 | ### Commits 13 | 14 | - Can't just go ahead and change the license :) [`39f7150`](https://github.com/mvexel/overpass-api-python-wrapper/commit/39f71509a7b5640a55af01ac77ab437ac44796d1) 15 | - chore:add homepage to toml [`c62678e`](https://github.com/mvexel/overpass-api-python-wrapper/commit/c62678e7c89ec55b45cf98223ba0202492e3b91f) 16 | 17 | ## [0.7.1](https://github.com/mvexel/overpass-api-python-wrapper/compare/0.7.0...0.7.1) - 2024-08-10 18 | 19 | ### Merged 20 | 21 | - Make tests run again [`#167`](https://github.com/mvexel/overpass-api-python-wrapper/pull/167) 22 | - switch to poetry. tests are failing right now but we'll fix that next [`#166`](https://github.com/mvexel/overpass-api-python-wrapper/pull/166) 23 | - Few minor Python 3 code modernizations [`#160`](https://github.com/mvexel/overpass-api-python-wrapper/pull/160) 24 | - Add Python 3.11, drop below 3.8, update deps [`#159`](https://github.com/mvexel/overpass-api-python-wrapper/pull/159) 25 | - Update README.md [`#162`](https://github.com/mvexel/overpass-api-python-wrapper/pull/162) 26 | - Convenience properties for when API is next available [`#150`](https://github.com/mvexel/overpass-api-python-wrapper/pull/150) 27 | - Handle variable numbers of lines in Overpass status page [`#152`](https://github.com/mvexel/overpass-api-python-wrapper/pull/152) 28 | - documentation update to clarify CSV output [`#146`](https://github.com/mvexel/overpass-api-python-wrapper/pull/146) 29 | - Leveraging pytest features [`#141`](https://github.com/mvexel/overpass-api-python-wrapper/pull/141) 30 | - Include nodes, user, uid, timestamp, and version in GeoJSON properties [`#130`](https://github.com/mvexel/overpass-api-python-wrapper/pull/130) 31 | - Add tox and Github Actions [`#131`](https://github.com/mvexel/overpass-api-python-wrapper/pull/131) 32 | - Fix and modernize Travis CI [`#132`](https://github.com/mvexel/overpass-api-python-wrapper/pull/132) 33 | - List comprehension, literal comparison, import ordering, staticmethod [`#133`](https://github.com/mvexel/overpass-api-python-wrapper/pull/133) 34 | - Methods to check API status [`#134`](https://github.com/mvexel/overpass-api-python-wrapper/pull/134) 35 | - GeoJson MultiPolygon errors with duplicate IDs [`#129`](https://github.com/mvexel/overpass-api-python-wrapper/pull/129) 36 | - Add date parameter to query builder [`#125`](https://github.com/mvexel/overpass-api-python-wrapper/pull/125) 37 | - Drop python v2.7 and v3.3 from tests, add v3.7–3.8 [`#128`](https://github.com/mvexel/overpass-api-python-wrapper/pull/128) 38 | - Relation and multipolygon support [`#115`](https://github.com/mvexel/overpass-api-python-wrapper/pull/115) 39 | 40 | ### Commits 41 | 42 | - Use mock response for basic geojson test [`b83016d`](https://github.com/mvexel/overpass-api-python-wrapper/commit/b83016dc169da8d6191da38305e603d3044a2767) 43 | - merge main into #140 [`ca2d57e`](https://github.com/mvexel/overpass-api-python-wrapper/commit/ca2d57edec65ebcdc3a38e113ea1c8c710ea9667) 44 | - Parameterized geojson_extended test [`2c7926b`](https://github.com/mvexel/overpass-api-python-wrapper/commit/2c7926ba9130d2ab088c6e165a6e0f1f450cc22a) 45 | 46 | ## [0.7.0](https://github.com/mvexel/overpass-api-python-wrapper/compare/0.6.1...0.7.0) - 2019-12-10 47 | 48 | ### Merged 49 | 50 | - Relation and multipolygon support [`#115`](https://github.com/mvexel/overpass-api-python-wrapper/pull/115) 51 | - Added some docstrings to API and get() method [`#113`](https://github.com/mvexel/overpass-api-python-wrapper/pull/113) 52 | - Fix typo in README.md [`#114`](https://github.com/mvexel/overpass-api-python-wrapper/pull/114) 53 | - Added ability to set headers of request [`#110`](https://github.com/mvexel/overpass-api-python-wrapper/pull/110) 54 | - New example `plot_state_border` [`#107`](https://github.com/mvexel/overpass-api-python-wrapper/pull/107) 55 | 56 | ### Commits 57 | 58 | - Bugfixed and cleaned up _as_geojson method [`5fabd38`](https://github.com/mvexel/overpass-api-python-wrapper/commit/5fabd38b65ceeb06e2aa9b8310c8639e1aff9077) 59 | - added support for multipolygons [`51c4ae9`](https://github.com/mvexel/overpass-api-python-wrapper/commit/51c4ae9ecd42e1bc377b802651ad84c2db058964) 60 | - added support for relations [`4a61d9f`](https://github.com/mvexel/overpass-api-python-wrapper/commit/4a61d9f3c4b9254db63f6daad81275763474f1b1) 61 | 62 | ## [0.6.1](https://github.com/mvexel/overpass-api-python-wrapper/compare/0.6.0...0.6.1) - 2018-08-29 63 | 64 | ### Merged 65 | 66 | - Fixed api output for build=False #93 [`#97`](https://github.com/mvexel/overpass-api-python-wrapper/pull/97) 67 | - Requests proxy support [`#86`](https://github.com/mvexel/overpass-api-python-wrapper/pull/86) 68 | 69 | ### Fixed 70 | 71 | - adding examples and tests dirs to distribution, bumping to 0.6.1, fixes #50 [`#50`](https://github.com/mvexel/overpass-api-python-wrapper/issues/50) 72 | - strip whitespace, fixes #101 [`#101`](https://github.com/mvexel/overpass-api-python-wrapper/issues/101) 73 | - fix example, fixes #95 [`#95`](https://github.com/mvexel/overpass-api-python-wrapper/issues/95) 74 | - include test dir in manifest, fixes #50 [`#50`](https://github.com/mvexel/overpass-api-python-wrapper/issues/50) 75 | - add copyright to code, add LICENSE to manifest, fixes #51 [`#51`](https://github.com/mvexel/overpass-api-python-wrapper/issues/51) 76 | - re-adding RST doc (generated using pandoc from md file), fixes #67 [`#67`](https://github.com/mvexel/overpass-api-python-wrapper/issues/67) 77 | 78 | ### Commits 79 | 80 | - reformatting and correctly routing xml responseformat [`c8f96ff`](https://github.com/mvexel/overpass-api-python-wrapper/commit/c8f96ff0bdc89db32b03def5a56fa06fb48fde2e) 81 | - improvements on documentation [`afbaa5d`](https://github.com/mvexel/overpass-api-python-wrapper/commit/afbaa5d2ff0c99dddd252f557a6fc4ddd604562d) 82 | - Updating README and examples [`f07db0d`](https://github.com/mvexel/overpass-api-python-wrapper/commit/f07db0d6e090a93c10ded4a50b2665c9682599f4) 83 | 84 | ## [0.6.0](https://github.com/mvexel/overpass-api-python-wrapper/compare/0.5.7...0.6.0) - 2018-04-06 85 | 86 | ### Commits 87 | 88 | - hotfix and fix tests [`b77865a`](https://github.com/mvexel/overpass-api-python-wrapper/commit/b77865a5d18620f83b41216bb420b324af2d6b54) 89 | - fixing var name in test script and remove function call [`198aeb2`](https://github.com/mvexel/overpass-api-python-wrapper/commit/198aeb212c2d0ae9d58ca8333bc66395cd10b9f1) 90 | - update travis build config [`db73fa3`](https://github.com/mvexel/overpass-api-python-wrapper/commit/db73fa3bf98e77d4733c5842c440e07e0e2c21bb) 91 | 92 | ## [0.5.7](https://github.com/mvexel/overpass-api-python-wrapper/compare/0.5.6...0.5.7) - 2018-04-06 93 | 94 | ### Merged 95 | 96 | - fix bug in complete ways and relations query [`#75`](https://github.com/mvexel/overpass-api-python-wrapper/pull/75) 97 | - Fix broken link in readme. [`#68`](https://github.com/mvexel/overpass-api-python-wrapper/pull/68) 98 | - Revert "Change to https as http is no longer supported on overpass-ap… [`#65`](https://github.com/mvexel/overpass-api-python-wrapper/pull/65) 99 | 100 | ### Fixed 101 | 102 | - Remove superfluous > chars, fixes #84 [`#84`](https://github.com/mvexel/overpass-api-python-wrapper/issues/84) 103 | - Verbosity for GeoJSON output [`#79`](https://github.com/mvexel/overpass-api-python-wrapper/issues/79) 104 | - logging compatible with py3, fixes #72 [`#72`](https://github.com/mvexel/overpass-api-python-wrapper/issues/72) 105 | 106 | ### Commits 107 | 108 | - support CSV [`d833dd3`](https://github.com/mvexel/overpass-api-python-wrapper/commit/d833dd361ec09803209413b546b94fddee529a5f) 109 | - http > https and some minor formatting [`c7b5bf8`](https://github.com/mvexel/overpass-api-python-wrapper/commit/c7b5bf850e214f9268b6298b8400ad01669d45d1) 110 | - adding example [`bbc97b3`](https://github.com/mvexel/overpass-api-python-wrapper/commit/bbc97b30a8ab970798643bccf19cfd2a8eed37b2) 111 | 112 | ## [0.5.6](https://github.com/mvexel/overpass-api-python-wrapper/compare/0.5.5...0.5.6) - 2016-08-22 113 | 114 | ### Commits 115 | 116 | - simplify setup.py so that it actually works... [`3cdf157`](https://github.com/mvexel/overpass-api-python-wrapper/commit/3cdf15739980bb9f4a9bda4f50a1cc4e70986684) 117 | 118 | ## [0.5.5](https://github.com/mvexel/overpass-api-python-wrapper/compare/0.4.0...0.5.5) - 2016-08-21 119 | 120 | ### Merged 121 | 122 | - Support for full multiline query [`#57`](https://github.com/mvexel/overpass-api-python-wrapper/pull/57) 123 | - enable csv response format [`#60`](https://github.com/mvexel/overpass-api-python-wrapper/pull/60) 124 | - Change to https as http is no longer supported on overpass-api.de [`#63`](https://github.com/mvexel/overpass-api-python-wrapper/pull/63) 125 | 126 | ### Commits 127 | 128 | - version 0.5.0 [`1051aba`](https://github.com/mvexel/overpass-api-python-wrapper/commit/1051aba45a2b38079c948fa4bfd8581c95dd81c4) 129 | - bumping to 0.5.4, getting markdown to rst to work for PyPi [`cfb9407`](https://github.com/mvexel/overpass-api-python-wrapper/commit/cfb9407d19b37c1022d508e133c64dce14fe1d74) 130 | - Working [`a45480e`](https://github.com/mvexel/overpass-api-python-wrapper/commit/a45480e6613723c3f8112a8f8b4523cd6ab2cf15) 131 | 132 | ## [0.4.0](https://github.com/mvexel/overpass-api-python-wrapper/compare/0.1.0...0.4.0) - 2016-03-31 133 | 134 | ### Merged 135 | 136 | - Added verbosity options to the return [`#47`](https://github.com/mvexel/overpass-api-python-wrapper/pull/47) 137 | - fixes obvious error in example, see #37 [`#44`](https://github.com/mvexel/overpass-api-python-wrapper/pull/44) 138 | - Merge Wille's fork and improvements [`#36`](https://github.com/mvexel/overpass-api-python-wrapper/pull/36) 139 | - Handle server runtime error from overpass API [`#35`](https://github.com/mvexel/overpass-api-python-wrapper/pull/35) 140 | - Fix response encoding (fixing #34) [`#34`](https://github.com/mvexel/overpass-api-python-wrapper/pull/34) 141 | - Substitute post for get. Received 414 error when requesting large poly [`#26`](https://github.com/mvexel/overpass-api-python-wrapper/pull/26) 142 | - Implemented exceptions. [`#25`](https://github.com/mvexel/overpass-api-python-wrapper/pull/25) 143 | 144 | ### Commits 145 | 146 | - raw commit [`dc960be`](https://github.com/mvexel/overpass-api-python-wrapper/commit/dc960beb899537aa64a9a61bbc39160daa1e7906) 147 | - Implemented an exceptions class for every kind of error. [`fcd49d6`](https://github.com/mvexel/overpass-api-python-wrapper/commit/fcd49d67e5fe6c1695b7fd31b6f3f6c180da75d3) 148 | - response format flexibility [`98b6f63`](https://github.com/mvexel/overpass-api-python-wrapper/commit/98b6f63f3ce486d15aa619f8a60a0ad268983230) 149 | 150 | ## [0.1.0](https://github.com/mvexel/overpass-api-python-wrapper/compare/0.0.2...0.1.0) - 2014-12-04 151 | 152 | ### Commits 153 | 154 | - bumping version to 0.1.0, ready for pypi [`90e3913`](https://github.com/mvexel/overpass-api-python-wrapper/commit/90e3913ca6b9d39ec8fed5fbbde195144293ba81) 155 | - bumping to 0.0.2 [`7660f3e`](https://github.com/mvexel/overpass-api-python-wrapper/commit/7660f3ecc0c38c2f4ebdf86c618efc08f6737ebf) 156 | 157 | ## [0.0.2](https://github.com/mvexel/overpass-api-python-wrapper/compare/0.0.1...0.0.2) - 2014-11-24 158 | 159 | ### Merged 160 | 161 | - no emails from travis [`#22`](https://github.com/mvexel/overpass-api-python-wrapper/pull/22) 162 | - p3 compatibility + some formatting + removing unused import [`#21`](https://github.com/mvexel/overpass-api-python-wrapper/pull/21) 163 | - Simple queries [`#13`](https://github.com/mvexel/overpass-api-python-wrapper/pull/13) 164 | - Auto import [`#11`](https://github.com/mvexel/overpass-api-python-wrapper/pull/11) 165 | - Allow newer version of requests [`#12`](https://github.com/mvexel/overpass-api-python-wrapper/pull/12) 166 | - Enable syntax highlighting for code snippets. [`#10`](https://github.com/mvexel/overpass-api-python-wrapper/pull/10) 167 | - Fix installation failure on case-sensitive file systems. [`#9`](https://github.com/mvexel/overpass-api-python-wrapper/pull/9) 168 | 169 | ### Commits 170 | 171 | - First crack at geoJSON output [`ebedee0`](https://github.com/mvexel/overpass-api-python-wrapper/commit/ebedee01b48657426a00c9f38195ab82c33cf3d9) 172 | - merging pep8 changes from #19 [`f99f3fc`](https://github.com/mvexel/overpass-api-python-wrapper/commit/f99f3fc45e36da021aed01f4b72ea53c7aea5dcf) 173 | - Setting 'out geometry;' on asGeoJSON=True queries - geoJSON output [`20c1582`](https://github.com/mvexel/overpass-api-python-wrapper/commit/20c1582c67e892bdefcf215a265f87384829f861) 174 | 175 | ## 0.0.1 - 2014-09-16 176 | 177 | ### Fixed 178 | 179 | - fix example [`#6`](https://github.com/mvexel/overpass-api-python-wrapper/issues/6) 180 | - Adding debugging (fixes #2) and don't require full QL syntax (fixes #1) [`#2`](https://github.com/mvexel/overpass-api-python-wrapper/issues/2) [`#1`](https://github.com/mvexel/overpass-api-python-wrapper/issues/1) 181 | 182 | ### Commits 183 | 184 | - Initial commit [`b38e4ea`](https://github.com/mvexel/overpass-api-python-wrapper/commit/b38e4ea6b0cfd4482afc1815cf331093ac62e3f8) 185 | - initial commit [`0c2b55f`](https://github.com/mvexel/overpass-api-python-wrapper/commit/0c2b55f176685ce4d06aa72d32d43352f6343382) 186 | - branching retrieving logic into separate function [`6820bfe`](https://github.com/mvexel/overpass-api-python-wrapper/commit/6820bfe34a227ae750a5a974da024fdaf8d7a0ea) 187 | -------------------------------------------------------------------------------- /tests/example_live.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "generator": "overpass-turbo", 4 | "copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.", 5 | "timestamp": "2024-08-10T18:01:43Z", 6 | "features": [ 7 | { 8 | "type": "Feature", 9 | "id": "relation/6518385", 10 | "geometry": { 11 | "type": "MultiPolygon", 12 | "coordinates": [ 13 | [ 14 | [ 15 | [-122.183933, 37.846772], 16 | [-122.183935, 37.841137], 17 | [-122.183929, 37.840341], 18 | [-122.183949, 37.839595], 19 | [-122.182912, 37.83957], 20 | [-122.182634, 37.839717], 21 | [-122.182271, 37.839908], 22 | [-122.181039, 37.839916], 23 | [-122.180953, 37.839917], 24 | [-122.18098, 37.839502], 25 | [-122.179526, 37.839474], 26 | [-122.179458, 37.838394], 27 | [-122.179246, 37.838281], 28 | [-122.179015, 37.838187], 29 | [-122.178398, 37.837974], 30 | [-122.178218, 37.837895], 31 | [-122.178038, 37.838142], 32 | [-122.176957, 37.837722], 33 | [-122.175136, 37.839844], 34 | [-122.173416, 37.839848], 35 | [-122.170366, 37.839856], 36 | [-122.170393, 37.841024], 37 | [-122.17167, 37.841556], 38 | [-122.172363, 37.841828], 39 | [-122.173039, 37.842167], 40 | [-122.173059, 37.842199], 41 | [-122.173359, 37.842656], 42 | [-122.173667, 37.84333], 43 | [-122.174148, 37.843785], 44 | [-122.174239, 37.844001], 45 | [-122.174198, 37.844895], 46 | [-122.174197, 37.84491], 47 | [-122.174198, 37.844938], 48 | [-122.17421, 37.84505], 49 | [-122.174244, 37.845431], 50 | [-122.174278, 37.845781], 51 | [-122.174374, 37.846768], 52 | [-122.174381, 37.846909], 53 | [-122.174897, 37.846908], 54 | [-122.174886, 37.850508], 55 | [-122.179469, 37.850483], 56 | [-122.179472, 37.84959], 57 | [-122.179485, 37.846769], 58 | [-122.183933, 37.846772] 59 | ] 60 | ], 61 | [ 62 | [ 63 | [-122.214506, 37.865654], 64 | [-122.214739, 37.865305], 65 | [-122.215062, 37.864823], 66 | [-122.215317, 37.864443], 67 | [-122.215441, 37.864258], 68 | [-122.215644, 37.863955], 69 | [-122.215787, 37.863741], 70 | [-122.213781, 37.862786], 71 | [-122.21353, 37.862666], 72 | [-122.213115, 37.862469], 73 | [-122.211992, 37.862088], 74 | [-122.211749, 37.862006], 75 | [-122.21111, 37.861842], 76 | [-122.211011, 37.861928], 77 | [-122.210872, 37.862025], 78 | [-122.210717, 37.862148], 79 | [-122.210538, 37.862304], 80 | [-122.210372, 37.862476], 81 | [-122.21023, 37.862636], 82 | [-122.210112, 37.862792], 83 | [-122.209981, 37.862994], 84 | [-122.209885, 37.863179], 85 | [-122.209807, 37.863371], 86 | [-122.209741, 37.863566], 87 | [-122.20969, 37.863783], 88 | [-122.209659, 37.863971], 89 | [-122.209651, 37.864191], 90 | [-122.209649, 37.864426], 91 | [-122.20983, 37.86445], 92 | [-122.210077, 37.864798], 93 | [-122.212723, 37.864933], 94 | [-122.212632, 37.865082], 95 | [-122.214506, 37.865654] 96 | ] 97 | ], 98 | [ 99 | [ 100 | [-122.197877, 37.85778], 101 | [-122.198009, 37.861454], 102 | [-122.206689, 37.861446], 103 | [-122.206636, 37.862631], 104 | [-122.2088, 37.86268], 105 | [-122.209006, 37.861648], 106 | [-122.209036, 37.861483], 107 | [-122.208942, 37.861471], 108 | [-122.208703, 37.861442], 109 | [-122.208394, 37.861405], 110 | [-122.207189, 37.861261], 111 | [-122.207248, 37.860891], 112 | [-122.207408, 37.859896], 113 | [-122.207766, 37.859935], 114 | [-122.208188, 37.859981], 115 | [-122.208941, 37.860063], 116 | [-122.20885, 37.859909], 117 | [-122.208785, 37.859769], 118 | [-122.209453, 37.859626], 119 | [-122.209757, 37.860235], 120 | [-122.210262, 37.860607], 121 | [-122.211345, 37.860794], 122 | [-122.2115, 37.860812], 123 | [-122.21206, 37.86088], 124 | [-122.212933, 37.8612], 125 | [-122.213738, 37.861522], 126 | [-122.214499, 37.862013], 127 | [-122.215336, 37.86253], 128 | [-122.21633, 37.862981], 129 | [-122.217, 37.862143], 130 | [-122.218226, 37.863233], 131 | [-122.21858, 37.863031], 132 | [-122.21805, 37.862382], 133 | [-122.217921, 37.862287], 134 | [-122.217372, 37.861838], 135 | [-122.217316, 37.861709], 136 | [-122.217274, 37.861549], 137 | [-122.217243, 37.861458], 138 | [-122.217197, 37.861362], 139 | [-122.217137, 37.861274], 140 | [-122.217074, 37.861197], 141 | [-122.216911, 37.86104], 142 | [-122.21661, 37.860783], 143 | [-122.216546, 37.860723], 144 | [-122.216481, 37.860648], 145 | [-122.216433, 37.860582], 146 | [-122.215701, 37.860658], 147 | [-122.215417, 37.860394], 148 | [-122.214833, 37.859851], 149 | [-122.214168, 37.859233], 150 | [-122.213903, 37.858986], 151 | [-122.212917, 37.859008], 152 | [-122.211748, 37.85828], 153 | [-122.212137, 37.858256], 154 | [-122.212047, 37.857809], 155 | [-122.211506, 37.85714], 156 | [-122.211307, 37.856894], 157 | [-122.211025, 37.857108], 158 | [-122.21085, 37.856934], 159 | [-122.211096, 37.856762], 160 | [-122.210923, 37.856645], 161 | [-122.211163, 37.856313], 162 | [-122.210977, 37.855542], 163 | [-122.210623, 37.855061], 164 | [-122.210885, 37.854196], 165 | [-122.209269, 37.852516], 166 | [-122.20877, 37.851925], 167 | [-122.208486, 37.85169], 168 | [-122.208438, 37.851157], 169 | [-122.208502, 37.851109], 170 | [-122.208541, 37.851063], 171 | [-122.208566, 37.851015], 172 | [-122.208577, 37.850955], 173 | [-122.208596, 37.850482], 174 | [-122.206622, 37.843483], 175 | [-122.206148, 37.843571], 176 | [-122.206153, 37.844079], 177 | [-122.206287, 37.844071], 178 | [-122.206375, 37.844106], 179 | [-122.206428, 37.844158], 180 | [-122.206449, 37.844236], 181 | [-122.206447, 37.844294], 182 | [-122.206444, 37.844375], 183 | [-122.206432, 37.844509], 184 | [-122.206408, 37.844569], 185 | [-122.206318, 37.844628], 186 | [-122.206013, 37.844757], 187 | [-122.205926, 37.844826], 188 | [-122.205853, 37.844948], 189 | [-122.205755, 37.845186], 190 | [-122.205716, 37.845454], 191 | [-122.205692, 37.845581], 192 | [-122.205632, 37.84565], 193 | [-122.205495, 37.845739], 194 | [-122.205358, 37.845857], 195 | [-122.205352, 37.845942], 196 | [-122.20541, 37.846273], 197 | [-122.205394, 37.846387], 198 | [-122.205346, 37.846512], 199 | [-122.204974, 37.847075], 200 | [-122.204831, 37.847448], 201 | [-122.204807, 37.847701], 202 | [-122.204778, 37.847778], 203 | [-122.204655, 37.847849], 204 | [-122.204615, 37.847869], 205 | [-122.204584, 37.847916], 206 | [-122.20456, 37.848005], 207 | [-122.204533, 37.84831], 208 | [-122.204427, 37.848645], 209 | [-122.204432, 37.848755], 210 | [-122.204503, 37.848825], 211 | [-122.204612, 37.848879], 212 | [-122.204701, 37.848915], 213 | [-122.204722, 37.848938], 214 | [-122.204719, 37.848972], 215 | [-122.204699, 37.849004], 216 | [-122.204632, 37.849013], 217 | [-122.204475, 37.848981], 218 | [-122.204071, 37.848987], 219 | [-122.203951, 37.84896], 220 | [-122.203839, 37.848899], 221 | [-122.203814, 37.848821], 222 | [-122.203864, 37.848741], 223 | [-122.203775, 37.848634], 224 | [-122.203649, 37.848788], 225 | [-122.203566, 37.848937], 226 | [-122.203476, 37.84912], 227 | [-122.203425, 37.84928], 228 | [-122.203361, 37.849483], 229 | [-122.203312, 37.849699], 230 | [-122.203293, 37.849857], 231 | [-122.20307, 37.849528], 232 | [-122.203008, 37.849391], 233 | [-122.202922, 37.849257], 234 | [-122.202848, 37.849167], 235 | [-122.202784, 37.849109], 236 | [-122.201952, 37.848548], 237 | [-122.201904, 37.848511], 238 | [-122.201848, 37.848454], 239 | [-122.201797, 37.848392], 240 | [-122.201749, 37.848329], 241 | [-122.201714, 37.848254], 242 | [-122.201686, 37.848126], 243 | [-122.201662, 37.84805], 244 | [-122.201615, 37.847969], 245 | [-122.201547, 37.847906], 246 | [-122.201452, 37.847847], 247 | [-122.201293, 37.847766], 248 | [-122.200899, 37.847626], 249 | [-122.200603, 37.847587], 250 | [-122.200188, 37.847506], 251 | [-122.199673, 37.847378], 252 | [-122.199029, 37.847391], 253 | [-122.198832, 37.847411], 254 | [-122.198686, 37.847378], 255 | [-122.198509, 37.847245], 256 | [-122.1982, 37.846859], 257 | [-122.197763, 37.846534], 258 | [-122.197436, 37.846209], 259 | [-122.19685, 37.845815], 260 | [-122.196707, 37.845596], 261 | [-122.196595, 37.845336], 262 | [-122.196562, 37.845099], 263 | [-122.19655, 37.844859], 264 | [-122.196555, 37.844785], 265 | [-122.196591, 37.8446], 266 | [-122.196626, 37.844275], 267 | [-122.196625, 37.844159], 268 | [-122.196596, 37.844063], 269 | [-122.196527, 37.84398], 270 | [-122.196416, 37.843891], 271 | [-122.196167, 37.843758], 272 | [-122.193102, 37.844092], 273 | [-122.193004, 37.84685], 274 | [-122.188458, 37.8468], 275 | [-122.188587, 37.850433], 276 | [-122.188619, 37.852042], 277 | [-122.189155, 37.85316], 278 | [-122.18951, 37.853395], 279 | [-122.190287, 37.854202], 280 | [-122.191239, 37.854941], 281 | [-122.192671, 37.855601], 282 | [-122.19383, 37.856063], 283 | [-122.194573, 37.856456], 284 | [-122.194969, 37.856665], 285 | [-122.194092, 37.857792], 286 | [-122.197877, 37.85778] 287 | ], 288 | [ 289 | [-122.209682, 37.858775], 290 | [-122.209445, 37.858474], 291 | [-122.209792, 37.858168], 292 | [-122.210106, 37.858073], 293 | [-122.210318, 37.858454], 294 | [-122.209682, 37.858775] 295 | ], 296 | [ 297 | [-122.193631, 37.850507], 298 | [-122.192981, 37.850497], 299 | [-122.192966, 37.851048], 300 | [-122.191979, 37.851031], 301 | [-122.191993, 37.85048], 302 | [-122.192015, 37.849655], 303 | [-122.193653, 37.849682], 304 | [-122.193631, 37.850507] 305 | ], 306 | [ 307 | [-122.195626, 37.850528], 308 | [-122.195622, 37.850664], 309 | [-122.194665, 37.85065], 310 | [-122.194668, 37.850514], 311 | [-122.195626, 37.850528] 312 | ] 313 | ] 314 | ] 315 | }, 316 | "properties": { 317 | "@id": "relation/6518385", 318 | "boundary": "protected_area", 319 | "contact:website": "http://www.ebparks.org/parks/sibley", 320 | "name": "Sibley Volcanic Regional Preserve", 321 | "operator": "East Bay Regional Park District", 322 | "owner": "East Bay Regional Park District", 323 | "protect_class": "4", 324 | "source": "https://www.ebparks.org/images/Assets/files/parks/sibley/Sibley-map_2250w-04-23-18.gif", 325 | "type": "multipolygon", 326 | "website": "https://www.ebparks.org/parks/sibley/", 327 | "wikidata": "Q7349780", 328 | "wikipedia": "en:Robert Sibley Volcanic Regional Preserve" 329 | } 330 | }, 331 | { 332 | "type": "Feature", 333 | "id": "way/10322303", 334 | "geometry": { 335 | "type": "LineString", 336 | "coordinates": [ 337 | [-122.318271, 37.86911], 338 | [-122.318192, 37.868925], 339 | [-122.3181, 37.868851], 340 | [-122.317971, 37.86879], 341 | [-122.317754, 37.86875], 342 | [-122.317622, 37.868773], 343 | [-122.317385, 37.868904], 344 | [-122.317284, 37.869007], 345 | [-122.317244, 37.869049], 346 | [-122.31729, 37.869279], 347 | [-122.317325, 37.869433], 348 | [-122.31737, 37.869623], 349 | [-122.317409, 37.869766], 350 | [-122.317436, 37.869861] 351 | ] 352 | }, 353 | "properties": { 354 | "@id": "way/10322303", 355 | "addr:city": "Berkeley", 356 | "foot": "yes", 357 | "highway": "service" 358 | } 359 | }, 360 | { 361 | "type": "Feature", 362 | "id": "node/4927326183", 363 | "geometry": { "type": "Point", "coordinates": [-122.318423, 37.869678] }, 364 | "properties": { "@id": "node/4927326183" } 365 | } 366 | ] 367 | } 368 | -------------------------------------------------------------------------------- /tests/example_body.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [{ 4 | "type": "Feature", 5 | "properties": { 6 | "type": "relation", 7 | "id": 6518385, 8 | "tags": { 9 | "boundary": "protected_area", 10 | "contact:website": "http://www.ebparks.org/parks/sibley", 11 | "name": "Sibley Volcanic Regional Preserve", 12 | "operator": "East Bay Regional Park District", 13 | "owner": "East Bay Regional Park District", 14 | "protect_class": "4", 15 | "source": "https://www.ebparks.org/images/Assets/files/parks/sibley/Sibley-map_2250w-04-23-18.gif", 16 | "type": "multipolygon", 17 | "website": "https://www.ebparks.org/parks/sibley/", 18 | "wikidata": "Q7349780", 19 | "wikipedia": "en:Robert Sibley Volcanic Regional Preserve" 20 | } 21 | }, 22 | "geometry": { 23 | "type": "MultiPolygon", 24 | "coordinates": [ 25 | [ 26 | [ 27 | [-122.1794718, 37.84959], 28 | [-122.1794688, 37.8504828], 29 | [-122.1748862, 37.8505078], 30 | [-122.1748969, 37.846908], 31 | [-122.1743812, 37.8469091], 32 | [-122.1743737, 37.8467679], 33 | [-122.174278, 37.8457811], 34 | [-122.1742444, 37.8454312], 35 | [-122.1742095, 37.8450505], 36 | [-122.1741976, 37.844938], 37 | [-122.1741972, 37.8449101], 38 | [-122.1741978, 37.8448946], 39 | [-122.1742394, 37.8440012], 40 | [-122.1741477, 37.8437848], 41 | [-122.1736671, 37.8433304], 42 | [-122.1733589, 37.8426564], 43 | [-122.1730593, 37.8421994], 44 | [-122.1730392, 37.8421669], 45 | [-122.1723633, 37.8418279], 46 | [-122.1716704, 37.8415556], 47 | [-122.170393, 37.841024], 48 | [-122.1703659, 37.8398564], 49 | [-122.1734159, 37.8398484], 50 | [-122.1751359, 37.8398439], 51 | [-122.1769565, 37.8377218], 52 | [-122.1780377, 37.8381424], 53 | [-122.1782177, 37.8378947], 54 | [-122.1783984, 37.8379737], 55 | [-122.1790152, 37.8381872], 56 | [-122.1792459, 37.8382812], 57 | [-122.1794585, 37.8383942], 58 | [-122.179526, 37.839474], 59 | [-122.18098, 37.839502], 60 | [-122.180953, 37.839917], 61 | [-122.1810388, 37.8399164], 62 | [-122.182271, 37.839908], 63 | [-122.1826336, 37.8397165], 64 | [-122.182912, 37.83957], 65 | [-122.1839488, 37.839595], 66 | [-122.1839291, 37.8403406], 67 | [-122.1839345, 37.841137], 68 | [-122.1839334, 37.846772], 69 | [-122.1794846, 37.8467686], 70 | [-122.1794718, 37.84959] 71 | ] 72 | ], 73 | [ 74 | [ 75 | [-122.1945727, 37.8564558], 76 | [-122.1938301, 37.8560627], 77 | [-122.1926709, 37.8556011], 78 | [-122.191239, 37.854941], 79 | [-122.1902871, 37.8542022], 80 | [-122.1895098, 37.853395], 81 | [-122.1891555, 37.8531602], 82 | [-122.1886194, 37.8520422], 83 | [-122.1885866, 37.8504331], 84 | [-122.188458, 37.8468], 85 | [-122.193004, 37.84685], 86 | [-122.193102, 37.844092], 87 | [-122.1961671, 37.8437576], 88 | [-122.1964164, 37.843891], 89 | [-122.1965272, 37.8439802], 90 | [-122.1965956, 37.8440628], 91 | [-122.1966251, 37.8441586], 92 | [-122.1966258, 37.8442751], 93 | [-122.1965913, 37.8445996], 94 | [-122.1965552, 37.8447847], 95 | [-122.1965504, 37.8448595], 96 | [-122.1965625, 37.8450989], 97 | [-122.1965948, 37.8453362], 98 | [-122.1967066, 37.8455965], 99 | [-122.1968499, 37.845815], 100 | [-122.1974365, 37.8462085], 101 | [-122.1977626, 37.8465338], 102 | [-122.1982004, 37.8468591], 103 | [-122.1985094, 37.8472454], 104 | [-122.1986861, 37.8473775], 105 | [-122.198832, 37.8474114], 106 | [-122.1990294, 37.847391], 107 | [-122.1996732, 37.8473775], 108 | [-122.2001882, 37.8475063], 109 | [-122.2006034, 37.847587], 110 | [-122.2008992, 37.8476259], 111 | [-122.2012933, 37.8477655], 112 | [-122.2014519, 37.8478469], 113 | [-122.2015471, 37.8479064], 114 | [-122.2016145, 37.847969], 115 | [-122.2016621, 37.8480504], 116 | [-122.2016859, 37.8481256], 117 | [-122.2017136, 37.848254], 118 | [-122.2017493, 37.8483291], 119 | [-122.2017969, 37.8483917], 120 | [-122.2018485, 37.8484544], 121 | [-122.201904, 37.8485107], 122 | [-122.2019516, 37.8485483], 123 | [-122.2027841, 37.8491095], 124 | [-122.2028479, 37.8491672], 125 | [-122.2029216, 37.8492567], 126 | [-122.2030081, 37.8493907], 127 | [-122.2030698, 37.8495283], 128 | [-122.2032926, 37.8498573], 129 | [-122.2033125, 37.8496988], 130 | [-122.2033608, 37.8494828], 131 | [-122.2034252, 37.8492805], 132 | [-122.2034761, 37.8491196], 133 | [-122.203566, 37.8489374], 134 | [-122.203649, 37.8487876], 135 | [-122.2037751, 37.8486341], 136 | [-122.2038636, 37.848741], 137 | [-122.203814, 37.8488215], 138 | [-122.2038394, 37.8488992], 139 | [-122.203951, 37.8489602], 140 | [-122.2040712, 37.8489873], 141 | [-122.2044746, 37.8489805], 142 | [-122.2046315, 37.8490126], 143 | [-122.2046985, 37.8490036], 144 | [-122.2047186, 37.8489724], 145 | [-122.204722, 37.848938], 146 | [-122.2047005, 37.8489147], 147 | [-122.2046119, 37.8488788], 148 | [-122.2045027, 37.8488252], 149 | [-122.2044317, 37.8487548], 150 | [-122.204427, 37.8486446], 151 | [-122.2045329, 37.8483105], 152 | [-122.2045604, 37.8480045], 153 | [-122.2045839, 37.847916], 154 | [-122.2046154, 37.8478694], 155 | [-122.2046548, 37.8478486], 156 | [-122.2047783, 37.8477778], 157 | [-122.2048072, 37.8477005], 158 | [-122.2048306, 37.8474485], 159 | [-122.2049493, 37.8471107], 160 | [-122.2053463, 37.8465123], 161 | [-122.2053939, 37.8463874], 162 | [-122.20541, 37.846273], 163 | [-122.2053523, 37.8459415], 164 | [-122.2053577, 37.8458573], 165 | [-122.2054945, 37.8457393], 166 | [-122.2056319, 37.8456498], 167 | [-122.2056923, 37.8455809], 168 | [-122.2057158, 37.8454544], 169 | [-122.2057547, 37.8451859], 170 | [-122.2058526, 37.8449476], 171 | [-122.2059263, 37.8448258], 172 | [-122.2060135, 37.844757], 173 | [-122.2063179, 37.8446278], 174 | [-122.2064078, 37.8445685], 175 | [-122.2064319, 37.8445092], 176 | [-122.206444, 37.8443747], 177 | [-122.2064467, 37.8442939], 178 | [-122.2064487, 37.8442361], 179 | [-122.2064279, 37.844158], 180 | [-122.2063753, 37.8441062], 181 | [-122.2062871, 37.8440712], 182 | [-122.206153, 37.8440786], 183 | [-122.2061479, 37.8435708], 184 | [-122.2066221, 37.8434835], 185 | [-122.2085964, 37.850482], 186 | [-122.208577, 37.8509554], 187 | [-122.2085659, 37.8510147], 188 | [-122.2085409, 37.851063], 189 | [-122.208502, 37.8511091], 190 | [-122.208438, 37.8511574], 191 | [-122.208486, 37.85169], 192 | [-122.2087702, 37.8519251], 193 | [-122.2092691, 37.8525155], 194 | [-122.2108847, 37.8541961], 195 | [-122.2106232, 37.8550607], 196 | [-122.2109766, 37.8555423], 197 | [-122.2111627, 37.8563126], 198 | [-122.2109229, 37.8566447], 199 | [-122.2110964, 37.8567616], 200 | [-122.2108496, 37.8569342], 201 | [-122.2110246, 37.857108], 202 | [-122.2113068, 37.856894], 203 | [-122.2115058, 37.8571398], 204 | [-122.2120475, 37.8578091], 205 | [-122.2121374, 37.8582562], 206 | [-122.2117485, 37.8582802], 207 | [-122.2129171, 37.8590083], 208 | [-122.2139028, 37.8589861], 209 | [-122.2141683, 37.859233], 210 | [-122.2148326, 37.8598506], 211 | [-122.2154172, 37.8603942], 212 | [-122.215701, 37.8606581], 213 | [-122.2164333, 37.8605821], 214 | [-122.2164811, 37.8606483], 215 | [-122.2165464, 37.860723], 216 | [-122.2166097, 37.8607835], 217 | [-122.2169109, 37.8610403], 218 | [-122.217074, 37.8611974], 219 | [-122.2171367, 37.8612736], 220 | [-122.2171975, 37.8613625], 221 | [-122.2172431, 37.8614579], 222 | [-122.2172742, 37.8615492], 223 | [-122.2173159, 37.8617086], 224 | [-122.2173716, 37.8618385], 225 | [-122.2179208, 37.8622867], 226 | [-122.2180495, 37.8623816], 227 | [-122.2185527, 37.8629942], 228 | [-122.2182672, 37.8632819], 229 | [-122.2170003, 37.862143], 230 | [-122.2163302, 37.8629807], 231 | [-122.2153362, 37.8625301], 232 | [-122.2144994, 37.8620134], 233 | [-122.2137376, 37.8615221], 234 | [-122.2129329, 37.8612002], 235 | [-122.2120602, 37.86088], 236 | [-122.2114995, 37.8608123], 237 | [-122.2113451, 37.8607936], 238 | [-122.2102615, 37.8606073], 239 | [-122.2097572, 37.8602346], 240 | [-122.2094531, 37.8596264], 241 | [-122.2087851, 37.8597685], 242 | [-122.2088504, 37.8599088], 243 | [-122.2089406, 37.860063], 244 | [-122.2081879, 37.8599809], 245 | [-122.2077658, 37.8599349], 246 | [-122.2074076, 37.8598958], 247 | [-122.207248, 37.8608912], 248 | [-122.2071887, 37.8612612], 249 | [-122.2083939, 37.8614053], 250 | [-122.2087028, 37.8614422], 251 | [-122.2089418, 37.8614708], 252 | [-122.2091415, 37.8614975], 253 | [-122.2091172, 37.861616], 254 | [-122.2089019, 37.8626858], 255 | [-122.2066359, 37.8626311], 256 | [-122.2066888, 37.8614459], 257 | [-122.1980086, 37.8614543], 258 | [-122.1978766, 37.85778], 259 | [-122.1940921, 37.8577917], 260 | [-122.1949688, 37.8566651], 261 | [-122.1945727, 37.8564558] 262 | ], 263 | [ 264 | [-122.1936314, 37.8505074], 265 | [-122.1936532, 37.8496821], 266 | [-122.1920152, 37.8496551], 267 | [-122.1919934, 37.8504796], 268 | [-122.1919789, 37.8510314], 269 | [-122.1929665, 37.8510476], 270 | [-122.192981, 37.8504967], 271 | [-122.1936314, 37.8505074] 272 | ], 273 | [ 274 | [-122.1956223, 37.8506642], 275 | [-122.1956256, 37.8505283], 276 | [-122.1946679, 37.8505136], 277 | [-122.1946645, 37.8506495], 278 | [-122.1956223, 37.8506642] 279 | ], 280 | [ 281 | [-122.2094446, 37.8584741], 282 | [-122.2096819, 37.8587752], 283 | [-122.2103175, 37.858454], 284 | [-122.2101056, 37.8580727], 285 | [-122.209792, 37.8581685], 286 | [-122.2094446, 37.8584741] 287 | ] 288 | ], 289 | [ 290 | [ 291 | [-122.2100769, 37.8647984], 292 | [-122.2098302, 37.8644502], 293 | [-122.2095533, 37.864413], 294 | [-122.2095565, 37.8641922], 295 | [-122.209559, 37.8639646], 296 | [-122.2095814, 37.8637617], 297 | [-122.2096334, 37.8635452], 298 | [-122.2097017, 37.863344], 299 | [-122.2097741, 37.8631636], 300 | [-122.2098842, 37.8629608], 301 | [-122.2099821, 37.8628239], 302 | [-122.2100963, 37.8626573], 303 | [-122.2102208, 37.8625164], 304 | [-122.2103687, 37.8623554], 305 | [-122.2105186, 37.8622155], 306 | [-122.2106566, 37.862098], 307 | [-122.2107887, 37.861994], 308 | [-122.2109324, 37.8618885], 309 | [-122.210984, 37.8618545], 310 | [-122.2110324, 37.8618225], 311 | [-122.2117493, 37.8620058], 312 | [-122.2119916, 37.8620879], 313 | [-122.2131154, 37.8624686], 314 | [-122.2135296, 37.8626659], 315 | [-122.2137807, 37.8627856], 316 | [-122.2157868, 37.8637413], 317 | [-122.2156436, 37.8639551], 318 | [-122.2154408, 37.8642579], 319 | [-122.2153169, 37.8644428], 320 | [-122.215062, 37.8648233], 321 | [-122.2147394, 37.865305], 322 | [-122.2145058, 37.8656538], 323 | [-122.2126318, 37.8650823], 324 | [-122.2127232, 37.864933], 325 | [-122.2100769, 37.8647984] 326 | ] 327 | ] 328 | ] 329 | } 330 | }, { 331 | "type": "Feature", 332 | "properties": { 333 | "type": "way", 334 | "id": 10322303, 335 | "tags": { 336 | "addr:city": "Berkeley", 337 | "foot": "yes", 338 | "highway": "service" 339 | }, 340 | "nodes": [87340060, 4927326183, 4927326179, 4927326177, 4927326175, 87362432, 4927326184, 87362434, 813905690, 87362436, 87362437, 87362444, 4927326174, 4927326176, 4927326178, 4927326180, 87362452] 341 | }, 342 | "geometry": { 343 | "type": "LineString", 344 | "coordinates": [ 345 | [-122.3184769, 37.8699011], 346 | [-122.3184121, 37.8696521], 347 | [-122.3183574, 37.8694416], 348 | [-122.3183131, 37.8692714], 349 | [-122.318271, 37.8691095], 350 | [-122.3182181, 37.8689059], 351 | [-122.3181336, 37.8688307], 352 | [-122.3179977, 37.8687626], 353 | [-122.3177537, 37.8687499], 354 | [-122.3176222, 37.8687732], 355 | [-122.3172655, 37.8689299], 356 | [-122.317185, 37.8690146], 357 | [-122.3172551, 37.8692792], 358 | [-122.3172973, 37.8694387], 359 | [-122.3173448, 37.8696182], 360 | [-122.3174212, 37.8699064], 361 | [-122.3174645, 37.8700701] 362 | ] 363 | } 364 | }, { 365 | "type": "Feature", 366 | "properties": { 367 | "type": "node", 368 | "id": 4927326183 369 | }, 370 | "geometry": { 371 | "type": "Point", 372 | "coordinates": [-122.3184121, 37.8696521] 373 | } 374 | }] 375 | } -------------------------------------------------------------------------------- /tests/example_meta.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [{ 4 | "type": "Feature", 5 | "properties": { 6 | "type": "relation", 7 | "id": 6518385, 8 | "tags": { 9 | "boundary": "protected_area", 10 | "contact:website": "http://www.ebparks.org/parks/sibley", 11 | "name": "Sibley Volcanic Regional Preserve", 12 | "operator": "East Bay Regional Park District", 13 | "owner": "East Bay Regional Park District", 14 | "protect_class": "4", 15 | "source": "https://www.ebparks.org/images/Assets/files/parks/sibley/Sibley-map_2250w-04-23-18.gif", 16 | "type": "multipolygon", 17 | "website": "https://www.ebparks.org/parks/sibley/", 18 | "wikidata": "Q7349780", 19 | "wikipedia": "en:Robert Sibley Volcanic Regional Preserve" 20 | }, 21 | "timestamp": "2021-02-17T03:29:31Z", 22 | "user": "Mstew354", 23 | "uid": 11988139, 24 | "version": 14 25 | }, 26 | "geometry": { 27 | "type": "MultiPolygon", 28 | "coordinates": [ 29 | [ 30 | [ 31 | [-122.1794718, 37.84959], 32 | [-122.1794688, 37.8504828], 33 | [-122.1748862, 37.8505078], 34 | [-122.1748969, 37.846908], 35 | [-122.1743812, 37.8469091], 36 | [-122.1743737, 37.8467679], 37 | [-122.174278, 37.8457811], 38 | [-122.1742444, 37.8454312], 39 | [-122.1742095, 37.8450505], 40 | [-122.1741976, 37.844938], 41 | [-122.1741972, 37.8449101], 42 | [-122.1741978, 37.8448946], 43 | [-122.1742394, 37.8440012], 44 | [-122.1741477, 37.8437848], 45 | [-122.1736671, 37.8433304], 46 | [-122.1733589, 37.8426564], 47 | [-122.1730593, 37.8421994], 48 | [-122.1730392, 37.8421669], 49 | [-122.1723633, 37.8418279], 50 | [-122.1716704, 37.8415556], 51 | [-122.170393, 37.841024], 52 | [-122.1703659, 37.8398564], 53 | [-122.1734159, 37.8398484], 54 | [-122.1751359, 37.8398439], 55 | [-122.1769565, 37.8377218], 56 | [-122.1780377, 37.8381424], 57 | [-122.1782177, 37.8378947], 58 | [-122.1783984, 37.8379737], 59 | [-122.1790152, 37.8381872], 60 | [-122.1792459, 37.8382812], 61 | [-122.1794585, 37.8383942], 62 | [-122.179526, 37.839474], 63 | [-122.18098, 37.839502], 64 | [-122.180953, 37.839917], 65 | [-122.1810388, 37.8399164], 66 | [-122.182271, 37.839908], 67 | [-122.1826336, 37.8397165], 68 | [-122.182912, 37.83957], 69 | [-122.1839488, 37.839595], 70 | [-122.1839291, 37.8403406], 71 | [-122.1839345, 37.841137], 72 | [-122.1839334, 37.846772], 73 | [-122.1794846, 37.8467686], 74 | [-122.1794718, 37.84959] 75 | ] 76 | ], 77 | [ 78 | [ 79 | [-122.1945727, 37.8564558], 80 | [-122.1938301, 37.8560627], 81 | [-122.1926709, 37.8556011], 82 | [-122.191239, 37.854941], 83 | [-122.1902871, 37.8542022], 84 | [-122.1895098, 37.853395], 85 | [-122.1891555, 37.8531602], 86 | [-122.1886194, 37.8520422], 87 | [-122.1885866, 37.8504331], 88 | [-122.188458, 37.8468], 89 | [-122.193004, 37.84685], 90 | [-122.193102, 37.844092], 91 | [-122.1961671, 37.8437576], 92 | [-122.1964164, 37.843891], 93 | [-122.1965272, 37.8439802], 94 | [-122.1965956, 37.8440628], 95 | [-122.1966251, 37.8441586], 96 | [-122.1966258, 37.8442751], 97 | [-122.1965913, 37.8445996], 98 | [-122.1965552, 37.8447847], 99 | [-122.1965504, 37.8448595], 100 | [-122.1965625, 37.8450989], 101 | [-122.1965948, 37.8453362], 102 | [-122.1967066, 37.8455965], 103 | [-122.1968499, 37.845815], 104 | [-122.1974365, 37.8462085], 105 | [-122.1977626, 37.8465338], 106 | [-122.1982004, 37.8468591], 107 | [-122.1985094, 37.8472454], 108 | [-122.1986861, 37.8473775], 109 | [-122.198832, 37.8474114], 110 | [-122.1990294, 37.847391], 111 | [-122.1996732, 37.8473775], 112 | [-122.2001882, 37.8475063], 113 | [-122.2006034, 37.847587], 114 | [-122.2008992, 37.8476259], 115 | [-122.2012933, 37.8477655], 116 | [-122.2014519, 37.8478469], 117 | [-122.2015471, 37.8479064], 118 | [-122.2016145, 37.847969], 119 | [-122.2016621, 37.8480504], 120 | [-122.2016859, 37.8481256], 121 | [-122.2017136, 37.848254], 122 | [-122.2017493, 37.8483291], 123 | [-122.2017969, 37.8483917], 124 | [-122.2018485, 37.8484544], 125 | [-122.201904, 37.8485107], 126 | [-122.2019516, 37.8485483], 127 | [-122.2027841, 37.8491095], 128 | [-122.2028479, 37.8491672], 129 | [-122.2029216, 37.8492567], 130 | [-122.2030081, 37.8493907], 131 | [-122.2030698, 37.8495283], 132 | [-122.2032926, 37.8498573], 133 | [-122.2033125, 37.8496988], 134 | [-122.2033608, 37.8494828], 135 | [-122.2034252, 37.8492805], 136 | [-122.2034761, 37.8491196], 137 | [-122.203566, 37.8489374], 138 | [-122.203649, 37.8487876], 139 | [-122.2037751, 37.8486341], 140 | [-122.2038636, 37.848741], 141 | [-122.203814, 37.8488215], 142 | [-122.2038394, 37.8488992], 143 | [-122.203951, 37.8489602], 144 | [-122.2040712, 37.8489873], 145 | [-122.2044746, 37.8489805], 146 | [-122.2046315, 37.8490126], 147 | [-122.2046985, 37.8490036], 148 | [-122.2047186, 37.8489724], 149 | [-122.204722, 37.848938], 150 | [-122.2047005, 37.8489147], 151 | [-122.2046119, 37.8488788], 152 | [-122.2045027, 37.8488252], 153 | [-122.2044317, 37.8487548], 154 | [-122.204427, 37.8486446], 155 | [-122.2045329, 37.8483105], 156 | [-122.2045604, 37.8480045], 157 | [-122.2045839, 37.847916], 158 | [-122.2046154, 37.8478694], 159 | [-122.2046548, 37.8478486], 160 | [-122.2047783, 37.8477778], 161 | [-122.2048072, 37.8477005], 162 | [-122.2048306, 37.8474485], 163 | [-122.2049493, 37.8471107], 164 | [-122.2053463, 37.8465123], 165 | [-122.2053939, 37.8463874], 166 | [-122.20541, 37.846273], 167 | [-122.2053523, 37.8459415], 168 | [-122.2053577, 37.8458573], 169 | [-122.2054945, 37.8457393], 170 | [-122.2056319, 37.8456498], 171 | [-122.2056923, 37.8455809], 172 | [-122.2057158, 37.8454544], 173 | [-122.2057547, 37.8451859], 174 | [-122.2058526, 37.8449476], 175 | [-122.2059263, 37.8448258], 176 | [-122.2060135, 37.844757], 177 | [-122.2063179, 37.8446278], 178 | [-122.2064078, 37.8445685], 179 | [-122.2064319, 37.8445092], 180 | [-122.206444, 37.8443747], 181 | [-122.2064467, 37.8442939], 182 | [-122.2064487, 37.8442361], 183 | [-122.2064279, 37.844158], 184 | [-122.2063753, 37.8441062], 185 | [-122.2062871, 37.8440712], 186 | [-122.206153, 37.8440786], 187 | [-122.2061479, 37.8435708], 188 | [-122.2066221, 37.8434835], 189 | [-122.2085964, 37.850482], 190 | [-122.208577, 37.8509554], 191 | [-122.2085659, 37.8510147], 192 | [-122.2085409, 37.851063], 193 | [-122.208502, 37.8511091], 194 | [-122.208438, 37.8511574], 195 | [-122.208486, 37.85169], 196 | [-122.2087702, 37.8519251], 197 | [-122.2092691, 37.8525155], 198 | [-122.2108847, 37.8541961], 199 | [-122.2106232, 37.8550607], 200 | [-122.2109766, 37.8555423], 201 | [-122.2111627, 37.8563126], 202 | [-122.2109229, 37.8566447], 203 | [-122.2110964, 37.8567616], 204 | [-122.2108496, 37.8569342], 205 | [-122.2110246, 37.857108], 206 | [-122.2113068, 37.856894], 207 | [-122.2115058, 37.8571398], 208 | [-122.2120475, 37.8578091], 209 | [-122.2121374, 37.8582562], 210 | [-122.2117485, 37.8582802], 211 | [-122.2129171, 37.8590083], 212 | [-122.2139028, 37.8589861], 213 | [-122.2141683, 37.859233], 214 | [-122.2148326, 37.8598506], 215 | [-122.2154172, 37.8603942], 216 | [-122.215701, 37.8606581], 217 | [-122.2164333, 37.8605821], 218 | [-122.2164811, 37.8606483], 219 | [-122.2165464, 37.860723], 220 | [-122.2166097, 37.8607835], 221 | [-122.2169109, 37.8610403], 222 | [-122.217074, 37.8611974], 223 | [-122.2171367, 37.8612736], 224 | [-122.2171975, 37.8613625], 225 | [-122.2172431, 37.8614579], 226 | [-122.2172742, 37.8615492], 227 | [-122.2173159, 37.8617086], 228 | [-122.2173716, 37.8618385], 229 | [-122.2179208, 37.8622867], 230 | [-122.2180495, 37.8623816], 231 | [-122.2185527, 37.8629942], 232 | [-122.2182672, 37.8632819], 233 | [-122.2170003, 37.862143], 234 | [-122.2163302, 37.8629807], 235 | [-122.2153362, 37.8625301], 236 | [-122.2144994, 37.8620134], 237 | [-122.2137376, 37.8615221], 238 | [-122.2129329, 37.8612002], 239 | [-122.2120602, 37.86088], 240 | [-122.2114995, 37.8608123], 241 | [-122.2113451, 37.8607936], 242 | [-122.2102615, 37.8606073], 243 | [-122.2097572, 37.8602346], 244 | [-122.2094531, 37.8596264], 245 | [-122.2087851, 37.8597685], 246 | [-122.2088504, 37.8599088], 247 | [-122.2089406, 37.860063], 248 | [-122.2081879, 37.8599809], 249 | [-122.2077658, 37.8599349], 250 | [-122.2074076, 37.8598958], 251 | [-122.207248, 37.8608912], 252 | [-122.2071887, 37.8612612], 253 | [-122.2083939, 37.8614053], 254 | [-122.2087028, 37.8614422], 255 | [-122.2089418, 37.8614708], 256 | [-122.2091415, 37.8614975], 257 | [-122.2091172, 37.861616], 258 | [-122.2089019, 37.8626858], 259 | [-122.2066359, 37.8626311], 260 | [-122.2066888, 37.8614459], 261 | [-122.1980086, 37.8614543], 262 | [-122.1978766, 37.85778], 263 | [-122.1940921, 37.8577917], 264 | [-122.1949688, 37.8566651], 265 | [-122.1945727, 37.8564558] 266 | ], 267 | [ 268 | [-122.1936314, 37.8505074], 269 | [-122.1936532, 37.8496821], 270 | [-122.1920152, 37.8496551], 271 | [-122.1919934, 37.8504796], 272 | [-122.1919789, 37.8510314], 273 | [-122.1929665, 37.8510476], 274 | [-122.192981, 37.8504967], 275 | [-122.1936314, 37.8505074] 276 | ], 277 | [ 278 | [-122.1956223, 37.8506642], 279 | [-122.1956256, 37.8505283], 280 | [-122.1946679, 37.8505136], 281 | [-122.1946645, 37.8506495], 282 | [-122.1956223, 37.8506642] 283 | ], 284 | [ 285 | [-122.2094446, 37.8584741], 286 | [-122.2096819, 37.8587752], 287 | [-122.2103175, 37.858454], 288 | [-122.2101056, 37.8580727], 289 | [-122.209792, 37.8581685], 290 | [-122.2094446, 37.8584741] 291 | ] 292 | ], 293 | [ 294 | [ 295 | [-122.2100769, 37.8647984], 296 | [-122.2098302, 37.8644502], 297 | [-122.2095533, 37.864413], 298 | [-122.2095565, 37.8641922], 299 | [-122.209559, 37.8639646], 300 | [-122.2095814, 37.8637617], 301 | [-122.2096334, 37.8635452], 302 | [-122.2097017, 37.863344], 303 | [-122.2097741, 37.8631636], 304 | [-122.2098842, 37.8629608], 305 | [-122.2099821, 37.8628239], 306 | [-122.2100963, 37.8626573], 307 | [-122.2102208, 37.8625164], 308 | [-122.2103687, 37.8623554], 309 | [-122.2105186, 37.8622155], 310 | [-122.2106566, 37.862098], 311 | [-122.2107887, 37.861994], 312 | [-122.2109324, 37.8618885], 313 | [-122.210984, 37.8618545], 314 | [-122.2110324, 37.8618225], 315 | [-122.2117493, 37.8620058], 316 | [-122.2119916, 37.8620879], 317 | [-122.2131154, 37.8624686], 318 | [-122.2135296, 37.8626659], 319 | [-122.2137807, 37.8627856], 320 | [-122.2157868, 37.8637413], 321 | [-122.2156436, 37.8639551], 322 | [-122.2154408, 37.8642579], 323 | [-122.2153169, 37.8644428], 324 | [-122.215062, 37.8648233], 325 | [-122.2147394, 37.865305], 326 | [-122.2145058, 37.8656538], 327 | [-122.2126318, 37.8650823], 328 | [-122.2127232, 37.864933], 329 | [-122.2100769, 37.8647984] 330 | ] 331 | ] 332 | ] 333 | } 334 | }, { 335 | "type": "Feature", 336 | "properties": { 337 | "type": "way", 338 | "id": 10322303, 339 | "tags": { 340 | "addr:city": "Berkeley", 341 | "foot": "yes", 342 | "highway": "service" 343 | }, 344 | "nodes": [87340060, 4927326183, 4927326179, 4927326177, 4927326175, 87362432, 4927326184, 87362434, 813905690, 87362436, 87362437, 87362444, 4927326174, 4927326176, 4927326178, 4927326180, 87362452], 345 | "timestamp": "2017-06-20T19:07:01Z", 346 | "user": "karitotp", 347 | "uid": 2748195, 348 | "version": 5 349 | }, 350 | "geometry": { 351 | "type": "LineString", 352 | "coordinates": [ 353 | [-122.3184769, 37.8699011], 354 | [-122.3184121, 37.8696521], 355 | [-122.3183574, 37.8694416], 356 | [-122.3183131, 37.8692714], 357 | [-122.318271, 37.8691095], 358 | [-122.3182181, 37.8689059], 359 | [-122.3181336, 37.8688307], 360 | [-122.3179977, 37.8687626], 361 | [-122.3177537, 37.8687499], 362 | [-122.3176222, 37.8687732], 363 | [-122.3172655, 37.8689299], 364 | [-122.317185, 37.8690146], 365 | [-122.3172551, 37.8692792], 366 | [-122.3172973, 37.8694387], 367 | [-122.3173448, 37.8696182], 368 | [-122.3174212, 37.8699064], 369 | [-122.3174645, 37.8700701] 370 | ] 371 | } 372 | }, { 373 | "type": "Feature", 374 | "properties": { 375 | "type": "node", 376 | "id": 4927326183, 377 | "timestamp": "2017-06-20T19:06:58Z", 378 | "user": "karitotp", 379 | "uid": 2748195, 380 | "version": 1 381 | }, 382 | "geometry": { 383 | "type": "Point", 384 | "coordinates": [-122.3184121, 37.8696521] 385 | } 386 | }] 387 | } -------------------------------------------------------------------------------- /tests/example_body.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 0.6, 3 | "generator": "Overpass API 0.7.56.9 76e5016d", 4 | "osm3s": { 5 | "timestamp_osm_base": "2021-03-10T23:06:58Z", 6 | "copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL." 7 | }, 8 | "elements": [ 9 | { 10 | "type": "relation", 11 | "id": 6518385, 12 | "bounds": { 13 | "minlat": 37.8377218, 14 | "minlon": -122.2185527, 15 | "maxlat": 37.8656538, 16 | "maxlon": -122.1703659 17 | }, 18 | "members": [ 19 | { 20 | "type": "way", 21 | "ref": 438213288, 22 | "role": "outer", 23 | "geometry": [ 24 | {"lat": 37.85778, "lon": -122.1978766}, 25 | {"lat": 37.8577917, "lon": -122.1940921}, 26 | {"lat": 37.8566651, "lon": -122.1949688}, 27 | {"lat": 37.8564558, "lon": -122.1945727}, 28 | {"lat": 37.8560627, "lon": -122.1938301}, 29 | {"lat": 37.8556011, "lon": -122.1926709}, 30 | {"lat": 37.854941, "lon": -122.191239}, 31 | {"lat": 37.8542022, "lon": -122.1902871}, 32 | {"lat": 37.853395, "lon": -122.1895098}, 33 | {"lat": 37.8531602, "lon": -122.1891555}, 34 | {"lat": 37.8520422, "lon": -122.1886194}, 35 | {"lat": 37.8504331, "lon": -122.1885866}, 36 | {"lat": 37.8468, "lon": -122.188458}, 37 | {"lat": 37.84685, "lon": -122.193004}, 38 | {"lat": 37.844092, "lon": -122.193102}, 39 | {"lat": 37.8437576, "lon": -122.1961671}, 40 | {"lat": 37.843891, "lon": -122.1964164}, 41 | {"lat": 37.8439802, "lon": -122.1965272}, 42 | {"lat": 37.8440628, "lon": -122.1965956}, 43 | {"lat": 37.8441586, "lon": -122.1966251}, 44 | {"lat": 37.8442751, "lon": -122.1966258}, 45 | {"lat": 37.8445996, "lon": -122.1965913}, 46 | {"lat": 37.8447847, "lon": -122.1965552}, 47 | {"lat": 37.8448595, "lon": -122.1965504}, 48 | {"lat": 37.8450989, "lon": -122.1965625}, 49 | {"lat": 37.8453362, "lon": -122.1965948}, 50 | {"lat": 37.8455965, "lon": -122.1967066}, 51 | {"lat": 37.845815, "lon": -122.1968499}, 52 | {"lat": 37.8462085, "lon": -122.1974365}, 53 | {"lat": 37.8465338, "lon": -122.1977626}, 54 | {"lat": 37.8468591, "lon": -122.1982004}, 55 | {"lat": 37.8472454, "lon": -122.1985094}, 56 | {"lat": 37.8473775, "lon": -122.1986861}, 57 | {"lat": 37.8474114, "lon": -122.198832}, 58 | {"lat": 37.847391, "lon": -122.1990294}, 59 | {"lat": 37.8473775, "lon": -122.1996732}, 60 | {"lat": 37.8475063, "lon": -122.2001882}, 61 | {"lat": 37.847587, "lon": -122.2006034}, 62 | {"lat": 37.8476259, "lon": -122.2008992}, 63 | {"lat": 37.8477655, "lon": -122.2012933}, 64 | {"lat": 37.8478469, "lon": -122.2014519}, 65 | {"lat": 37.8479064, "lon": -122.2015471}, 66 | {"lat": 37.847969, "lon": -122.2016145}, 67 | {"lat": 37.8480504, "lon": -122.2016621}, 68 | {"lat": 37.8481256, "lon": -122.2016859}, 69 | {"lat": 37.848254, "lon": -122.2017136}, 70 | {"lat": 37.8483291, "lon": -122.2017493}, 71 | {"lat": 37.8483917, "lon": -122.2017969}, 72 | {"lat": 37.8484544, "lon": -122.2018485}, 73 | {"lat": 37.8485107, "lon": -122.201904}, 74 | {"lat": 37.8485483, "lon": -122.2019516}, 75 | {"lat": 37.8491095, "lon": -122.2027841}, 76 | {"lat": 37.8491672, "lon": -122.2028479}, 77 | {"lat": 37.8492567, "lon": -122.2029216}, 78 | {"lat": 37.8493907, "lon": -122.2030081}, 79 | {"lat": 37.8495283, "lon": -122.2030698}, 80 | {"lat": 37.8498573, "lon": -122.2032926}, 81 | {"lat": 37.8496988, "lon": -122.2033125}, 82 | {"lat": 37.8494828, "lon": -122.2033608}, 83 | {"lat": 37.8492805, "lon": -122.2034252}, 84 | {"lat": 37.8491196, "lon": -122.2034761}, 85 | {"lat": 37.8489374, "lon": -122.203566}, 86 | {"lat": 37.8487876, "lon": -122.203649}, 87 | {"lat": 37.8486341, "lon": -122.2037751}, 88 | {"lat": 37.848741, "lon": -122.2038636}, 89 | {"lat": 37.8488215, "lon": -122.203814}, 90 | {"lat": 37.8488992, "lon": -122.2038394}, 91 | {"lat": 37.8489602, "lon": -122.203951}, 92 | {"lat": 37.8489873, "lon": -122.2040712}, 93 | {"lat": 37.8489805, "lon": -122.2044746}, 94 | {"lat": 37.8490126, "lon": -122.2046315}, 95 | {"lat": 37.8490036, "lon": -122.2046985}, 96 | {"lat": 37.8489724, "lon": -122.2047186}, 97 | {"lat": 37.848938, "lon": -122.204722}, 98 | {"lat": 37.8489147, "lon": -122.2047005}, 99 | {"lat": 37.8488788, "lon": -122.2046119}, 100 | {"lat": 37.8488252, "lon": -122.2045027}, 101 | {"lat": 37.8487548, "lon": -122.2044317}, 102 | {"lat": 37.8486446, "lon": -122.204427}, 103 | {"lat": 37.8483105, "lon": -122.2045329}, 104 | {"lat": 37.8480045, "lon": -122.2045604}, 105 | {"lat": 37.847916, "lon": -122.2045839}, 106 | {"lat": 37.8478694, "lon": -122.2046154}, 107 | {"lat": 37.8478486, "lon": -122.2046548}, 108 | {"lat": 37.8477778, "lon": -122.2047783}, 109 | {"lat": 37.8477005, "lon": -122.2048072}, 110 | {"lat": 37.8474485, "lon": -122.2048306}, 111 | {"lat": 37.8471107, "lon": -122.2049493}, 112 | {"lat": 37.8465123, "lon": -122.2053463}, 113 | {"lat": 37.8463874, "lon": -122.2053939}, 114 | {"lat": 37.846273, "lon": -122.20541}, 115 | {"lat": 37.8459415, "lon": -122.2053523}, 116 | {"lat": 37.8458573, "lon": -122.2053577}, 117 | {"lat": 37.8457393, "lon": -122.2054945}, 118 | {"lat": 37.8456498, "lon": -122.2056319}, 119 | {"lat": 37.8455809, "lon": -122.2056923}, 120 | {"lat": 37.8454544, "lon": -122.2057158}, 121 | {"lat": 37.8451859, "lon": -122.2057547}, 122 | {"lat": 37.8449476, "lon": -122.2058526}, 123 | {"lat": 37.8448258, "lon": -122.2059263}, 124 | {"lat": 37.844757, "lon": -122.2060135}, 125 | {"lat": 37.8446278, "lon": -122.2063179}, 126 | {"lat": 37.8445685, "lon": -122.2064078}, 127 | {"lat": 37.8445092, "lon": -122.2064319}, 128 | {"lat": 37.8443747, "lon": -122.206444}, 129 | {"lat": 37.8442939, "lon": -122.2064467}, 130 | {"lat": 37.8442361, "lon": -122.2064487}, 131 | {"lat": 37.844158, "lon": -122.2064279}, 132 | {"lat": 37.8441062, "lon": -122.2063753}, 133 | {"lat": 37.8440712, "lon": -122.2062871}, 134 | {"lat": 37.8440786, "lon": -122.206153}, 135 | {"lat": 37.8435708, "lon": -122.2061479}, 136 | {"lat": 37.8434835, "lon": -122.2066221}, 137 | {"lat": 37.850482, "lon": -122.2085964}, 138 | {"lat": 37.8509554, "lon": -122.208577}, 139 | {"lat": 37.8510147, "lon": -122.2085659}, 140 | {"lat": 37.851063, "lon": -122.2085409}, 141 | {"lat": 37.8511091, "lon": -122.208502}, 142 | {"lat": 37.8511574, "lon": -122.208438}, 143 | {"lat": 37.85169, "lon": -122.208486}, 144 | {"lat": 37.8519251, "lon": -122.2087702}, 145 | {"lat": 37.8525155, "lon": -122.2092691}, 146 | {"lat": 37.8541961, "lon": -122.2108847}, 147 | {"lat": 37.8550607, "lon": -122.2106232}, 148 | {"lat": 37.8555423, "lon": -122.2109766}, 149 | {"lat": 37.8563126, "lon": -122.2111627}, 150 | {"lat": 37.8566447, "lon": -122.2109229}, 151 | {"lat": 37.8567616, "lon": -122.2110964}, 152 | {"lat": 37.8569342, "lon": -122.2108496}, 153 | {"lat": 37.857108, "lon": -122.2110246}, 154 | {"lat": 37.856894, "lon": -122.2113068}, 155 | {"lat": 37.8571398, "lon": -122.2115058}, 156 | {"lat": 37.8578091, "lon": -122.2120475}, 157 | {"lat": 37.8582562, "lon": -122.2121374}, 158 | {"lat": 37.8582802, "lon": -122.2117485}, 159 | {"lat": 37.8590083, "lon": -122.2129171}, 160 | {"lat": 37.8589861, "lon": -122.2139028}, 161 | {"lat": 37.859233, "lon": -122.2141683}, 162 | {"lat": 37.8598506, "lon": -122.2148326}, 163 | {"lat": 37.8603942, "lon": -122.2154172}, 164 | {"lat": 37.8606581, "lon": -122.215701}, 165 | {"lat": 37.8605821, "lon": -122.2164333}, 166 | {"lat": 37.8606483, "lon": -122.2164811}, 167 | {"lat": 37.860723, "lon": -122.2165464}, 168 | {"lat": 37.8607835, "lon": -122.2166097}, 169 | {"lat": 37.8610403, "lon": -122.2169109}, 170 | {"lat": 37.8611974, "lon": -122.217074}, 171 | {"lat": 37.8612736, "lon": -122.2171367}, 172 | {"lat": 37.8613625, "lon": -122.2171975}, 173 | {"lat": 37.8614579, "lon": -122.2172431}, 174 | {"lat": 37.8615492, "lon": -122.2172742}, 175 | {"lat": 37.8617086, "lon": -122.2173159}, 176 | {"lat": 37.8618385, "lon": -122.2173716}, 177 | {"lat": 37.8622867, "lon": -122.2179208}, 178 | {"lat": 37.8623816, "lon": -122.2180495}, 179 | {"lat": 37.8629942, "lon": -122.2185527}, 180 | {"lat": 37.8632819, "lon": -122.2182672}, 181 | {"lat": 37.862143, "lon": -122.2170003}, 182 | {"lat": 37.8629807, "lon": -122.2163302}, 183 | {"lat": 37.8625301, "lon": -122.2153362}, 184 | {"lat": 37.8620134, "lon": -122.2144994}, 185 | {"lat": 37.8615221, "lon": -122.2137376}, 186 | {"lat": 37.8612002, "lon": -122.2129329}, 187 | {"lat": 37.86088, "lon": -122.2120602}, 188 | {"lat": 37.8608123, "lon": -122.2114995}, 189 | {"lat": 37.8607936, "lon": -122.2113451}, 190 | {"lat": 37.8606073, "lon": -122.2102615}, 191 | {"lat": 37.8602346, "lon": -122.2097572}, 192 | {"lat": 37.8596264, "lon": -122.2094531}, 193 | {"lat": 37.8597685, "lon": -122.2087851}, 194 | {"lat": 37.8599088, "lon": -122.2088504}, 195 | {"lat": 37.860063, "lon": -122.2089406}, 196 | {"lat": 37.8599809, "lon": -122.2081879}, 197 | {"lat": 37.8599349, "lon": -122.2077658}, 198 | {"lat": 37.8598958, "lon": -122.2074076}, 199 | {"lat": 37.8608912, "lon": -122.207248}, 200 | {"lat": 37.8612612, "lon": -122.2071887}, 201 | {"lat": 37.8614053, "lon": -122.2083939}, 202 | {"lat": 37.8614422, "lon": -122.2087028}, 203 | {"lat": 37.8614708, "lon": -122.2089418}, 204 | {"lat": 37.8614975, "lon": -122.2091415}, 205 | {"lat": 37.861616, "lon": -122.2091172}, 206 | {"lat": 37.8626858, "lon": -122.2089019}, 207 | {"lat": 37.8626311, "lon": -122.2066359}, 208 | {"lat": 37.8614459, "lon": -122.2066888}, 209 | {"lat": 37.8614543, "lon": -122.1980086}, 210 | {"lat": 37.85778, "lon": -122.1978766} 211 | ] 212 | }, 213 | { 214 | "type": "way", 215 | "ref": 438213289, 216 | "role": "outer", 217 | "geometry": [ 218 | {"lat": 37.8656538, "lon": -122.2145058}, 219 | {"lat": 37.865305, "lon": -122.2147394}, 220 | {"lat": 37.8648233, "lon": -122.215062}, 221 | {"lat": 37.8644428, "lon": -122.2153169}, 222 | {"lat": 37.8642579, "lon": -122.2154408}, 223 | {"lat": 37.8639551, "lon": -122.2156436}, 224 | {"lat": 37.8637413, "lon": -122.2157868}, 225 | {"lat": 37.8627856, "lon": -122.2137807}, 226 | {"lat": 37.8626659, "lon": -122.2135296}, 227 | {"lat": 37.8624686, "lon": -122.2131154}, 228 | {"lat": 37.8620879, "lon": -122.2119916}, 229 | {"lat": 37.8620058, "lon": -122.2117493}, 230 | {"lat": 37.8618225, "lon": -122.2110324}, 231 | {"lat": 37.8618545, "lon": -122.210984}, 232 | {"lat": 37.8618885, "lon": -122.2109324}, 233 | {"lat": 37.861994, "lon": -122.2107887}, 234 | {"lat": 37.862098, "lon": -122.2106566}, 235 | {"lat": 37.8622155, "lon": -122.2105186}, 236 | {"lat": 37.8623554, "lon": -122.2103687}, 237 | {"lat": 37.8625164, "lon": -122.2102208}, 238 | {"lat": 37.8626573, "lon": -122.2100963}, 239 | {"lat": 37.8628239, "lon": -122.2099821}, 240 | {"lat": 37.8629608, "lon": -122.2098842}, 241 | {"lat": 37.8631636, "lon": -122.2097741}, 242 | {"lat": 37.863344, "lon": -122.2097017}, 243 | {"lat": 37.8635452, "lon": -122.2096334}, 244 | {"lat": 37.8637617, "lon": -122.2095814}, 245 | {"lat": 37.8639646, "lon": -122.209559}, 246 | {"lat": 37.8641922, "lon": -122.2095565}, 247 | {"lat": 37.864413, "lon": -122.2095533}, 248 | {"lat": 37.8644502, "lon": -122.2098302}, 249 | {"lat": 37.8647984, "lon": -122.2100769}, 250 | {"lat": 37.864933, "lon": -122.2127232}, 251 | {"lat": 37.8650823, "lon": -122.2126318}, 252 | {"lat": 37.8656538, "lon": -122.2145058} 253 | ] 254 | }, 255 | { 256 | "type": "way", 257 | "ref": 665995492, 258 | "role": "outer", 259 | "geometry": [ 260 | {"lat": 37.846772, "lon": -122.1839334}, 261 | {"lat": 37.8467686, "lon": -122.1794846}, 262 | {"lat": 37.84959, "lon": -122.1794718}, 263 | {"lat": 37.8504828, "lon": -122.1794688}, 264 | {"lat": 37.8505078, "lon": -122.1748862}, 265 | {"lat": 37.846908, "lon": -122.1748969}, 266 | {"lat": 37.8469091, "lon": -122.1743812}, 267 | {"lat": 37.8467679, "lon": -122.1743737}, 268 | {"lat": 37.8457811, "lon": -122.174278}, 269 | {"lat": 37.8454312, "lon": -122.1742444}, 270 | {"lat": 37.8450505, "lon": -122.1742095}, 271 | {"lat": 37.844938, "lon": -122.1741976}, 272 | {"lat": 37.8449101, "lon": -122.1741972}, 273 | {"lat": 37.8448946, "lon": -122.1741978}, 274 | {"lat": 37.8440012, "lon": -122.1742394}, 275 | {"lat": 37.8437848, "lon": -122.1741477}, 276 | {"lat": 37.8433304, "lon": -122.1736671}, 277 | {"lat": 37.8426564, "lon": -122.1733589}, 278 | {"lat": 37.8421994, "lon": -122.1730593}, 279 | {"lat": 37.8421669, "lon": -122.1730392}, 280 | {"lat": 37.8418279, "lon": -122.1723633}, 281 | {"lat": 37.8415556, "lon": -122.1716704}, 282 | {"lat": 37.841024, "lon": -122.170393}, 283 | {"lat": 37.8398564, "lon": -122.1703659}, 284 | {"lat": 37.8398484, "lon": -122.1734159}, 285 | {"lat": 37.8398439, "lon": -122.1751359}, 286 | {"lat": 37.8377218, "lon": -122.1769565}, 287 | {"lat": 37.8381424, "lon": -122.1780377}, 288 | {"lat": 37.8378947, "lon": -122.1782177}, 289 | {"lat": 37.8379737, "lon": -122.1783984}, 290 | {"lat": 37.8381872, "lon": -122.1790152}, 291 | {"lat": 37.8382812, "lon": -122.1792459}, 292 | {"lat": 37.8383942, "lon": -122.1794585}, 293 | {"lat": 37.839474, "lon": -122.179526}, 294 | {"lat": 37.839502, "lon": -122.18098}, 295 | {"lat": 37.839917, "lon": -122.180953}, 296 | {"lat": 37.8399164, "lon": -122.1810388}, 297 | {"lat": 37.839908, "lon": -122.182271}, 298 | {"lat": 37.8397165, "lon": -122.1826336}, 299 | {"lat": 37.83957, "lon": -122.182912}, 300 | {"lat": 37.839595, "lon": -122.1839488}, 301 | {"lat": 37.8403406, "lon": -122.1839291}, 302 | {"lat": 37.841137, "lon": -122.1839345}, 303 | {"lat": 37.846772, "lon": -122.1839334} 304 | ] 305 | }, 306 | { 307 | "type": "way", 308 | "ref": 665995497, 309 | "role": "inner", 310 | "geometry": [ 311 | {"lat": 37.8505283, "lon": -122.1956256}, 312 | {"lat": 37.8506642, "lon": -122.1956223}, 313 | {"lat": 37.8506495, "lon": -122.1946645}, 314 | {"lat": 37.8505136, "lon": -122.1946679}, 315 | {"lat": 37.8505283, "lon": -122.1956256} 316 | ] 317 | }, 318 | { 319 | "type": "way", 320 | "ref": 665995496, 321 | "role": "inner", 322 | "geometry": [ 323 | {"lat": 37.8505074, "lon": -122.1936314}, 324 | {"lat": 37.8496821, "lon": -122.1936532}, 325 | {"lat": 37.8496551, "lon": -122.1920152}, 326 | {"lat": 37.8504796, "lon": -122.1919934}, 327 | {"lat": 37.8510314, "lon": -122.1919789}, 328 | {"lat": 37.8510476, "lon": -122.1929665}, 329 | {"lat": 37.8504967, "lon": -122.192981}, 330 | {"lat": 37.8505074, "lon": -122.1936314} 331 | ] 332 | }, 333 | { 334 | "type": "way", 335 | "ref": 763191639, 336 | "role": "inner", 337 | "geometry": [ 338 | {"lat": 37.8587752, "lon": -122.2096819}, 339 | {"lat": 37.858454, "lon": -122.2103175}, 340 | {"lat": 37.8580727, "lon": -122.2101056}, 341 | {"lat": 37.8581685, "lon": -122.209792}, 342 | {"lat": 37.8584741, "lon": -122.2094446}, 343 | {"lat": 37.8587752, "lon": -122.2096819} 344 | ] 345 | } 346 | ], 347 | "tags": { 348 | "boundary": "protected_area", 349 | "contact:website": "http://www.ebparks.org/parks/sibley", 350 | "name": "Sibley Volcanic Regional Preserve", 351 | "operator": "East Bay Regional Park District", 352 | "owner": "East Bay Regional Park District", 353 | "protect_class": "4", 354 | "source": "https://www.ebparks.org/images/Assets/files/parks/sibley/Sibley-map_2250w-04-23-18.gif", 355 | "type": "multipolygon", 356 | "website": "https://www.ebparks.org/parks/sibley/", 357 | "wikidata": "Q7349780", 358 | "wikipedia": "en:Robert Sibley Volcanic Regional Preserve" 359 | } 360 | }, 361 | { 362 | "type": "way", 363 | "id": 10322303, 364 | "bounds": { 365 | "minlat": 37.8687499, 366 | "minlon": -122.3184769, 367 | "maxlat": 37.8700701, 368 | "maxlon": -122.317185 369 | }, 370 | "nodes": [ 371 | 87340060, 372 | 4927326183, 373 | 4927326179, 374 | 4927326177, 375 | 4927326175, 376 | 87362432, 377 | 4927326184, 378 | 87362434, 379 | 813905690, 380 | 87362436, 381 | 87362437, 382 | 87362444, 383 | 4927326174, 384 | 4927326176, 385 | 4927326178, 386 | 4927326180, 387 | 87362452 388 | ], 389 | "geometry": [ 390 | {"lat": 37.8699011, "lon": -122.3184769}, 391 | {"lat": 37.8696521, "lon": -122.3184121}, 392 | {"lat": 37.8694416, "lon": -122.3183574}, 393 | {"lat": 37.8692714, "lon": -122.3183131}, 394 | {"lat": 37.8691095, "lon": -122.318271}, 395 | {"lat": 37.8689059, "lon": -122.3182181}, 396 | {"lat": 37.8688307, "lon": -122.3181336}, 397 | {"lat": 37.8687626, "lon": -122.3179977}, 398 | {"lat": 37.8687499, "lon": -122.3177537}, 399 | {"lat": 37.8687732, "lon": -122.3176222}, 400 | {"lat": 37.8689299, "lon": -122.3172655}, 401 | {"lat": 37.8690146, "lon": -122.317185}, 402 | {"lat": 37.8692792, "lon": -122.3172551}, 403 | {"lat": 37.8694387, "lon": -122.3172973}, 404 | {"lat": 37.8696182, "lon": -122.3173448}, 405 | {"lat": 37.8699064, "lon": -122.3174212}, 406 | {"lat": 37.8700701, "lon": -122.3174645} 407 | ], 408 | "tags": {"addr:city": "Berkeley", "foot": "yes", "highway": "service"} 409 | }, 410 | {"type": "node", "id": 4927326183, "lat": 37.8696521, "lon": -122.3184121} 411 | ] 412 | } 413 | -------------------------------------------------------------------------------- /tests/example_meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 0.6, 3 | "generator": "Overpass API 0.7.56.9 76e5016d", 4 | "osm3s": { 5 | "timestamp_osm_base": "2021-03-10T23:05:48Z", 6 | "copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL." 7 | }, 8 | "elements": [ 9 | { 10 | "type": "relation", 11 | "id": 6518385, 12 | "timestamp": "2021-02-17T03:29:31Z", 13 | "version": 14, 14 | "changeset": 99415479, 15 | "user": "Mstew354", 16 | "uid": 11988139, 17 | "bounds": { 18 | "minlat": 37.8377218, 19 | "minlon": -122.2185527, 20 | "maxlat": 37.8656538, 21 | "maxlon": -122.1703659 22 | }, 23 | "members": [ 24 | { 25 | "type": "way", 26 | "ref": 438213288, 27 | "role": "outer", 28 | "geometry": [ 29 | {"lat": 37.85778, "lon": -122.1978766}, 30 | {"lat": 37.8577917, "lon": -122.1940921}, 31 | {"lat": 37.8566651, "lon": -122.1949688}, 32 | {"lat": 37.8564558, "lon": -122.1945727}, 33 | {"lat": 37.8560627, "lon": -122.1938301}, 34 | {"lat": 37.8556011, "lon": -122.1926709}, 35 | {"lat": 37.854941, "lon": -122.191239}, 36 | {"lat": 37.8542022, "lon": -122.1902871}, 37 | {"lat": 37.853395, "lon": -122.1895098}, 38 | {"lat": 37.8531602, "lon": -122.1891555}, 39 | {"lat": 37.8520422, "lon": -122.1886194}, 40 | {"lat": 37.8504331, "lon": -122.1885866}, 41 | {"lat": 37.8468, "lon": -122.188458}, 42 | {"lat": 37.84685, "lon": -122.193004}, 43 | {"lat": 37.844092, "lon": -122.193102}, 44 | {"lat": 37.8437576, "lon": -122.1961671}, 45 | {"lat": 37.843891, "lon": -122.1964164}, 46 | {"lat": 37.8439802, "lon": -122.1965272}, 47 | {"lat": 37.8440628, "lon": -122.1965956}, 48 | {"lat": 37.8441586, "lon": -122.1966251}, 49 | {"lat": 37.8442751, "lon": -122.1966258}, 50 | {"lat": 37.8445996, "lon": -122.1965913}, 51 | {"lat": 37.8447847, "lon": -122.1965552}, 52 | {"lat": 37.8448595, "lon": -122.1965504}, 53 | {"lat": 37.8450989, "lon": -122.1965625}, 54 | {"lat": 37.8453362, "lon": -122.1965948}, 55 | {"lat": 37.8455965, "lon": -122.1967066}, 56 | {"lat": 37.845815, "lon": -122.1968499}, 57 | {"lat": 37.8462085, "lon": -122.1974365}, 58 | {"lat": 37.8465338, "lon": -122.1977626}, 59 | {"lat": 37.8468591, "lon": -122.1982004}, 60 | {"lat": 37.8472454, "lon": -122.1985094}, 61 | {"lat": 37.8473775, "lon": -122.1986861}, 62 | {"lat": 37.8474114, "lon": -122.198832}, 63 | {"lat": 37.847391, "lon": -122.1990294}, 64 | {"lat": 37.8473775, "lon": -122.1996732}, 65 | {"lat": 37.8475063, "lon": -122.2001882}, 66 | {"lat": 37.847587, "lon": -122.2006034}, 67 | {"lat": 37.8476259, "lon": -122.2008992}, 68 | {"lat": 37.8477655, "lon": -122.2012933}, 69 | {"lat": 37.8478469, "lon": -122.2014519}, 70 | {"lat": 37.8479064, "lon": -122.2015471}, 71 | {"lat": 37.847969, "lon": -122.2016145}, 72 | {"lat": 37.8480504, "lon": -122.2016621}, 73 | {"lat": 37.8481256, "lon": -122.2016859}, 74 | {"lat": 37.848254, "lon": -122.2017136}, 75 | {"lat": 37.8483291, "lon": -122.2017493}, 76 | {"lat": 37.8483917, "lon": -122.2017969}, 77 | {"lat": 37.8484544, "lon": -122.2018485}, 78 | {"lat": 37.8485107, "lon": -122.201904}, 79 | {"lat": 37.8485483, "lon": -122.2019516}, 80 | {"lat": 37.8491095, "lon": -122.2027841}, 81 | {"lat": 37.8491672, "lon": -122.2028479}, 82 | {"lat": 37.8492567, "lon": -122.2029216}, 83 | {"lat": 37.8493907, "lon": -122.2030081}, 84 | {"lat": 37.8495283, "lon": -122.2030698}, 85 | {"lat": 37.8498573, "lon": -122.2032926}, 86 | {"lat": 37.8496988, "lon": -122.2033125}, 87 | {"lat": 37.8494828, "lon": -122.2033608}, 88 | {"lat": 37.8492805, "lon": -122.2034252}, 89 | {"lat": 37.8491196, "lon": -122.2034761}, 90 | {"lat": 37.8489374, "lon": -122.203566}, 91 | {"lat": 37.8487876, "lon": -122.203649}, 92 | {"lat": 37.8486341, "lon": -122.2037751}, 93 | {"lat": 37.848741, "lon": -122.2038636}, 94 | {"lat": 37.8488215, "lon": -122.203814}, 95 | {"lat": 37.8488992, "lon": -122.2038394}, 96 | {"lat": 37.8489602, "lon": -122.203951}, 97 | {"lat": 37.8489873, "lon": -122.2040712}, 98 | {"lat": 37.8489805, "lon": -122.2044746}, 99 | {"lat": 37.8490126, "lon": -122.2046315}, 100 | {"lat": 37.8490036, "lon": -122.2046985}, 101 | {"lat": 37.8489724, "lon": -122.2047186}, 102 | {"lat": 37.848938, "lon": -122.204722}, 103 | {"lat": 37.8489147, "lon": -122.2047005}, 104 | {"lat": 37.8488788, "lon": -122.2046119}, 105 | {"lat": 37.8488252, "lon": -122.2045027}, 106 | {"lat": 37.8487548, "lon": -122.2044317}, 107 | {"lat": 37.8486446, "lon": -122.204427}, 108 | {"lat": 37.8483105, "lon": -122.2045329}, 109 | {"lat": 37.8480045, "lon": -122.2045604}, 110 | {"lat": 37.847916, "lon": -122.2045839}, 111 | {"lat": 37.8478694, "lon": -122.2046154}, 112 | {"lat": 37.8478486, "lon": -122.2046548}, 113 | {"lat": 37.8477778, "lon": -122.2047783}, 114 | {"lat": 37.8477005, "lon": -122.2048072}, 115 | {"lat": 37.8474485, "lon": -122.2048306}, 116 | {"lat": 37.8471107, "lon": -122.2049493}, 117 | {"lat": 37.8465123, "lon": -122.2053463}, 118 | {"lat": 37.8463874, "lon": -122.2053939}, 119 | {"lat": 37.846273, "lon": -122.20541}, 120 | {"lat": 37.8459415, "lon": -122.2053523}, 121 | {"lat": 37.8458573, "lon": -122.2053577}, 122 | {"lat": 37.8457393, "lon": -122.2054945}, 123 | {"lat": 37.8456498, "lon": -122.2056319}, 124 | {"lat": 37.8455809, "lon": -122.2056923}, 125 | {"lat": 37.8454544, "lon": -122.2057158}, 126 | {"lat": 37.8451859, "lon": -122.2057547}, 127 | {"lat": 37.8449476, "lon": -122.2058526}, 128 | {"lat": 37.8448258, "lon": -122.2059263}, 129 | {"lat": 37.844757, "lon": -122.2060135}, 130 | {"lat": 37.8446278, "lon": -122.2063179}, 131 | {"lat": 37.8445685, "lon": -122.2064078}, 132 | {"lat": 37.8445092, "lon": -122.2064319}, 133 | {"lat": 37.8443747, "lon": -122.206444}, 134 | {"lat": 37.8442939, "lon": -122.2064467}, 135 | {"lat": 37.8442361, "lon": -122.2064487}, 136 | {"lat": 37.844158, "lon": -122.2064279}, 137 | {"lat": 37.8441062, "lon": -122.2063753}, 138 | {"lat": 37.8440712, "lon": -122.2062871}, 139 | {"lat": 37.8440786, "lon": -122.206153}, 140 | {"lat": 37.8435708, "lon": -122.2061479}, 141 | {"lat": 37.8434835, "lon": -122.2066221}, 142 | {"lat": 37.850482, "lon": -122.2085964}, 143 | {"lat": 37.8509554, "lon": -122.208577}, 144 | {"lat": 37.8510147, "lon": -122.2085659}, 145 | {"lat": 37.851063, "lon": -122.2085409}, 146 | {"lat": 37.8511091, "lon": -122.208502}, 147 | {"lat": 37.8511574, "lon": -122.208438}, 148 | {"lat": 37.85169, "lon": -122.208486}, 149 | {"lat": 37.8519251, "lon": -122.2087702}, 150 | {"lat": 37.8525155, "lon": -122.2092691}, 151 | {"lat": 37.8541961, "lon": -122.2108847}, 152 | {"lat": 37.8550607, "lon": -122.2106232}, 153 | {"lat": 37.8555423, "lon": -122.2109766}, 154 | {"lat": 37.8563126, "lon": -122.2111627}, 155 | {"lat": 37.8566447, "lon": -122.2109229}, 156 | {"lat": 37.8567616, "lon": -122.2110964}, 157 | {"lat": 37.8569342, "lon": -122.2108496}, 158 | {"lat": 37.857108, "lon": -122.2110246}, 159 | {"lat": 37.856894, "lon": -122.2113068}, 160 | {"lat": 37.8571398, "lon": -122.2115058}, 161 | {"lat": 37.8578091, "lon": -122.2120475}, 162 | {"lat": 37.8582562, "lon": -122.2121374}, 163 | {"lat": 37.8582802, "lon": -122.2117485}, 164 | {"lat": 37.8590083, "lon": -122.2129171}, 165 | {"lat": 37.8589861, "lon": -122.2139028}, 166 | {"lat": 37.859233, "lon": -122.2141683}, 167 | {"lat": 37.8598506, "lon": -122.2148326}, 168 | {"lat": 37.8603942, "lon": -122.2154172}, 169 | {"lat": 37.8606581, "lon": -122.215701}, 170 | {"lat": 37.8605821, "lon": -122.2164333}, 171 | {"lat": 37.8606483, "lon": -122.2164811}, 172 | {"lat": 37.860723, "lon": -122.2165464}, 173 | {"lat": 37.8607835, "lon": -122.2166097}, 174 | {"lat": 37.8610403, "lon": -122.2169109}, 175 | {"lat": 37.8611974, "lon": -122.217074}, 176 | {"lat": 37.8612736, "lon": -122.2171367}, 177 | {"lat": 37.8613625, "lon": -122.2171975}, 178 | {"lat": 37.8614579, "lon": -122.2172431}, 179 | {"lat": 37.8615492, "lon": -122.2172742}, 180 | {"lat": 37.8617086, "lon": -122.2173159}, 181 | {"lat": 37.8618385, "lon": -122.2173716}, 182 | {"lat": 37.8622867, "lon": -122.2179208}, 183 | {"lat": 37.8623816, "lon": -122.2180495}, 184 | {"lat": 37.8629942, "lon": -122.2185527}, 185 | {"lat": 37.8632819, "lon": -122.2182672}, 186 | {"lat": 37.862143, "lon": -122.2170003}, 187 | {"lat": 37.8629807, "lon": -122.2163302}, 188 | {"lat": 37.8625301, "lon": -122.2153362}, 189 | {"lat": 37.8620134, "lon": -122.2144994}, 190 | {"lat": 37.8615221, "lon": -122.2137376}, 191 | {"lat": 37.8612002, "lon": -122.2129329}, 192 | {"lat": 37.86088, "lon": -122.2120602}, 193 | {"lat": 37.8608123, "lon": -122.2114995}, 194 | {"lat": 37.8607936, "lon": -122.2113451}, 195 | {"lat": 37.8606073, "lon": -122.2102615}, 196 | {"lat": 37.8602346, "lon": -122.2097572}, 197 | {"lat": 37.8596264, "lon": -122.2094531}, 198 | {"lat": 37.8597685, "lon": -122.2087851}, 199 | {"lat": 37.8599088, "lon": -122.2088504}, 200 | {"lat": 37.860063, "lon": -122.2089406}, 201 | {"lat": 37.8599809, "lon": -122.2081879}, 202 | {"lat": 37.8599349, "lon": -122.2077658}, 203 | {"lat": 37.8598958, "lon": -122.2074076}, 204 | {"lat": 37.8608912, "lon": -122.207248}, 205 | {"lat": 37.8612612, "lon": -122.2071887}, 206 | {"lat": 37.8614053, "lon": -122.2083939}, 207 | {"lat": 37.8614422, "lon": -122.2087028}, 208 | {"lat": 37.8614708, "lon": -122.2089418}, 209 | {"lat": 37.8614975, "lon": -122.2091415}, 210 | {"lat": 37.861616, "lon": -122.2091172}, 211 | {"lat": 37.8626858, "lon": -122.2089019}, 212 | {"lat": 37.8626311, "lon": -122.2066359}, 213 | {"lat": 37.8614459, "lon": -122.2066888}, 214 | {"lat": 37.8614543, "lon": -122.1980086}, 215 | {"lat": 37.85778, "lon": -122.1978766} 216 | ] 217 | }, 218 | { 219 | "type": "way", 220 | "ref": 438213289, 221 | "role": "outer", 222 | "geometry": [ 223 | {"lat": 37.8656538, "lon": -122.2145058}, 224 | {"lat": 37.865305, "lon": -122.2147394}, 225 | {"lat": 37.8648233, "lon": -122.215062}, 226 | {"lat": 37.8644428, "lon": -122.2153169}, 227 | {"lat": 37.8642579, "lon": -122.2154408}, 228 | {"lat": 37.8639551, "lon": -122.2156436}, 229 | {"lat": 37.8637413, "lon": -122.2157868}, 230 | {"lat": 37.8627856, "lon": -122.2137807}, 231 | {"lat": 37.8626659, "lon": -122.2135296}, 232 | {"lat": 37.8624686, "lon": -122.2131154}, 233 | {"lat": 37.8620879, "lon": -122.2119916}, 234 | {"lat": 37.8620058, "lon": -122.2117493}, 235 | {"lat": 37.8618225, "lon": -122.2110324}, 236 | {"lat": 37.8618545, "lon": -122.210984}, 237 | {"lat": 37.8618885, "lon": -122.2109324}, 238 | {"lat": 37.861994, "lon": -122.2107887}, 239 | {"lat": 37.862098, "lon": -122.2106566}, 240 | {"lat": 37.8622155, "lon": -122.2105186}, 241 | {"lat": 37.8623554, "lon": -122.2103687}, 242 | {"lat": 37.8625164, "lon": -122.2102208}, 243 | {"lat": 37.8626573, "lon": -122.2100963}, 244 | {"lat": 37.8628239, "lon": -122.2099821}, 245 | {"lat": 37.8629608, "lon": -122.2098842}, 246 | {"lat": 37.8631636, "lon": -122.2097741}, 247 | {"lat": 37.863344, "lon": -122.2097017}, 248 | {"lat": 37.8635452, "lon": -122.2096334}, 249 | {"lat": 37.8637617, "lon": -122.2095814}, 250 | {"lat": 37.8639646, "lon": -122.209559}, 251 | {"lat": 37.8641922, "lon": -122.2095565}, 252 | {"lat": 37.864413, "lon": -122.2095533}, 253 | {"lat": 37.8644502, "lon": -122.2098302}, 254 | {"lat": 37.8647984, "lon": -122.2100769}, 255 | {"lat": 37.864933, "lon": -122.2127232}, 256 | {"lat": 37.8650823, "lon": -122.2126318}, 257 | {"lat": 37.8656538, "lon": -122.2145058} 258 | ] 259 | }, 260 | { 261 | "type": "way", 262 | "ref": 665995492, 263 | "role": "outer", 264 | "geometry": [ 265 | {"lat": 37.846772, "lon": -122.1839334}, 266 | {"lat": 37.8467686, "lon": -122.1794846}, 267 | {"lat": 37.84959, "lon": -122.1794718}, 268 | {"lat": 37.8504828, "lon": -122.1794688}, 269 | {"lat": 37.8505078, "lon": -122.1748862}, 270 | {"lat": 37.846908, "lon": -122.1748969}, 271 | {"lat": 37.8469091, "lon": -122.1743812}, 272 | {"lat": 37.8467679, "lon": -122.1743737}, 273 | {"lat": 37.8457811, "lon": -122.174278}, 274 | {"lat": 37.8454312, "lon": -122.1742444}, 275 | {"lat": 37.8450505, "lon": -122.1742095}, 276 | {"lat": 37.844938, "lon": -122.1741976}, 277 | {"lat": 37.8449101, "lon": -122.1741972}, 278 | {"lat": 37.8448946, "lon": -122.1741978}, 279 | {"lat": 37.8440012, "lon": -122.1742394}, 280 | {"lat": 37.8437848, "lon": -122.1741477}, 281 | {"lat": 37.8433304, "lon": -122.1736671}, 282 | {"lat": 37.8426564, "lon": -122.1733589}, 283 | {"lat": 37.8421994, "lon": -122.1730593}, 284 | {"lat": 37.8421669, "lon": -122.1730392}, 285 | {"lat": 37.8418279, "lon": -122.1723633}, 286 | {"lat": 37.8415556, "lon": -122.1716704}, 287 | {"lat": 37.841024, "lon": -122.170393}, 288 | {"lat": 37.8398564, "lon": -122.1703659}, 289 | {"lat": 37.8398484, "lon": -122.1734159}, 290 | {"lat": 37.8398439, "lon": -122.1751359}, 291 | {"lat": 37.8377218, "lon": -122.1769565}, 292 | {"lat": 37.8381424, "lon": -122.1780377}, 293 | {"lat": 37.8378947, "lon": -122.1782177}, 294 | {"lat": 37.8379737, "lon": -122.1783984}, 295 | {"lat": 37.8381872, "lon": -122.1790152}, 296 | {"lat": 37.8382812, "lon": -122.1792459}, 297 | {"lat": 37.8383942, "lon": -122.1794585}, 298 | {"lat": 37.839474, "lon": -122.179526}, 299 | {"lat": 37.839502, "lon": -122.18098}, 300 | {"lat": 37.839917, "lon": -122.180953}, 301 | {"lat": 37.8399164, "lon": -122.1810388}, 302 | {"lat": 37.839908, "lon": -122.182271}, 303 | {"lat": 37.8397165, "lon": -122.1826336}, 304 | {"lat": 37.83957, "lon": -122.182912}, 305 | {"lat": 37.839595, "lon": -122.1839488}, 306 | {"lat": 37.8403406, "lon": -122.1839291}, 307 | {"lat": 37.841137, "lon": -122.1839345}, 308 | {"lat": 37.846772, "lon": -122.1839334} 309 | ] 310 | }, 311 | { 312 | "type": "way", 313 | "ref": 665995497, 314 | "role": "inner", 315 | "geometry": [ 316 | {"lat": 37.8505283, "lon": -122.1956256}, 317 | {"lat": 37.8506642, "lon": -122.1956223}, 318 | {"lat": 37.8506495, "lon": -122.1946645}, 319 | {"lat": 37.8505136, "lon": -122.1946679}, 320 | {"lat": 37.8505283, "lon": -122.1956256} 321 | ] 322 | }, 323 | { 324 | "type": "way", 325 | "ref": 665995496, 326 | "role": "inner", 327 | "geometry": [ 328 | {"lat": 37.8505074, "lon": -122.1936314}, 329 | {"lat": 37.8496821, "lon": -122.1936532}, 330 | {"lat": 37.8496551, "lon": -122.1920152}, 331 | {"lat": 37.8504796, "lon": -122.1919934}, 332 | {"lat": 37.8510314, "lon": -122.1919789}, 333 | {"lat": 37.8510476, "lon": -122.1929665}, 334 | {"lat": 37.8504967, "lon": -122.192981}, 335 | {"lat": 37.8505074, "lon": -122.1936314} 336 | ] 337 | }, 338 | { 339 | "type": "way", 340 | "ref": 763191639, 341 | "role": "inner", 342 | "geometry": [ 343 | {"lat": 37.8587752, "lon": -122.2096819}, 344 | {"lat": 37.858454, "lon": -122.2103175}, 345 | {"lat": 37.8580727, "lon": -122.2101056}, 346 | {"lat": 37.8581685, "lon": -122.209792}, 347 | {"lat": 37.8584741, "lon": -122.2094446}, 348 | {"lat": 37.8587752, "lon": -122.2096819} 349 | ] 350 | } 351 | ], 352 | "tags": { 353 | "boundary": "protected_area", 354 | "contact:website": "http://www.ebparks.org/parks/sibley", 355 | "name": "Sibley Volcanic Regional Preserve", 356 | "operator": "East Bay Regional Park District", 357 | "owner": "East Bay Regional Park District", 358 | "protect_class": "4", 359 | "source": "https://www.ebparks.org/images/Assets/files/parks/sibley/Sibley-map_2250w-04-23-18.gif", 360 | "type": "multipolygon", 361 | "website": "https://www.ebparks.org/parks/sibley/", 362 | "wikidata": "Q7349780", 363 | "wikipedia": "en:Robert Sibley Volcanic Regional Preserve" 364 | } 365 | }, 366 | { 367 | "type": "way", 368 | "id": 10322303, 369 | "timestamp": "2017-06-20T19:07:01Z", 370 | "version": 5, 371 | "changeset": 49702282, 372 | "user": "karitotp", 373 | "uid": 2748195, 374 | "bounds": { 375 | "minlat": 37.8687499, 376 | "minlon": -122.3184769, 377 | "maxlat": 37.8700701, 378 | "maxlon": -122.317185 379 | }, 380 | "nodes": [ 381 | 87340060, 382 | 4927326183, 383 | 4927326179, 384 | 4927326177, 385 | 4927326175, 386 | 87362432, 387 | 4927326184, 388 | 87362434, 389 | 813905690, 390 | 87362436, 391 | 87362437, 392 | 87362444, 393 | 4927326174, 394 | 4927326176, 395 | 4927326178, 396 | 4927326180, 397 | 87362452 398 | ], 399 | "geometry": [ 400 | {"lat": 37.8699011, "lon": -122.3184769}, 401 | {"lat": 37.8696521, "lon": -122.3184121}, 402 | {"lat": 37.8694416, "lon": -122.3183574}, 403 | {"lat": 37.8692714, "lon": -122.3183131}, 404 | {"lat": 37.8691095, "lon": -122.318271}, 405 | {"lat": 37.8689059, "lon": -122.3182181}, 406 | {"lat": 37.8688307, "lon": -122.3181336}, 407 | {"lat": 37.8687626, "lon": -122.3179977}, 408 | {"lat": 37.8687499, "lon": -122.3177537}, 409 | {"lat": 37.8687732, "lon": -122.3176222}, 410 | {"lat": 37.8689299, "lon": -122.3172655}, 411 | {"lat": 37.8690146, "lon": -122.317185}, 412 | {"lat": 37.8692792, "lon": -122.3172551}, 413 | {"lat": 37.8694387, "lon": -122.3172973}, 414 | {"lat": 37.8696182, "lon": -122.3173448}, 415 | {"lat": 37.8699064, "lon": -122.3174212}, 416 | {"lat": 37.8700701, "lon": -122.3174645} 417 | ], 418 | "tags": {"addr:city": "Berkeley", "foot": "yes", "highway": "service"} 419 | }, 420 | { 421 | "type": "node", 422 | "id": 4927326183, 423 | "lat": 37.8696521, 424 | "lon": -122.3184121, 425 | "timestamp": "2017-06-20T19:06:58Z", 426 | "version": 1, 427 | "changeset": 49702282, 428 | "user": "karitotp", 429 | "uid": 2748195 430 | } 431 | ] 432 | } 433 | -------------------------------------------------------------------------------- /tests/example_singlenode.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 0.6, 3 | "generator": "Overpass API 0.7.58.5 b0c4acbb", 4 | "osm3s": { 5 | "timestamp_osm_base": "2022-07-26T00:41:24Z", 6 | "timestamp_areas_base": "2022-07-20T10:48:09Z", 7 | "copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL." 8 | }, 9 | "elements": [ 10 | { 11 | "type": "node", 12 | "id": 830609255, 13 | "lat": -15.7526149, 14 | "lon": -47.8900512, 15 | "tags": { 16 | "amenity": "cafe", 17 | "name": "Caf\u00e9 Sincera", 18 | "smoking": "no" 19 | } 20 | }, 21 | { 22 | "type": "node", 23 | "id": 1532856975, 24 | "lat": -15.7600089, 25 | "lon": -47.8791123, 26 | "tags": { 27 | "addr:street": "CLN 408", 28 | "amenity": "cafe", 29 | "name": "Senhoritas" 30 | } 31 | }, 32 | { 33 | "type": "node", 34 | "id": 2691239509, 35 | "lat": -15.8268, 36 | "lon": -47.90628, 37 | "tags": { 38 | "addr:place": "Asa Sul", 39 | "addr:street": "Cls 410", 40 | "amenity": "cafe", 41 | "cuisine": "pizza", 42 | "name": "Gentil" 43 | } 44 | }, 45 | { 46 | "type": "node", 47 | "id": 3051977281, 48 | "lat": -15.7567262, 49 | "lon": -47.8913837, 50 | "tags": { 51 | "amenity": "cafe", 52 | "internet_access": "no", 53 | "name": "Amor \u00e0 Torta", 54 | "opening_hours": "Mo-Fr 07:30-19:30; Sa 08:00-18:00", 55 | "wheelchair": "yes" 56 | } 57 | }, 58 | { 59 | "type": "node", 60 | "id": 3089963930, 61 | "lat": -15.786985, 62 | "lon": -47.886423, 63 | "tags": { "amenity": "cafe", "name": "Cafezinho Express" } 64 | }, 65 | { 66 | "type": "node", 67 | "id": 3093838425, 68 | "lat": -15.7770943, 69 | "lon": -47.878313, 70 | "tags": { 71 | "addr:street": "CLN 204", 72 | "amenity": "cafe", 73 | "name": "Candy House", 74 | "wheelchair": "yes" 75 | } 76 | }, 77 | { 78 | "type": "node", 79 | "id": 3093842234, 80 | "lat": -15.7575012, 81 | "lon": -47.8825355, 82 | "tags": { 83 | "amenity": "cafe", 84 | "brand": "Fran's Caf\u00e9", 85 | "brand:wikidata": "Q62075645", 86 | "cuisine": "coffee_shop", 87 | "internet_access": "wlan", 88 | "internet_access:fee": "no", 89 | "name": "Fran's Caf\u00e9", 90 | "opening_hours": "24/7", 91 | "takeaway": "yes" 92 | } 93 | }, 94 | { 95 | "type": "node", 96 | "id": 3095008557, 97 | "lat": -15.7665684, 98 | "lon": -47.8779077, 99 | "tags": { "addr:street": "CLN 406", "amenity": "cafe", "name": "Sebinho" } 100 | }, 101 | { 102 | "type": "node", 103 | "id": 3139274344, 104 | "lat": -15.8145074, 105 | "lon": -47.8388265, 106 | "tags": { "amenity": "cafe" } 107 | }, 108 | { 109 | "type": "node", 110 | "id": 3161293041, 111 | "lat": -15.7749509, 112 | "lon": -47.8908733, 113 | "tags": { "amenity": "cafe", "name": "Caf\u00e9 Cobog\u00f3" } 114 | }, 115 | { 116 | "type": "node", 117 | "id": 3190786485, 118 | "lat": -15.7461875, 119 | "lon": -47.892084, 120 | "tags": { "amenity": "cafe", "name": "Moebius Caf\u00e9" } 121 | }, 122 | { 123 | "type": "node", 124 | "id": 3192140335, 125 | "lat": -15.7661003, 126 | "lon": -47.877285, 127 | "tags": { 128 | "addr:street": "CLN 407", 129 | "amenity": "cafe", 130 | "name": "Cafezinho" 131 | } 132 | }, 133 | { 134 | "type": "node", 135 | "id": 3200216679, 136 | "lat": -15.7470931, 137 | "lon": -47.8836644, 138 | "tags": { 139 | "addr:street": "CLN 413", 140 | "amenity": "cafe", 141 | "internet_access": "wlan", 142 | "level": "0", 143 | "name": "Clandestino", 144 | "opening_hours": "Mo 09:00-21:00; We-Sa 09:00-21:00; Su 09:00-15:00", 145 | "outdoor_seating": "yes", 146 | "smoking": "no", 147 | "website": "http://www.cafeclandestino.com.br" 148 | } 149 | }, 150 | { 151 | "type": "node", 152 | "id": 3211680213, 153 | "lat": -15.74597, 154 | "lon": -47.8913941, 155 | "tags": { "amenity": "cafe", "name": "Genaro - jazz burger caf\u00e9" } 156 | }, 157 | { 158 | "type": "node", 159 | "id": 3222516874, 160 | "lat": -15.7806286, 161 | "lon": -47.8860998, 162 | "tags": { 163 | "addr:place": "CLN 303", 164 | "amenity": "cafe", 165 | "internet_access": "wlan", 166 | "internet_access:fee": "no", 167 | "name": "Caramella", 168 | "opening_hours": "Mo-Su 07:30-21:00", 169 | "smoking": "no", 170 | "website": "http://www.caramellaconfeitaria.com.br/", 171 | "wheelchair": "yes" 172 | } 173 | }, 174 | { 175 | "type": "node", 176 | "id": 3222516875, 177 | "lat": -15.7805371, 178 | "lon": -47.8847823, 179 | "tags": { 180 | "addr:place": "CLN 303", 181 | "amenity": "cafe", 182 | "internet_access": "wlan", 183 | "name": "Martinica Caf\u00e9", 184 | "opening_hours": "Mo-Fr 11:00-01:00; Sa 17:00-01:00; Su 18:00-01:00", 185 | "phone": "+55 61 33262357" 186 | } 187 | }, 188 | { 189 | "type": "node", 190 | "id": 3223614838, 191 | "lat": -15.7451711, 192 | "lon": -47.8870925, 193 | "tags": { "amenity": "cafe", "name": "Torteria di Lorenza" } 194 | }, 195 | { 196 | "type": "node", 197 | "id": 3230418026, 198 | "lat": -15.7832184, 199 | "lon": -47.8829046, 200 | "tags": { 201 | "addr:city": "Bras\u00edlia", 202 | "addr:housenumber": "Loja 56", 203 | "addr:postcode": "70722-520", 204 | "addr:street": "CLN 102 Bloco B", 205 | "addr:suburb": "Asa Norte", 206 | "amenity": "cafe", 207 | "internet_access": "wlan", 208 | "name": "Objeto Encontrado", 209 | "opening_hours": "Mo-Sa 12:00-23:00", 210 | "phone": "+55 61 3081-8383", 211 | "smoking": "no", 212 | "website": "https://www.objetoencontrado.com.br/" 213 | } 214 | }, 215 | { 216 | "type": "node", 217 | "id": 3231952883, 218 | "lat": -15.7770016, 219 | "lon": -47.8827129, 220 | "tags": { 221 | "amenity": "cafe", 222 | "cuisine": "french", 223 | "name": "Daniel Briand", 224 | "opening_hours": "Tu-Fr 09:00-22:00; Sa 09:30-22:00; Su 08:00-22:00", 225 | "phone": "+55 61 33261135", 226 | "website": "https://www.cafedanielbriand.com/" 227 | } 228 | }, 229 | { 230 | "type": "node", 231 | "id": 3324092861, 232 | "lat": -15.756386, 233 | "lon": -47.8903219, 234 | "tags": { 235 | "amenity": "cafe", 236 | "internet_access": "wlan", 237 | "name": "D'Vilella", 238 | "wheelchair": "yes" 239 | } 240 | }, 241 | { 242 | "type": "node", 243 | "id": 3334254945, 244 | "lat": -15.7454249, 245 | "lon": -47.8874166, 246 | "tags": { 247 | "amenity": "cafe", 248 | "diet:vegan": "only", 249 | "name": "Canelle Confeitaria", 250 | "opening_hours": "Tu-Sa 10:00-22:00;Su 12:00-20:00", 251 | "phone": "+55 61 30372422" 252 | } 253 | }, 254 | { 255 | "type": "node", 256 | "id": 3334254946, 257 | "lat": -15.7403494, 258 | "lon": -47.8929929, 259 | "tags": { 260 | "amenity": "cafe", 261 | "name": "Florisa Caf\u00e9", 262 | "opening_hours": "Mo-Sa 08:00-21:00", 263 | "phone": "+55 61 32028882" 264 | } 265 | }, 266 | { 267 | "type": "node", 268 | "id": 3358345330, 269 | "lat": -15.7833159, 270 | "lon": -47.8785943, 271 | "tags": { 272 | "addr:city": "Brasilia", 273 | "addr:street": "CLN 202 Bloco A", 274 | "addr:suburb": "Asa Norte", 275 | "amenity": "cafe", 276 | "internet_access": "wlan", 277 | "name": "Caf\u00e9 Cristina Colina da Pedra", 278 | "opening_hours": "Su 12:00-19:00; Mo-Sa 08:00-19:00" 279 | } 280 | }, 281 | { 282 | "type": "node", 283 | "id": 3362305606, 284 | "lat": -15.7804074, 285 | "lon": -47.8851897, 286 | "tags": { 287 | "amenity": "cafe", 288 | "diet:gluten_free": "yes", 289 | "diet:vegan": "yes", 290 | "name": "Bioon Caf\u00e9" 291 | } 292 | }, 293 | { 294 | "type": "node", 295 | "id": 3362308337, 296 | "lat": -15.7809705, 297 | "lon": -47.8862323, 298 | "tags": { 299 | "amenity": "cafe", 300 | "cuisine": "arab", 301 | "name": "Caf\u00e9 com Caf\u00e9" 302 | } 303 | }, 304 | { 305 | "type": "node", 306 | "id": 3364780124, 307 | "lat": -15.8278397, 308 | "lon": -47.9225416, 309 | "tags": { "amenity": "cafe", "name": "Dylan Cafe Bakery" } 310 | }, 311 | { 312 | "type": "node", 313 | "id": 3451223465, 314 | "lat": -15.7530174, 315 | "lon": -47.889783, 316 | "tags": { 317 | "addr:street": "CLN 111", 318 | "amenity": "cafe", 319 | "cuisine": "coffee_shop", 320 | "internet_access": "yes", 321 | "internet_access:fee": "no", 322 | "name": "Concreto Coffee Crew", 323 | "opening_hours": "Mo-Sa 13:00-20:00", 324 | "outdoor_seating": "yes", 325 | "website": "https://www.instagram.com/concretocoffee/" 326 | } 327 | }, 328 | { 329 | "type": "node", 330 | "id": 3451247095, 331 | "lat": -15.75974, 332 | "lon": -47.8805597, 333 | "tags": { "amenity": "cafe", "name": "Vincent Ch\u00e1s e Caf\u00e9s" } 334 | }, 335 | { 336 | "type": "node", 337 | "id": 3525964203, 338 | "lat": -15.7649188, 339 | "lon": -47.8701905, 340 | "tags": { 341 | "amenity": "cafe", 342 | "name": "Caf\u00e9 das Letras", 343 | "wheelchair": "yes" 344 | } 345 | }, 346 | { 347 | "type": "node", 348 | "id": 3634570440, 349 | "lat": -15.8044722, 350 | "lon": -47.8852709, 351 | "tags": { "amenity": "cafe", "name": "Rappot" } 352 | }, 353 | { 354 | "type": "node", 355 | "id": 3634570442, 356 | "lat": -15.80452, 357 | "lon": -47.8851878, 358 | "tags": { "amenity": "cafe", "name": "Caf\u00e9 do Ponto" } 359 | }, 360 | { 361 | "type": "node", 362 | "id": 3634570451, 363 | "lat": -15.8048503, 364 | "lon": -47.8846875, 365 | "tags": { 366 | "amenity": "cafe", 367 | "name": "Cristina Caf\u00e9s", 368 | "website": "http://cafecristina.com.br" 369 | } 370 | }, 371 | { 372 | "type": "node", 373 | "id": 3645307602, 374 | "lat": -15.7626851, 375 | "lon": -47.8896497, 376 | "tags": { 377 | "amenity": "cafe", 378 | "name": "Caf\u00e9 Bem Casado", 379 | "opening_hours": "Mo-Sa 09:00-19:30", 380 | "website": "http://cafebemcasado.com.br" 381 | } 382 | }, 383 | { 384 | "type": "node", 385 | "id": 3768730374, 386 | "lat": -15.7831717, 387 | "lon": -47.8834145, 388 | "tags": { "amenity": "cafe", "name": "Rosa's Caf\u00e9" } 389 | }, 390 | { 391 | "type": "node", 392 | "id": 3900700774, 393 | "lat": -15.7608557, 394 | "lon": -47.8916129, 395 | "tags": { "amenity": "cafe", "name": "Gr\u00e3o Sabor" } 396 | }, 397 | { 398 | "type": "node", 399 | "id": 3958863453, 400 | "lat": -15.7877449, 401 | "lon": -47.8826614, 402 | "tags": { "amenity": "cafe", "name": "Art Caf\u00e9" } 403 | }, 404 | { 405 | "type": "node", 406 | "id": 3958863455, 407 | "lat": -15.7871193, 408 | "lon": -47.8828056, 409 | "tags": { 410 | "amenity": "cafe", 411 | "name": "Tomilla Caf\u00e9", 412 | "wheelchair": "yes" 413 | } 414 | }, 415 | { 416 | "type": "node", 417 | "id": 3971324159, 418 | "lat": -15.7873255, 419 | "lon": -47.8828911, 420 | "tags": { "amenity": "cafe", "name": "Especiarias de Minas" } 421 | }, 422 | { 423 | "type": "node", 424 | "id": 3971325069, 425 | "lat": -15.783933, 426 | "lon": -47.8848583, 427 | "tags": { 428 | "amenity": "cafe", 429 | "brand": "Fran's Caf\u00e9", 430 | "brand:wikidata": "Q62075645", 431 | "cuisine": "coffee_shop", 432 | "name": "Fran's Caf\u00e9", 433 | "takeaway": "yes" 434 | } 435 | }, 436 | { 437 | "type": "node", 438 | "id": 3973507957, 439 | "lat": -15.7812333, 440 | "lon": -47.8881001, 441 | "tags": { "amenity": "cafe", "name": "C\u00f3pia com Caf\u00e9" } 442 | }, 443 | { 444 | "type": "node", 445 | "id": 4081269529, 446 | "lat": -15.773612, 447 | "lon": -47.876547, 448 | "tags": { 449 | "addr:city": "Bras\u00edlia", 450 | "addr:street": "CLN 404", 451 | "addr:suburb": "Asa Norte", 452 | "amenity": "cafe", 453 | "internet_access": "yes", 454 | "internet_access:fee": "no", 455 | "name": "Los Baristas", 456 | "opening_hours": "Mo-Fr 12:00-20:00; Sa 10:00-19:00", 457 | "outdoor_seating": "yes", 458 | "smoking": "no", 459 | "website": "https://www.losbaristas.com/" 460 | } 461 | }, 462 | { 463 | "type": "node", 464 | "id": 4081269533, 465 | "lat": -15.790137, 466 | "lon": -47.8849886, 467 | "tags": { "amenity": "cafe", "name": "Chateau Brasil" } 468 | }, 469 | { 470 | "type": "node", 471 | "id": 4119072799, 472 | "lat": -15.7470135, 473 | "lon": -47.8835617, 474 | "tags": { 475 | "amenity": "cafe", 476 | "level": "1", 477 | "name": "Quintal f/508", 478 | "opening_hours": "Mo-Fr 15:30-20:30; Sa 09:00-12:00", 479 | "outdoor_seating": "no", 480 | "phone": "+55 61 33473985;+55 61 91400303", 481 | "website": "https://f508.com.br/quintal/" 482 | } 483 | }, 484 | { 485 | "type": "node", 486 | "id": 4156321058, 487 | "lat": -15.7770087, 488 | "lon": -47.8840073, 489 | "tags": { 490 | "amenity": "cafe", 491 | "name": "Chico Mineiro Confeitaria e Caf\u00e9" 492 | } 493 | }, 494 | { 495 | "type": "node", 496 | "id": 4187993132, 497 | "lat": -15.7746238, 498 | "lon": -47.8856309, 499 | "tags": { 500 | "amenity": "cafe", 501 | "name": "Caf\u00e9 Sarah Kubitscheck", 502 | "opening_hours": "Mo-Fr 09:00-20:00; Sa 08:00-17:00", 503 | "phone": "+55 61 39637373" 504 | } 505 | }, 506 | { 507 | "type": "node", 508 | "id": 4207805094, 509 | "lat": -15.763683, 510 | "lon": -47.881545, 511 | "tags": { "amenity": "cafe", "name": "Caf\u00e9 da V\u00f3 Maria" } 512 | }, 513 | { 514 | "type": "node", 515 | "id": 4330783337, 516 | "lat": -15.8192743, 517 | "lon": -47.8998423, 518 | "tags": { "amenity": "cafe", "name": "Magrelas Caf\u00e9" } 519 | }, 520 | { 521 | "type": "node", 522 | "id": 4433154149, 523 | "lat": -15.8097643, 524 | "lon": -47.9078076, 525 | "tags": { "amenity": "cafe", "cuisine": "french", "name": "Le Jardin" } 526 | }, 527 | { 528 | "type": "node", 529 | "id": 4471601993, 530 | "lat": -15.8307026, 531 | "lon": -47.9242343, 532 | "tags": { 533 | "amenity": "cafe", 534 | "internet_access": "yes", 535 | "internet_access:fee": "no", 536 | "name": "Ernesto Caf\u00e9s Especiais", 537 | "name:pt": "Ernesto Caf\u00e9s Especiais", 538 | "opening_hours": "Mo-Su 07:00-22:00", 539 | "outdoor_seating": "yes", 540 | "smoking": "no" 541 | } 542 | }, 543 | { 544 | "type": "node", 545 | "id": 4558361197, 546 | "lat": -15.7355928, 547 | "lon": -47.8972574, 548 | "tags": { 549 | "amenity": "cafe", 550 | "name": "Rei do Mate", 551 | "name:pt": "Rei do Mate" 552 | } 553 | }, 554 | { 555 | "type": "node", 556 | "id": 4558399090, 557 | "lat": -15.7390367, 558 | "lon": -47.8892686, 559 | "tags": { 560 | "amenity": "cafe", 561 | "name": "Croissanterie caf\u00e9 | bistr\u00f4" 562 | } 563 | }, 564 | { 565 | "type": "node", 566 | "id": 4585501235, 567 | "lat": -15.786565, 568 | "lon": -47.8888328, 569 | "tags": { 570 | "amenity": "cafe", 571 | "brand": "Fran's Caf\u00e9", 572 | "brand:wikidata": "Q62075645", 573 | "cuisine": "coffee_shop", 574 | "name": "Fran's Caf\u00e9", 575 | "takeaway": "yes" 576 | } 577 | }, 578 | { 579 | "type": "node", 580 | "id": 4585501236, 581 | "lat": -15.7866114, 582 | "lon": -47.8890018, 583 | "tags": { "amenity": "cafe", "name": "Martinica" } 584 | }, 585 | { 586 | "type": "node", 587 | "id": 4585529781, 588 | "lat": -15.7871869, 589 | "lon": -47.8840682, 590 | "tags": { "amenity": "cafe", "level": "1", "name": "Grande Caf\u00e9" } 591 | }, 592 | { 593 | "type": "node", 594 | "id": 4591337312, 595 | "lat": -15.7501975, 596 | "lon": -47.8933428, 597 | "tags": { "amenity": "cafe", "name": "Rei do P\u00e3o de Queijo" } 598 | }, 599 | { 600 | "type": "node", 601 | "id": 4591337315, 602 | "lat": -15.7499358, 603 | "lon": -47.8931995, 604 | "tags": { "amenity": "cafe", "name": "Iaga Arte Caf\u00e9" } 605 | }, 606 | { 607 | "type": "node", 608 | "id": 4608731433, 609 | "lat": -15.7868298, 610 | "lon": -47.88463, 611 | "tags": { "amenity": "cafe", "level": "0", "name": "Cr\u00e9pe de Paris" } 612 | }, 613 | { 614 | "type": "node", 615 | "id": 4693815344, 616 | "lat": -15.7334022, 617 | "lon": -47.8996803, 618 | "tags": { "amenity": "cafe", "name": "Kopenhagen" } 619 | }, 620 | { 621 | "type": "node", 622 | "id": 4825889842, 623 | "lat": -15.7337708, 624 | "lon": -47.8987679, 625 | "tags": { 626 | "amenity": "cafe", 627 | "level": "0", 628 | "name": "Casa do P\u00e3o de Queijo" 629 | } 630 | }, 631 | { 632 | "type": "node", 633 | "id": 4897810422, 634 | "lat": -15.759575, 635 | "lon": -47.8785977, 636 | "tags": { 637 | "amenity": "cafe", 638 | "cuisine": "arab", 639 | "name": "Snob", 640 | "name:pt": "Snob" 641 | } 642 | }, 643 | { 644 | "type": "node", 645 | "id": 4908113823, 646 | "lat": -15.7526495, 647 | "lon": -47.8891559, 648 | "tags": { "amenity": "cafe", "cuisine": "chocolate", "name": "Lugano" } 649 | }, 650 | { 651 | "type": "node", 652 | "id": 4908141129, 653 | "lat": -15.7906235, 654 | "lon": -47.8831845, 655 | "tags": { "amenity": "cafe", "level": "2", "name": "Gaudi Caf\u00e9" } 656 | }, 657 | { 658 | "type": "node", 659 | "id": 4957238257, 660 | "lat": -15.7591758, 661 | "lon": -47.8877238, 662 | "tags": { 663 | "amenity": "cafe", 664 | "cuisine": "nordestina", 665 | "name": "Caf\u00e9 e um Ch\u00earo", 666 | "opening_hours": "Mo-Sa 07:00-22:00", 667 | "website": "http://www.cafeeumchero.com.br" 668 | } 669 | }, 670 | { 671 | "type": "node", 672 | "id": 5029115521, 673 | "lat": -15.780834, 674 | "lon": -47.889139, 675 | "tags": { 676 | "amenity": "cafe", 677 | "name": "Oficina Caf\u00e9", 678 | "name:pt": "Oficina Caf\u00e9" 679 | } 680 | }, 681 | { 682 | "type": "node", 683 | "id": 5087302622, 684 | "lat": -15.7452496, 685 | "lon": -47.8866603, 686 | "tags": { 687 | "amenity": "cafe", 688 | "level": "-1", 689 | "name": "Labbora Caf\u00e9s Especiais", 690 | "opening_hours": "Mo-Fr 10:00-19:00" 691 | } 692 | }, 693 | { 694 | "type": "node", 695 | "id": 5087302722, 696 | "lat": -15.7446725, 697 | "lon": -47.8870871, 698 | "tags": { 699 | "amenity": "cafe", 700 | "cuisine": "hungarian", 701 | "name": "Duna Casa H\u00fangara", 702 | "name:pt": "Duna Casa H\u00fangara" 703 | } 704 | }, 705 | { 706 | "type": "node", 707 | "id": 5124575930, 708 | "lat": -15.7962238, 709 | "lon": -47.8927946, 710 | "tags": { 711 | "amenity": "cafe", 712 | "internet_access": "wlan", 713 | "name": "Caf\u00e9 Civit\u00e1", 714 | "name:pt": "Caf\u00e9 Civit\u00e1" 715 | } 716 | }, 717 | { 718 | "type": "node", 719 | "id": 5125114322, 720 | "lat": -15.7953783, 721 | "lon": -47.8924834, 722 | "tags": { 723 | "amenity": "cafe", 724 | "brand": "Fran's Caf\u00e9", 725 | "brand:wikidata": "Q62075645", 726 | "cuisine": "coffee_shop", 727 | "name": "Fran's Caf\u00e9", 728 | "takeaway": "yes" 729 | } 730 | }, 731 | { 732 | "type": "node", 733 | "id": 5135659820, 734 | "lat": -15.7686257, 735 | "lon": -47.8743398, 736 | "tags": { "amenity": "cafe" } 737 | }, 738 | { 739 | "type": "node", 740 | "id": 5225539396, 741 | "lat": -15.8028809, 742 | "lon": -47.8931241, 743 | "tags": { "amenity": "cafe", "name": "Nosso Quadrado" } 744 | }, 745 | { 746 | "type": "node", 747 | "id": 5230076441, 748 | "lat": -15.8103402, 749 | "lon": -47.9100841, 750 | "tags": { 751 | "amenity": "cafe", 752 | "brand": "Fran's Caf\u00e9", 753 | "brand:wikidata": "Q62075645", 754 | "cuisine": "coffee_shop", 755 | "name": "Fran's Caf\u00e9", 756 | "takeaway": "yes" 757 | } 758 | }, 759 | { 760 | "type": "node", 761 | "id": 5299457845, 762 | "lat": -15.8195535, 763 | "lon": -47.9121922, 764 | "tags": { "amenity": "cafe", "name": "Uai Bezinha!" } 765 | }, 766 | { 767 | "type": "node", 768 | "id": 5353491828, 769 | "lat": -15.8184198, 770 | "lon": -47.8749357, 771 | "tags": { "amenity": "cafe", "name": "Gr\u00e3o Espresso" } 772 | }, 773 | { 774 | "type": "node", 775 | "id": 5366399095, 776 | "lat": -15.7514698, 777 | "lon": -47.8846808, 778 | "tags": { 779 | "amenity": "cafe", 780 | "internet_access": "wlan", 781 | "name": "Garden Caf\u00e9", 782 | "opening_hours": "Mo-Fr 08:30-20:00; Sa 10:00-18:00" 783 | } 784 | }, 785 | { 786 | "type": "node", 787 | "id": 5381047922, 788 | "lat": -15.8136655, 789 | "lon": -47.9130762, 790 | "tags": { "amenity": "cafe", "name": "Da Vici Cafeteria" } 791 | }, 792 | { 793 | "type": "node", 794 | "id": 5416977721, 795 | "lat": -15.7902403, 796 | "lon": -47.8846678, 797 | "tags": { 798 | "addr:street": "SHN Quadra 1", 799 | "amenity": "cafe", 800 | "name": "Melbourne Caf\u00e9 & Co.", 801 | "opening_hours": "Mo-Fr 08:15-17:30", 802 | "outdoor_seating": "yes", 803 | "website": "http://www.olamelbourne.com.br/" 804 | } 805 | }, 806 | { 807 | "type": "node", 808 | "id": 5436122015, 809 | "lat": -15.8273745, 810 | "lon": -47.9187069, 811 | "tags": { 812 | "addr:city": "Bras\u00edlia", 813 | "addr:housenumber": "Loja 07", 814 | "addr:street": "CLS 114 Bloco B", 815 | "amenity": "cafe", 816 | "internet_access": "wlan", 817 | "internet_access:fee": "no", 818 | "name": "Belini Caf\u00e9", 819 | "opening_hours": "Mo-Sa 08:00-23:00; Su 08:00-22:00", 820 | "outdoor_seating": "yes", 821 | "payment:cash": "yes", 822 | "payment:credit_cards": "yes", 823 | "smoking": "no", 824 | "website": "https://pt-br.facebook.com/pg/belinicafe/about/?ref=page_internal" 825 | } 826 | }, 827 | { 828 | "type": "node", 829 | "id": 5470850733, 830 | "lat": -15.7526191, 831 | "lon": -47.8900604, 832 | "tags": { "amenity": "cafe", "name": "Sincera" } 833 | }, 834 | { 835 | "type": "node", 836 | "id": 5650571821, 837 | "lat": -15.8263217, 838 | "lon": -47.906648, 839 | "tags": { 840 | "addr:housenumber": "Bloco A Loja 13", 841 | "addr:street": "SQS 410", 842 | "amenity": "cafe", 843 | "cuisine": "cake;coffee_shop", 844 | "email": "contato@cioccolateria.com.br", 845 | "internet_access": "wlan", 846 | "name": "Cioccolateria Doceria e Caf\u00e9", 847 | "opening_hours": "Mo-Fr 10:00-19:00; Sa 09:00-17:00", 848 | "phone": "+55 61 3242 6399", 849 | "website": "http://www.cioccolateria.com.br" 850 | } 851 | }, 852 | { 853 | "type": "node", 854 | "id": 5766574433, 855 | "lat": -15.7775553, 856 | "lon": -47.8826493, 857 | "tags": { 858 | "addr:city": "Bras\u00edlia", 859 | "addr:street": "CLN 103/104", 860 | "amenity": "cafe", 861 | "internet_access": "yes", 862 | "internet_access:fee": "no", 863 | "name": "Quanto", 864 | "opening_hours": "Mo-Fr 11:00-21:00, Sa 09:00-21:00", 865 | "outdoor_seating": "yes", 866 | "smoking": "no" 867 | } 868 | }, 869 | { 870 | "type": "node", 871 | "id": 5856741812, 872 | "lat": -15.7398592, 873 | "lon": -47.8994946, 874 | "tags": { 875 | "addr:street": "CLRN 716", 876 | "amenity": "cafe", 877 | "internet_access": "yes", 878 | "internet_access:fee": "no", 879 | "name": "Antonieta", 880 | "outdoor_seating": "yes", 881 | "shop": "tea", 882 | "smoking": "no", 883 | "website": "https://www.instagram.com/antonietacafe" 884 | } 885 | }, 886 | { 887 | "type": "node", 888 | "id": 5856750259, 889 | "lat": -15.7398134, 890 | "lon": -47.89356, 891 | "tags": { 892 | "addr:city": "Bras\u00edlia", 893 | "addr:housenumber": "Loja 46", 894 | "addr:street": "SCLN 116 Bloco B", 895 | "addr:suburb": "Plano Piloto", 896 | "amenity": "cafe", 897 | "name": "Salve Caf\u00e9 Maravilha", 898 | "opening_hours": "Mo-Fr 14:00-20:30; Sa 14:300-20:30; Su 09:30-12:30", 899 | "payment:cash": "yes", 900 | "payment:credit_cards": "yes", 901 | "payment:debit_cards": "yes", 902 | "website": "https://www.facebook.com/salvecafemaravilha/" 903 | } 904 | }, 905 | { 906 | "type": "node", 907 | "id": 6005691723, 908 | "lat": -15.7645578, 909 | "lon": -47.8852493, 910 | "tags": { 911 | "addr:street": "CLN 107/108", 912 | "amenity": "cafe", 913 | "internet_access": "yes", 914 | "internet_access:fee": "no", 915 | "name": "Ernesto Caf\u00e9s Especiais", 916 | "opening_hours": "Mo-Su 07:00-22:00", 917 | "outdoor_seating": "yes", 918 | "smoking": "no" 919 | } 920 | }, 921 | { 922 | "type": "node", 923 | "id": 6207544093, 924 | "lat": -15.7712064, 925 | "lon": -47.8712547, 926 | "tags": { 927 | "amenity": "cafe", 928 | "cuisine": "sandwiches", 929 | "internet_access": "no", 930 | "internet_access:fee": "no", 931 | "name": "Caf\u00e9 da Fiocruz", 932 | "outdoor_seating": "no", 933 | "smoking": "no", 934 | "takeaway": "yes" 935 | } 936 | }, 937 | { 938 | "type": "node", 939 | "id": 6456239248, 940 | "lat": -15.8148373, 941 | "lon": -47.9071188, 942 | "tags": { "amenity": "cafe", "name": "Maria Aur\u00e9lia" } 943 | }, 944 | { 945 | "type": "node", 946 | "id": 6456386661, 947 | "lat": -15.8151596, 948 | "lon": -47.8938988, 949 | "tags": { 950 | "amenity": "cafe", 951 | "brand": "Fran's Caf\u00e9", 952 | "brand:wikidata": "Q62075645", 953 | "cuisine": "coffee_shop", 954 | "name": "Fran's Caf\u00e9", 955 | "outdoor_seating": "yes", 956 | "takeaway": "yes" 957 | } 958 | }, 959 | { 960 | "type": "node", 961 | "id": 6591961959, 962 | "lat": -15.7808206, 963 | "lon": -47.8900077, 964 | "tags": { "amenity": "cafe", "name": "Sterna Caf\u00e9" } 965 | }, 966 | { 967 | "type": "node", 968 | "id": 6632677485, 969 | "lat": -15.7708562, 970 | "lon": -47.8845249, 971 | "tags": { 972 | "addr:postcode": "70742-530", 973 | "addr:street": "SQN 106 Bloco A", 974 | "amenity": "cafe", 975 | "name": "QualyCream", 976 | "opening_hours": "Mo-Fr 08:00-18:00; Sa 09:00-13:00", 977 | "phone": "+55 61 3033 1010", 978 | "website": "http://qualycream.com.br" 979 | } 980 | }, 981 | { 982 | "type": "node", 983 | "id": 7705116886, 984 | "lat": -15.8256478, 985 | "lon": -47.9289296, 986 | "tags": { "amenity": "cafe" } 987 | }, 988 | { 989 | "type": "node", 990 | "id": 7705116908, 991 | "lat": -15.8268004, 992 | "lon": -47.9294188, 993 | "tags": { "amenity": "cafe" } 994 | }, 995 | { 996 | "type": "node", 997 | "id": 7949383205, 998 | "lat": -15.7518287, 999 | "lon": -47.8975325, 1000 | "tags": { 1001 | "addr:city": "Bras\u00edlia", 1002 | "addr:street": "SCRN 712/713, bloco E", 1003 | "amenity": "cafe", 1004 | "name": "Amarelinha" 1005 | } 1006 | }, 1007 | { 1008 | "type": "node", 1009 | "id": 8223909098, 1010 | "lat": -15.7406194, 1011 | "lon": -47.8992532, 1012 | "tags": { 1013 | "addr:street": "CLRN 716", 1014 | "amenity": "cafe", 1015 | "cuisine": "coffee_shop;regional", 1016 | "internet_access": "yes", 1017 | "internet_access:fee": "no", 1018 | "name": "Marilda Caf\u00e9", 1019 | "opening_hours": "Tu-Fr 12:00-20:00; Sa-Su 09:00-20:00", 1020 | "outdoor_seating": "yes", 1021 | "payment:cash": "yes", 1022 | "payment:credit_cards": "yes", 1023 | "phone": "+55 61 2194 7902", 1024 | "website": "https://www.instagram.com/marilda_cafe" 1025 | } 1026 | }, 1027 | { 1028 | "type": "node", 1029 | "id": 8435477631, 1030 | "lat": -15.8152087, 1031 | "lon": -47.902979, 1032 | "tags": { 1033 | "addr:housenumber": "Bloco D Loja x", 1034 | "addr:street": "CLS 108", 1035 | "amenity": "cafe", 1036 | "name": "Lugano" 1037 | } 1038 | }, 1039 | { 1040 | "type": "node", 1041 | "id": 9106354157, 1042 | "lat": -15.8015199, 1043 | "lon": -47.896786, 1044 | "tags": { 1045 | "addr:city": "distrito federal", 1046 | "addr:housenumber": "36", 1047 | "addr:postcode": "70331710", 1048 | "addr:street": "SHIGS Quadra 703, bloco J;SHIGS Quadra 703, Bloco J", 1049 | "addr:suburb": "asa sul", 1050 | "amenity": "cafe", 1051 | "cuisine": "cake;cafetaria", 1052 | "name": "Rafaela Brand\u00e3o Doceria;Senhorita Brigadeiro" 1053 | } 1054 | }, 1055 | { 1056 | "type": "node", 1057 | "id": 9223636892, 1058 | "lat": -15.7728741, 1059 | "lon": -47.8760889, 1060 | "tags": { 1061 | "addr:street": "CLN 405", 1062 | "amenity": "cafe", 1063 | "cuisine": "coffee_shop;regional", 1064 | "name": "Maytrea Caf\u00e9 do Cerrado", 1065 | "opening_hours": "Tu-Fr 14:00-19:00; Sa 11:00-15:00", 1066 | "outdoor_seating": "yes", 1067 | "website": "https://www.instagram.com/maytreacerrado/" 1068 | } 1069 | }, 1070 | { 1071 | "type": "node", 1072 | "id": 9223668163, 1073 | "lat": -15.7598622, 1074 | "lon": -47.8802586, 1075 | "tags": { 1076 | "addr:street": "CLN 409", 1077 | "amenity": "cafe", 1078 | "cuisine": "coffee_shop", 1079 | "name": "The Coffee", 1080 | "opening_hours": "Mo-Fr 07:30-20:00; sa-su 08:00-20:00", 1081 | "outdoor_seating": "yes", 1082 | "website": "https://www.thecoffee.jp/" 1083 | } 1084 | }, 1085 | { 1086 | "type": "node", 1087 | "id": 9321058495, 1088 | "lat": -15.7634914, 1089 | "lon": -47.8926958, 1090 | "tags": { 1091 | "addr:street": "CRN 708/709 G", 1092 | "amenity": "cafe", 1093 | "cuisine": "coffee_shop", 1094 | "internet_access": "yes", 1095 | "internet_access:fee": "no", 1096 | "name": "Aha", 1097 | "opening_hours": "We-Su 11:00-18:00", 1098 | "website": "https://www.ahacafes.com.br/" 1099 | } 1100 | }, 1101 | { 1102 | "type": "node", 1103 | "id": 9364462024, 1104 | "lat": -15.7611957, 1105 | "lon": -47.8926411, 1106 | "tags": { "amenity": "cafe", "name": "Civita" } 1107 | }, 1108 | { 1109 | "type": "node", 1110 | "id": 9559046117, 1111 | "lat": -15.8066905, 1112 | "lon": -47.893681, 1113 | "tags": { 1114 | "amenity": "cafe", 1115 | "name": "Duckbill Cookies & Coffee", 1116 | "survey:date": "2022-03-06" 1117 | } 1118 | }, 1119 | { 1120 | "type": "node", 1121 | "id": 9559046118, 1122 | "lat": -15.8069382, 1123 | "lon": -47.8933825, 1124 | "tags": { 1125 | "amenity": "cafe", 1126 | "name": "Caf\u00e9 da Mata", 1127 | "survey:date": "2022-03-06" 1128 | } 1129 | }, 1130 | { 1131 | "type": "node", 1132 | "id": 9563487746, 1133 | "lat": -15.7950461, 1134 | "lon": -47.8924062, 1135 | "tags": { 1136 | "amenity": "cafe", 1137 | "brand": "Starbucks", 1138 | "brand:wikidata": "Q37158", 1139 | "brand:wikipedia": "en:Starbucks", 1140 | "cuisine": "coffee_shop", 1141 | "name": "Starbucks", 1142 | "official_name": "Starbucks Coffee", 1143 | "takeaway": "yes" 1144 | } 1145 | }, 1146 | { 1147 | "type": "node", 1148 | "id": 9577464680, 1149 | "lat": -15.79097, 1150 | "lon": -47.8829693, 1151 | "tags": { 1152 | "amenity": "cafe", 1153 | "brand": "Starbucks", 1154 | "brand:wikidata": "Q37158", 1155 | "brand:wikipedia": "en:Starbucks", 1156 | "cuisine": "coffee_shop", 1157 | "name": "Starbucks", 1158 | "official_name": "Starbucks Coffee", 1159 | "takeaway": "yes" 1160 | } 1161 | }, 1162 | { 1163 | "type": "node", 1164 | "id": 9858565892, 1165 | "lat": -15.7373599, 1166 | "lon": -47.8951192, 1167 | "tags": { 1168 | "addr:street": "SCLN 116 Bloco I", 1169 | "air_conditioning": "no", 1170 | "amenity": "cafe", 1171 | "cuisine": "regional", 1172 | "level": "0", 1173 | "name": "Ponto Do Caf\u00e9 116", 1174 | "outdoor_seating": "yes" 1175 | } 1176 | } 1177 | ] 1178 | } 1179 | --------------------------------------------------------------------------------