You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

overpy

Package Overview
Dependencies
Maintainers
1
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

overpy - pypi Package Compare versions

Comparing version
0.3.1
to
0.4
+52
CHANGELOG.rst
Changelog
=========
0.x (`master`_)
~~~~~~~~~~~~~~~
.. note:: This version is not yet released and is under development.
0.4 (2016-12-08)
~~~~~~~~~~~~~~~~
* Add SAX parser
* Add option to choose DOM or SAX parser
* Fix issues with CI builds with Python 3.2
* Add Python 3.5 to CI builds
* Fix issues (Thanks to all contributors)
* Add property for default API URL
* Add examples
* Build Fixes
* GitHub templates
* Parse center information
* Parse geometry information
* Support Areas
0.3.1 (2015-04-30)
~~~~~~~~~~~~~~~~~~
* Improve example
0.3.0 (2015-04-30)
~~~~~~~~~~~~~~~~~~
* Improve internal data handling (Dominik)
* Add helper functions (Morris Jobke)
0.2.0 (2014-12-27)
~~~~~~~~~~~~~~~~~~
* Added support for xml response data
* Added support for exceptions
* Added tests with 100% code coverage
* Removed Python 2.6 support
* Added more examples to the documentation
0.1.0 (2014-12-14)
~~~~~~~~~~~~~~~~~~
Proof of concept
* Initial release.
.. _`master`: https://github.com/DinoTools/python-overpy
@ECHO OFF
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set BUILDDIR=build
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source
set I18NSPHINXOPTS=%SPHINXOPTS% source
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. singlehtml to make a single large HTML file
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. devhelp to make HTML files and a Devhelp project
echo. epub to make an epub
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. text to make text files
echo. man to make manual pages
echo. texinfo to make Texinfo files
echo. gettext to make PO message catalogs
echo. changes to make an overview over all changed/added/deprecated items
echo. xml to make Docutils-native XML files
echo. pseudoxml to make pseudoxml-XML files for display purposes
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
goto end
)
if "%1" == "clean" (
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
del /q /s %BUILDDIR%\*
goto end
)
%SPHINXBUILD% 2> nul
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
goto end
)
if "%1" == "singlehtml" (
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in %BUILDDIR%/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this:
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\PythonOverpassAPI.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\PythonOverpassAPI.ghc
goto end
)
if "%1" == "devhelp" (
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished.
goto end
)
if "%1" == "epub" (
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The epub file is in %BUILDDIR%/epub.
goto end
)
if "%1" == "latex" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
if errorlevel 1 exit /b 1
echo.
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "latexpdf" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
cd %BUILDDIR%/latex
make all-pdf
cd %BUILDDIR%/..
echo.
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "latexpdfja" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
cd %BUILDDIR%/latex
make all-pdf-ja
cd %BUILDDIR%/..
echo.
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "text" (
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The text files are in %BUILDDIR%/text.
goto end
)
if "%1" == "man" (
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The manual pages are in %BUILDDIR%/man.
goto end
)
if "%1" == "texinfo" (
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
goto end
)
if "%1" == "gettext" (
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
goto end
)
if "%1" == "changes" (
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
if errorlevel 1 exit /b 1
echo.
echo.The overview file is in %BUILDDIR%/changes.
goto end
)
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
if errorlevel 1 exit /b 1
echo.
echo.Link check complete; look for any errors in the above output ^
or in %BUILDDIR%/linkcheck/output.txt.
goto end
)
if "%1" == "doctest" (
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
if errorlevel 1 exit /b 1
echo.
echo.Testing of doctests in the sources finished, look at the ^
results in %BUILDDIR%/doctest/output.txt.
goto end
)
if "%1" == "xml" (
%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The XML files are in %BUILDDIR%/xml.
goto end
)
if "%1" == "pseudoxml" (
%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
goto end
)
:end
API Reference
=============
.. currentmodule:: overpy
Overpass API
------------
.. autoclass:: Overpass
:members:
Result
------
.. autoclass:: Result
:members:
Elements
--------
.. autoclass:: Element
:members:
.. autoclass:: Area
:members:
.. autoclass:: Node
:members:
.. autoclass:: Relation
:members:
.. autoclass:: Way
:members:
Relation Members
----------------
.. autoclass:: RelationMember
:members:
.. autoclass:: RelationArea
:members:
.. autoclass:: RelationNode
:members:
.. autoclass:: RelationWay
:members:
Exceptions
----------
.. automodule:: overpy.exception
:members:
Helper
------
.. automodule:: overpy.helper
:members:
.. include:: ../../CHANGELOG.rst
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
sys.path.insert(
0,
os.path.abspath(
os.path.join(
os.path.dirname(__file__),
'../../'
)
)
)
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.todo',
'sphinx.ext.coverage',
'sphinx.ext.viewcode',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = 'Python Overpass API'
copyright = '2014, PhiBo'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
from overpy import __about__ as overpy_about
version = overpy_about.__version__
# The full version, including alpha/beta/rc tags.
release = overpy_about.__version__
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = []
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'PythonOverpassAPIdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
('index', 'PythonOverpassAPI.tex', 'Python Overpass API Documentation',
'PhiBo', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'pythonoverpassapi', 'Python Overpass API Documentation',
['PhiBo'], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'PythonOverpassAPI', 'Python Overpass API Documentation',
'PhiBo', 'PythonOverpassAPI', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
# -- Options for Epub output ----------------------------------------------
# Bibliographic Dublin Core info.
epub_title = 'Python Overpass API'
epub_author = 'PhiBo'
epub_publisher = 'PhiBo'
epub_copyright = '2014, PhiBo'
# The basename for the epub file. It defaults to the project name.
#epub_basename = 'Python Overpass API'
# The HTML theme for the epub output. Since the default themes are not optimized
# for small screen space, using the same theme for HTML and epub output is
# usually not wise. This defaults to 'epub', a theme designed to save visual
# space.
#epub_theme = 'epub'
# The language of the text. It defaults to the language option
# or en if the language is not set.
#epub_language = ''
# The scheme of the identifier. Typical schemes are ISBN or URL.
#epub_scheme = ''
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#epub_identifier = ''
# A unique identification for the text.
#epub_uid = ''
# A tuple containing the cover image and cover page html template filenames.
#epub_cover = ()
# A sequence of (type, uri, title) tuples for the guide element of content.opf.
#epub_guide = ()
# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []
# HTML files shat should be inserted after the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_post_files = []
# A list of files that should not be packed into the epub file.
epub_exclude_files = ['search.html']
# The depth of the table of contents in toc.ncx.
#epub_tocdepth = 3
# Allow duplicate toc entries.
#epub_tocdup = True
# Choose between 'default' and 'includehidden'.
#epub_tocscope = 'default'
# Fix unsupported image types using the PIL.
#epub_fix_images = False
# Scale large images.
#epub_max_image_width = 0
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#epub_show_urls = 'inline'
# If false, no index is generated.
#epub_use_index = True
.. include:: ../../CONTRIBUTING.rst
Examples
========
Basic example
-------------
Lets start with an example from the Overpass API documentation.
**Query String:**
.. code-block:: text
:linenos:
node(50.745,7.17,50.75,7.18);
out;
**Use OverPy:**
.. code-block:: pycon
:linenos:
>>> import overpy
>>> api = overpy.Overpass()
>>> result = api.query("node(50.745,7.17,50.75,7.18);out;")
>>> len(result.nodes)
1984
>>> len(result.ways)
0
>>> len(result.relations)
0
>>> node = result.nodes[2]
>>> node.id
100792806
>>> node.tags
{}
Line 1:
Import the required Python module
Line 2:
Create a new instance of the Overpass() class.
This instance is used to query the Overpass API.
Line 3:
Use the Query-String from above to query the Overpass API service.
Line 4,5:
Get the number of nodes in the result set.
Line 6-9:
Get the number of ways and relations available in the result set.
Line 10-14:
Get the third node from the list.
Display the ID and the tags of this node.
Use Overpass QL or Overpass XML
-------------------------------
Queries are passed directly to the Overpass API service without any modification.
So it is possible to use Overpass QL and Overpass XML.
Overpass QL
~~~~~~~~~~~
**Query:**
.. code-block:: text
:linenos:
node["name"="Gielgen"];
out body;
**Use OverPy:**
.. code-block:: pycon
:linenos:
>>> import overpy
>>> api = overpy.Overpass()
>>> result = api.query("""node["name"="Gielgen"];out body;""")
>>> len(result.nodes)
6
>>> len(result.ways)
0
>>> len(result.relations)
0
Overpass XML
~~~~~~~~~~~~
**Query:**
.. code-block:: xml
:linenos:
<osm-script>
<query type="node">
<has-kv k="name" v="Gielgen"/>
</query>
<print/>
</osm-script>
**Use OverPy:**
.. code-block:: pycon
:linenos:
>>> import overpy
>>> api = overpy.Overpass()
>>> result = api.query("""<osm-script>
... <query type="node">
... <has-kv k="name" v="Gielgen"/>
... </query>
... <print/>
... </osm-script>""")
>>> len(result.nodes)
6
>>> len(result.ways)
0
>>> len(result.relations)
0
Parse JSON or XML responses
---------------------------
On a request OverPy detects the content type from the response.
JSON response
~~~~~~~~~~~~~
**Query String:**
.. code-block:: text
:linenos:
[out:json];
node(50.745,7.17,50.75,7.18);
out;
**Use OverPy:**
.. code-block:: pycon
:linenos:
>>> import overpy
>>> api = overpy.Overpass()
>>> result = api.query("[out:json];node(50.745,7.17,50.75,7.18);out;")
>>> len(result.nodes)
1984
>>> len(result.ways)
0
>>> len(result.relations)
0
XML response
~~~~~~~~~~~~
**Query String:**
.. code-block:: text
:linenos:
[out:xml];
node(50.745,7.17,50.75,7.18);
out;
**Use OverPy:**
.. code-block:: pycon
:linenos:
>>> import overpy
>>> api = overpy.Overpass()
>>> result = api.query("[out:xml];node(50.745,7.17,50.75,7.18);out;")
>>> len(result.nodes)
1984
>>> len(result.ways)
0
>>> len(result.relations)
0
Ways
----
Get all nodes of a way
~~~~~~~~~~~~~~~~~~~~~~
In this example the Overpass API will only return the Way elements with the name "Gielgenstraße".
But there will be no Node elements in the result set.
OverPy provides a way to resolve missing nodes.
**Query String:**
.. code-block:: text
:linenos:
way
["name"="Gielgenstraße"]
(50.7,7.1,50.8,7.25);
out;
**Use OverPy:**
.. code-block:: pycon
:linenos:
>>> import overpy
>>> api = overpy.Overpass()
>>> result = api.query("""way["name"="Gielgenstraße"](50.7,7.1,50.8,7.25);out;""")
>>> len(result.nodes)
0
>>> len(result.ways)
4
>>> way = result.ways[0]
>>> way.nodes
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
[...]
raise exception.DataIncomplete("Resolve missing nodes is disabled")
overpy.exception.DataIncomplete: ('Data incomplete try to improve the query to resolve the missing data', 'Resolve missing nodes is disabled')
>>> way.get_nodes()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
[...]
raise exception.DataIncomplete("Resolve missing nodes is disabled")
overpy.exception.DataIncomplete: ('Data incomplete try to improve the query to resolve the missing data', 'Resolve missing nodes is disabled')
>>> nodes = way.get_nodes(resolve_missing=True)
>>> len(nodes)
13
>>> len(result.nodes)
13
>>> len(way.nodes)
13
Line 1-3:
Send a query to the Overpass API service.
Line 4-6:
There are 4 Way elements and 0 Node elements in the result set.
Line 7:
Get the first way.
Line 8-19:
Use :attr:`overpy.Way.nodes` class attribute and the :func:`overpy.Way.get_nodes()` function to get the nodes for the way.
Both raise an exception because the nodes are not in the result set and auto resolving missing nodes is disabled.
Line 20-21:
Use the :func:`overpy.Way.get_nodes()` function and let OverPy try to resolve the missing nodes.
The function will return all Node elements connected with the Way element.
Line 22-25:
The resolved nodes have been added to the result set and are available to be used again later.
Welcome to Python Overpass API's documentation!
===============================================
Contents:
.. toctree::
:maxdepth: 2
introduction
example
api
contributing
changelog
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
Introduction
============
Requirements
------------
Supported Python versions:
* Python 2.7
* Python > 3.2
* PyPy
Installation
------------
As a Python egg
~~~~~~~~~~~~~~~
You can install the most recent version using ``pip``
.. code-block:: console
$ pip install overpy
From a tarball release
~~~~~~~~~~~~~~~~~~~~~~
Download the most recent tarball from github, unpack it and run the following command on the command-line.
.. code-block:: console
$ python setup.py install
Install the development version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Install git and run the following commands on the command-line.
.. code-block:: console
$ git clone https://github.com/DinoTools/python-overpy.git
$ cd python-overpy
$ python setup.py install
Usage
-----
It is recommended to have a look at the documentation of the `Overpass API`_ before using OverPy.
For more examples have a look at the :doc:`examples page <example>` or in the examples directory.
.. code-block:: python
import overpy
api = overpy.Overpass()
# fetch all ways and nodes
result = api.query("""
way(50.746,7.154,50.748,7.157) ["highway"];
(._;>;);
out body;
""")
for way in result.ways:
print("Name: %s" % way.tags.get("name", "n/a"))
print(" Highway: %s" % way.tags.get("highway", "n/a"))
print(" Nodes:")
for node in way.nodes:
print(" Lat: %f, Lon: %f" % (node.lat, node.lon))
.. _Overpass API: https://wiki.openstreetmap.org/wiki/Overpass_API
#!/usr/bin/env python
import overpy
api = overpy.Overpass()
# fetch all areas
# More info on http://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_API_by_Example
result = api.query("""
area[name="Troisdorf"];
out;
""")
for area in result.areas:
print(
"Name: %s (%i)" % (
area.tags.get("name", "n/a"),
area.id
)
)
for n, v in area.tags.items():
print(" Tag: %s = %s" % (n, v))
#!/usr/bin/env python
import overpy
api = overpy.Overpass()
# We can also see a node's metadata:
jet_deau = 60018172
result = api.query("node({}); out meta;".format(jet_deau))
node = result.get_node(jet_deau)
print(
"The node for the famous Geneva {} ({},{}) was:".format(
node.tags['name'],
node.lat,
node.lon
)
)
attrs = node.attributes
print("* last modified {}".format(attrs['timestamp']))
print("* by {} (uid: {})".format(attrs['user'], attrs['uid']))
print("* in changeset {}".format(attrs['changeset']))
#!/usr/bin/env python
import overpy
api = overpy.Overpass()
# fetch all ways and nodes
result = api.query("""
way(50.746,7.154,50.748,7.157) ["highway"];
(._;>;);
out body;
""")
for way in result.ways:
print("Name: %s" % way.tags.get("name", "n/a"))
print(" Highway: %s" % way.tags.get("highway", "n/a"))
print(" Nodes:")
for node in way.nodes:
print(" Lat: %f, Lon: %f" % (node.lat, node.lon))
The MIT License (MIT)
Copyright (c) 2014 PhiBo (DinoTools)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
include README.rst CHANGELOG.rst
include LICENSE
include MANIFEST.in
include docs/make.bat docs.Makefile
include docs/source/conf.py
include docs/source/*.rst
include examples/*.py
include tests/*.py
include tests/json/*.json
include tests/response/*.html
include tests/xml/*.xml
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2016-11-22T21:04:02Z",
"timestamp_areas_base": "2016-11-22T20:25:03Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "area",
"id": 2448756446,
"tags": {
"addr:city": "Troisdorf",
"addr:postcode": "53840",
"area": "yes",
"description": "Troisdorf Bahnsteig Gleis 9",
"name": "Troisdorf",
"public_transport": "platform",
"railway": "platform",
"ref": "9",
"train": "yes",
"wheelchair": "no",
"wheelchair:description": "Plattformlift ist vorhanden, Betriebsbereitschaft nach 8 Jahren stillstand fraglich.",
"width": "5"
}
}
,
{
"type": "area",
"id": 3600055060,
"tags": {
"TMC:cid_58:tabcd_1:Class": "Area",
"TMC:cid_58:tabcd_1:LCLversion": "8.00",
"TMC:cid_58:tabcd_1:LocationCode": "2550",
"admin_level": "8",
"boundary": "administrative",
"de:amtlicher_gemeindeschluessel": "05382068",
"de:place": "town",
"de:regionalschluessel": "053820068068",
"name": "Troisdorf",
"name:prefix": "Stadt",
"type": "boundary",
"wikidata": "Q3900",
"wikipedia": "de:Troisdorf"
}
}
,
{
"type": "area",
"id": 3605945175,
"tags": {
"addr:city": "Troisdorf",
"addr:postcode": "53840",
"description": "Troisdorf Bahnsteig Gleis 1+2",
"local_ref": "1;2",
"name": "Troisdorf",
"public_transport": "platform",
"railway": "platform",
"ref": "1/2",
"tactile_paving": "yes",
"train": "yes",
"type": "multipolygon",
"wheelchair": "yes"
}
}
,
{
"type": "area",
"id": 3605945176,
"tags": {
"addr:city": "Troisdorf",
"addr:postcode": "53840",
"description": "Troisdorf Bahnsteig Gleis 5+6",
"name": "Troisdorf",
"phone": "+49 221 1411055",
"public_transport": "platform",
"railway": "platform",
"ref": "5/6",
"tactile_paving": "yes",
"train": "yes",
"type": "multipolygon",
"wheelchair": "yes",
"wheelchair:description": "Der Aufzug zu diesem Bahnsteig ist oft defekt, bitte informieren. Betriebszustand kann bei 3S-Zentrale erfragt werden (siehe Telefonnummer, aber Vorsicht, die sind nicht immer informiert!)",
"width": "6"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2014-12-14T12:58:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "node",
"id": 50878400,
"lat": 50.7461788,
"lon": 7.1742257
},
{
"type": "node",
"id": 100793192,
"lat": 50.7468472,
"lon": 7.1709376,
"tags": {
"highway": "turning_circle"
}
},
{
"type": "node",
"id": 3233854234,
"lat": 50.7494236,
"lon": 7.1757664,
"timestamp": "2014-12-14T07:27:19Z",
"version": 1,
"changeset": 23456789,
"user": "TestUser",
"uid": 345678
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2014-12-21T20:00:03Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "relation",
"id": 2046898,
"timestamp": "2014-12-15T13:13:11Z",
"version": 12,
"changeset": 17433822,
"user": "Username",
"uid": 12345,
"members": [
{
"type": "node",
"ref": 507464632,
"role": "platform"
},
{
"type": "node",
"ref": 2252681768,
"role": "stop"
},
{
"type": "node",
"ref": 507464636,
"role": "platform"
},
{
"type": "node",
"ref": 1620886108,
"role": "stop"
},
{
"type": "way",
"ref": 4893348,
"role": ""
}
],
"tags": {
"from": "Here",
"name": "Test relation",
"ref": "609",
"route": "bus",
"to": "There",
"type": "route"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2014-12-14T13:34:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "node",
"id": 3233854233,
"lat": 50.7494187,
"lon": 7.1758731
},
{
"type": "node",
"id": 3233854234,
"lat": 50.7494287,
"lon": 7.1758731
},
{
"type": "node",
"id": 3233854235,
"lat": 50.7494287,
"lon": 7.1758731
},
{
"type": "way",
"id": 317146078,
"nodes": [
3233854233,
3233854234,
3233854235
]
},
{
"type": "relation",
"id": 2046898,
"timestamp": "2014-12-15T13:13:11Z",
"version": 12,
"changeset": 17433822,
"user": "Username",
"uid": 12345,
"members": [
{
"type": "node",
"ref": 3233854233,
"role": "platform"
},
{
"type": "node",
"ref": 3233854234,
"role": "stop"
},
{
"type": "node",
"ref": 3233854235,
"role": "platform"
},
{
"type": "way",
"ref": 317146078,
"role": ""
}
],
"tags": {
"from": "Here",
"name": "Test relation",
"ref": "609",
"route": "bus",
"to": "There",
"type": "route"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2016-11-23T20:28:03Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "relation",
"id": 23092,
"center": {
"lat": 50.8176646,
"lon": 7.0208539
},
"members": [
{
"type": "way",
"ref": 4334856,
"role": ""
},
{
"type": "way",
"ref": 234434903,
"role": ""
},
{
"type": "way",
"ref": 37881522,
"role": ""
},
{
"type": "way",
"ref": 37881521,
"role": ""
},
{
"type": "way",
"ref": 4356491,
"role": ""
},
{
"type": "way",
"ref": 235363211,
"role": ""
},
{
"type": "way",
"ref": 48290877,
"role": ""
},
{
"type": "way",
"ref": 210683519,
"role": ""
},
{
"type": "way",
"ref": 42743961,
"role": ""
},
{
"type": "way",
"ref": 210683522,
"role": ""
},
{
"type": "way",
"ref": 48290881,
"role": ""
},
{
"type": "way",
"ref": 235363214,
"role": ""
},
{
"type": "way",
"ref": 4400137,
"role": ""
},
{
"type": "way",
"ref": 230940375,
"role": ""
},
{
"type": "way",
"ref": 4400140,
"role": ""
},
{
"type": "way",
"ref": 4400142,
"role": ""
},
{
"type": "way",
"ref": 235824476,
"role": ""
},
{
"type": "way",
"ref": 4400143,
"role": ""
},
{
"type": "way",
"ref": 235824475,
"role": ""
},
{
"type": "way",
"ref": 178797123,
"role": ""
},
{
"type": "way",
"ref": 233553030,
"role": ""
},
{
"type": "way",
"ref": 4829989,
"role": ""
},
{
"type": "way",
"ref": 99834112,
"role": ""
},
{
"type": "way",
"ref": 133081219,
"role": ""
},
{
"type": "way",
"ref": 234434905,
"role": ""
},
{
"type": "way",
"ref": 20661567,
"role": ""
},
{
"type": "way",
"ref": 230941900,
"role": ""
},
{
"type": "way",
"ref": 20661568,
"role": ""
},
{
"type": "way",
"ref": 20661572,
"role": ""
},
{
"type": "way",
"ref": 230940374,
"role": ""
},
{
"type": "way",
"ref": 20661573,
"role": ""
},
{
"type": "way",
"ref": 20662817,
"role": ""
},
{
"type": "way",
"ref": 230941903,
"role": ""
},
{
"type": "way",
"ref": 20662819,
"role": ""
},
{
"type": "way",
"ref": 20662824,
"role": ""
},
{
"type": "way",
"ref": 20662827,
"role": ""
},
{
"type": "way",
"ref": 27492515,
"role": ""
},
{
"type": "way",
"ref": 129125122,
"role": ""
},
{
"type": "way",
"ref": 234434901,
"role": ""
},
{
"type": "way",
"ref": 234434904,
"role": ""
},
{
"type": "way",
"ref": 27492542,
"role": ""
},
{
"type": "way",
"ref": 27492543,
"role": ""
},
{
"type": "way",
"ref": 29233646,
"role": ""
},
{
"type": "way",
"ref": 235820561,
"role": ""
},
{
"type": "way",
"ref": 29233647,
"role": ""
},
{
"type": "way",
"ref": 235820559,
"role": ""
},
{
"type": "way",
"ref": 235820562,
"role": ""
},
{
"type": "way",
"ref": 29233648,
"role": ""
},
{
"type": "way",
"ref": 29382960,
"role": ""
},
{
"type": "way",
"ref": 271008229,
"role": ""
},
{
"type": "way",
"ref": 271008238,
"role": ""
},
{
"type": "way",
"ref": 271008230,
"role": ""
},
{
"type": "way",
"ref": 271008226,
"role": ""
},
{
"type": "way",
"ref": 40033062,
"role": ""
},
{
"type": "way",
"ref": 40033063,
"role": ""
},
{
"type": "way",
"ref": 29384561,
"role": ""
},
{
"type": "way",
"ref": 29384563,
"role": ""
},
{
"type": "way",
"ref": 271008224,
"role": ""
},
{
"type": "way",
"ref": 271008227,
"role": ""
},
{
"type": "way",
"ref": 271008237,
"role": ""
},
{
"type": "way",
"ref": 271008232,
"role": ""
},
{
"type": "way",
"ref": 271008239,
"role": ""
},
{
"type": "way",
"ref": 29384564,
"role": ""
},
{
"type": "way",
"ref": 31282638,
"role": ""
},
{
"type": "way",
"ref": 31282787,
"role": ""
},
{
"type": "way",
"ref": 383262762,
"role": ""
},
{
"type": "way",
"ref": 31304443,
"role": ""
},
{
"type": "way",
"ref": 128541594,
"role": ""
},
{
"type": "way",
"ref": 31304503,
"role": ""
},
{
"type": "way",
"ref": 31363881,
"role": ""
},
{
"type": "way",
"ref": 31363891,
"role": ""
},
{
"type": "way",
"ref": 31363892,
"role": ""
},
{
"type": "way",
"ref": 31363898,
"role": ""
},
{
"type": "way",
"ref": 31363910,
"role": ""
},
{
"type": "way",
"ref": 31364152,
"role": ""
},
{
"type": "way",
"ref": 31364158,
"role": ""
},
{
"type": "way",
"ref": 31364178,
"role": ""
},
{
"type": "way",
"ref": 31364384,
"role": ""
},
{
"type": "way",
"ref": 31364387,
"role": ""
},
{
"type": "way",
"ref": 31364484,
"role": ""
},
{
"type": "way",
"ref": 31364512,
"role": ""
},
{
"type": "way",
"ref": 31364656,
"role": ""
},
{
"type": "way",
"ref": 31364667,
"role": ""
},
{
"type": "way",
"ref": 271008234,
"role": ""
},
{
"type": "way",
"ref": 31364888,
"role": ""
},
{
"type": "way",
"ref": 122158730,
"role": ""
},
{
"type": "way",
"ref": 31364985,
"role": ""
},
{
"type": "way",
"ref": 271008235,
"role": ""
},
{
"type": "way",
"ref": 271008231,
"role": ""
},
{
"type": "way",
"ref": 271008233,
"role": ""
},
{
"type": "way",
"ref": 31365377,
"role": ""
},
{
"type": "way",
"ref": 31365425,
"role": ""
},
{
"type": "way",
"ref": 271008236,
"role": ""
},
{
"type": "way",
"ref": 36447898,
"role": ""
},
{
"type": "way",
"ref": 271008228,
"role": ""
},
{
"type": "way",
"ref": 31366812,
"role": ""
},
{
"type": "way",
"ref": 31366880,
"role": ""
},
{
"type": "way",
"ref": 31367017,
"role": ""
},
{
"type": "way",
"ref": 31367443,
"role": ""
},
{
"type": "way",
"ref": 31367449,
"role": ""
},
{
"type": "way",
"ref": 31367526,
"role": ""
},
{
"type": "way",
"ref": 31367534,
"role": ""
},
{
"type": "way",
"ref": 31369852,
"role": ""
},
{
"type": "way",
"ref": 449397558,
"role": ""
},
{
"type": "way",
"ref": 31797389,
"role": ""
},
{
"type": "way",
"ref": 31798039,
"role": ""
},
{
"type": "way",
"ref": 235363212,
"role": ""
},
{
"type": "way",
"ref": 156492546,
"role": ""
},
{
"type": "way",
"ref": 156492545,
"role": ""
},
{
"type": "way",
"ref": 130749935,
"role": ""
},
{
"type": "way",
"ref": 32472877,
"role": ""
},
{
"type": "way",
"ref": 31798988,
"role": ""
},
{
"type": "way",
"ref": 31798989,
"role": ""
},
{
"type": "way",
"ref": 235820560,
"role": ""
},
{
"type": "way",
"ref": 235820563,
"role": ""
},
{
"type": "way",
"ref": 235820564,
"role": ""
},
{
"type": "way",
"ref": 235820570,
"role": ""
},
{
"type": "way",
"ref": 32472855,
"role": ""
},
{
"type": "way",
"ref": 32472856,
"role": ""
},
{
"type": "way",
"ref": 37881520,
"role": ""
},
{
"type": "way",
"ref": 37881519,
"role": ""
},
{
"type": "way",
"ref": 234434902,
"role": ""
},
{
"type": "way",
"ref": 32472875,
"role": ""
},
{
"type": "way",
"ref": 32473071,
"role": ""
},
{
"type": "way",
"ref": 128522486,
"role": ""
},
{
"type": "way",
"ref": 36447896,
"role": ""
},
{
"type": "way",
"ref": 32473075,
"role": ""
},
{
"type": "way",
"ref": 32473086,
"role": ""
},
{
"type": "way",
"ref": 32473087,
"role": ""
},
{
"type": "way",
"ref": 40033064,
"role": ""
},
{
"type": "way",
"ref": 189189059,
"role": ""
},
{
"type": "way",
"ref": 271008225,
"role": ""
},
{
"type": "way",
"ref": 41550921,
"role": ""
}
],
"tags": {
"TMC:cid_58:tabcd_1:Class": "Road",
"TMC:cid_58:tabcd_1:LCLversion": "8.00",
"TMC:cid_58:tabcd_1:LocationCode": "7142",
"name": "Bundesautobahn 555",
"network": "BAB",
"operator": "Bundesrepublik Deutschland",
"ref": "A 555",
"route": "road",
"type": "route",
"wikipedia": "de:Bundesautobahn 555"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2016-11-24T21:40:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "relation",
"id": 23092,
"bounds": {
"minlat": 50.7432318,
"minlon": 6.9639432,
"maxlat": 50.8920975,
"maxlon": 7.0777645
},
"members": [
{
"type": "way",
"ref": 4334856,
"role": "",
"geometry": [
{ "lat": 50.8104598, "lon": 6.9871803 },
{ "lat": 50.8117239, "lon": 6.9849282 }
]
},
{
"type": "way",
"ref": 234434903,
"role": "",
"geometry": [
{ "lat": 50.8117239, "lon": 6.9849282 },
{ "lat": 50.8137408, "lon": 6.9813352 }
]
},
{
"type": "way",
"ref": 37881522,
"role": "",
"geometry": [
{ "lat": 50.8137408, "lon": 6.9813352 },
{ "lat": 50.8140146, "lon": 6.9808445 }
]
},
{
"type": "way",
"ref": 37881521,
"role": "",
"geometry": [
{ "lat": 50.8140146, "lon": 6.9808445 },
{ "lat": 50.8193541, "lon": 6.9713457 },
{ "lat": 50.8203182, "lon": 6.9697248 },
{ "lat": 50.8210652, "lon": 6.9685758 },
{ "lat": 50.8217885, "lon": 6.9676136 },
{ "lat": 50.8225495, "lon": 6.9667439 },
{ "lat": 50.8233005, "lon": 6.9660515 },
{ "lat": 50.8238128, "lon": 6.9656463 },
{ "lat": 50.8243279, "lon": 6.9653077 }
]
},
{
"type": "way",
"ref": 4356491,
"role": "",
"geometry": [
{ "lat": 50.7433997, "lon": 7.0777645 },
{ "lat": 50.7434097, "lon": 7.0775890 },
{ "lat": 50.7434629, "lon": 7.0774402 },
{ "lat": 50.7435198, "lon": 7.0773718 },
{ "lat": 50.7437507, "lon": 7.0771524 }
]
},
{
"type": "way",
"ref": 235363211,
"role": "",
"geometry": [
{ "lat": 50.7437507, "lon": 7.0771524 },
{ "lat": 50.7446592, "lon": 7.0762926 }
]
},
{
"type": "way",
"ref": 48290877,
"role": "",
"geometry": [
{ "lat": 50.7446592, "lon": 7.0762926 },
{ "lat": 50.7450803, "lon": 7.0757571 },
{ "lat": 50.7453888, "lon": 7.0753312 },
{ "lat": 50.7457125, "lon": 7.0748518 },
{ "lat": 50.7460370, "lon": 7.0743265 },
{ "lat": 50.7462718, "lon": 7.0739425 },
{ "lat": 50.7464798, "lon": 7.0735173 },
{ "lat": 50.7468359, "lon": 7.0727449 }
]
},
{
"type": "way",
"ref": 210683519,
"role": "",
"geometry": [
{ "lat": 50.7468359, "lon": 7.0727449 },
{ "lat": 50.7471006, "lon": 7.0720546 },
{ "lat": 50.7473135, "lon": 7.0714640 },
{ "lat": 50.7475199, "lon": 7.0708095 },
{ "lat": 50.7479418, "lon": 7.0693723 }
]
},
{
"type": "way",
"ref": 42743961,
"role": "",
"geometry": [
{ "lat": 50.7464112, "lon": 7.0734310 },
{ "lat": 50.7459053, "lon": 7.0743560 },
{ "lat": 50.7457638, "lon": 7.0745740 }
]
},
{
"type": "way",
"ref": 210683522,
"role": "",
"geometry": [
{ "lat": 50.7457638, "lon": 7.0745740 },
{ "lat": 50.7456300, "lon": 7.0747409 },
{ "lat": 50.7454858, "lon": 7.0749187 },
{ "lat": 50.7452550, "lon": 7.0752554 },
{ "lat": 50.7450000, "lon": 7.0756385 },
{ "lat": 50.7448878, "lon": 7.0758027 },
{ "lat": 50.7447522, "lon": 7.0759730 },
{ "lat": 50.7445514, "lon": 7.0762032 },
{ "lat": 50.7443577, "lon": 7.0764098 },
{ "lat": 50.7441185, "lon": 7.0766490 }
]
},
{
"type": "way",
"ref": 48290881,
"role": "",
"geometry": [
{ "lat": 50.7441185, "lon": 7.0766490 },
{ "lat": 50.7439033, "lon": 7.0768575 },
{ "lat": 50.7437722, "lon": 7.0769631 },
{ "lat": 50.7436609, "lon": 7.0770394 }
]
},
{
"type": "way",
"ref": 235363214,
"role": "",
"geometry": [
{ "lat": 50.7436609, "lon": 7.0770394 },
{ "lat": 50.7435688, "lon": 7.0771154 },
{ "lat": 50.7434662, "lon": 7.0771906 },
{ "lat": 50.7434058, "lon": 7.0772230 },
{ "lat": 50.7433331, "lon": 7.0772525 },
{ "lat": 50.7432822, "lon": 7.0772636 },
{ "lat": 50.7432318, "lon": 7.0772601 }
]
},
{
"type": "way",
"ref": 4400137,
"role": "",
"geometry": [
{ "lat": 50.8887155, "lon": 6.9676900 },
{ "lat": 50.8876384, "lon": 6.9678150 }
]
},
{
"type": "way",
"ref": 230940375,
"role": "",
"geometry": [
{ "lat": 50.8876384, "lon": 6.9678150 },
{ "lat": 50.8870572, "lon": 6.9679058 },
{ "lat": 50.8858563, "lon": 6.9680103 }
]
},
{
"type": "way",
"ref": 4400140,
"role": "",
"geometry": [
{ "lat": 50.8797318, "lon": 6.9690108 },
{ "lat": 50.8799208, "lon": 6.9689396 },
{ "lat": 50.8807058, "lon": 6.9688470 },
{ "lat": 50.8824762, "lon": 6.9687068 }
]
},
{
"type": "way",
"ref": 4400142,
"role": "",
"geometry": [
{ "lat": 50.8919691, "lon": 6.9670292 },
{ "lat": 50.8918982, "lon": 6.9671419 },
{ "lat": 50.8918068, "lon": 6.9672404 },
{ "lat": 50.8917186, "lon": 6.9673001 },
{ "lat": 50.8916153, "lon": 6.9673480 },
{ "lat": 50.8914588, "lon": 6.9673816 }
]
},
{
"type": "way",
"ref": 235824476,
"role": "",
"geometry": [
{ "lat": 50.8914588, "lon": 6.9673816 },
{ "lat": 50.8892470, "lon": 6.9676302 },
{ "lat": 50.8887155, "lon": 6.9676900 }
]
},
{
"type": "way",
"ref": 4400143,
"role": "",
"geometry": [
{ "lat": 50.8887787, "lon": 6.9681629 },
{ "lat": 50.8896224, "lon": 6.9680604 },
{ "lat": 50.8897525, "lon": 6.9680446 }
]
},
{
"type": "way",
"ref": 235824475,
"role": "",
"geometry": [
{ "lat": 50.8897525, "lon": 6.9680446 },
{ "lat": 50.8906556, "lon": 6.9679349 },
{ "lat": 50.8912013, "lon": 6.9678862 }
]
},
{
"type": "way",
"ref": 178797123,
"role": "",
"geometry": [
{ "lat": 50.8912013, "lon": 6.9678862 },
{ "lat": 50.8913492, "lon": 6.9678648 }
]
},
{
"type": "way",
"ref": 233553030,
"role": "",
"geometry": [
{ "lat": 50.8913492, "lon": 6.9678648 },
{ "lat": 50.8916648, "lon": 6.9677762 },
{ "lat": 50.8917895, "lon": 6.9677694 },
{ "lat": 50.8919294, "lon": 6.9677947 },
{ "lat": 50.8920975, "lon": 6.9678618 }
]
},
{
"type": "way",
"ref": 4829989,
"role": "",
"geometry": [
{ "lat": 50.8105743, "lon": 6.9865001 },
{ "lat": 50.8088268, "lon": 6.9896207 }
]
},
{
"type": "way",
"ref": 99834112,
"role": "",
"geometry": [
{ "lat": 50.8088268, "lon": 6.9896207 },
{ "lat": 50.8066272, "lon": 6.9935457 },
{ "lat": 50.8057165, "lon": 6.9951151 }
]
},
{
"type": "way",
"ref": 133081219,
"role": "",
"geometry": [
{ "lat": 50.8057165, "lon": 6.9951151 },
{ "lat": 50.8050332, "lon": 6.9962100 },
{ "lat": 50.8043133, "lon": 6.9972614 }
]
},
{
"type": "way",
"ref": 234434905,
"role": "",
"geometry": [
{ "lat": 50.8043133, "lon": 6.9972614 },
{ "lat": 50.8038004, "lon": 6.9979304 },
{ "lat": 50.8032120, "lon": 6.9986363 },
{ "lat": 50.8029818, "lon": 6.9989181 }
]
},
{
"type": "way",
"ref": 20661567,
"role": "",
"geometry": [
{ "lat": 50.8849681, "lon": 6.9681126 },
{ "lat": 50.8839667, "lon": 6.9682524 },
{ "lat": 50.8829770, "lon": 6.9684059 }
]
},
{
"type": "way",
"ref": 230941900,
"role": "",
"geometry": [
{ "lat": 50.8829770, "lon": 6.9684059 },
{ "lat": 50.8826286, "lon": 6.9684595 }
]
},
{
"type": "way",
"ref": 20661568,
"role": "",
"geometry": [
{ "lat": 50.8850872, "lon": 6.9685052 },
{ "lat": 50.8859127, "lon": 6.9684079 }
]
},
{
"type": "way",
"ref": 20661572,
"role": "",
"geometry": [
{ "lat": 50.8859127, "lon": 6.9684079 },
{ "lat": 50.8872823, "lon": 6.9682592 },
{ "lat": 50.8876807, "lon": 6.9682539 }
]
},
{
"type": "way",
"ref": 230940374,
"role": "",
"geometry": [
{ "lat": 50.8876807, "lon": 6.9682539 },
{ "lat": 50.8887787, "lon": 6.9681629 }
]
},
{
"type": "way",
"ref": 20661573,
"role": "",
"geometry": [
{ "lat": 50.8858563, "lon": 6.9680103 },
{ "lat": 50.8849681, "lon": 6.9681126 }
]
},
{
"type": "way",
"ref": 20662817,
"role": "",
"geometry": [
{ "lat": 50.8823655, "lon": 6.9684998 },
{ "lat": 50.8806620, "lon": 6.9686453 }
]
},
{
"type": "way",
"ref": 230941903,
"role": "",
"geometry": [
{ "lat": 50.8806620, "lon": 6.9686453 },
{ "lat": 50.8793943, "lon": 6.9687847 }
]
},
{
"type": "way",
"ref": 20662819,
"role": "",
"geometry": [
{ "lat": 50.8824762, "lon": 6.9687068 },
{ "lat": 50.8827522, "lon": 6.9686901 }
]
},
{
"type": "way",
"ref": 20662824,
"role": "",
"geometry": [
{ "lat": 50.8827522, "lon": 6.9686901 },
{ "lat": 50.8839133, "lon": 6.9686122 },
{ "lat": 50.8850872, "lon": 6.9685052 }
]
},
{
"type": "way",
"ref": 20662827,
"role": "",
"geometry": [
{ "lat": 50.8826286, "lon": 6.9684595 },
{ "lat": 50.8823655, "lon": 6.9684998 }
]
},
{
"type": "way",
"ref": 27492515,
"role": "",
"geometry": [
{ "lat": 50.8029818, "lon": 6.9989181 },
{ "lat": 50.8026288, "lon": 6.9992932 }
]
},
{
"type": "way",
"ref": 129125122,
"role": "",
"geometry": [
{ "lat": 50.8093979, "lon": 6.9890430 },
{ "lat": 50.8104598, "lon": 6.9871803 }
]
},
{
"type": "way",
"ref": 234434901,
"role": "",
"geometry": [
{ "lat": 50.8063753, "lon": 6.9944172 },
{ "lat": 50.8093979, "lon": 6.9890430 }
]
},
{
"type": "way",
"ref": 234434904,
"role": "",
"geometry": [
{ "lat": 50.8053262, "lon": 6.9961817 },
{ "lat": 50.8058108, "lon": 6.9953914 },
{ "lat": 50.8063753, "lon": 6.9944172 }
]
},
{
"type": "way",
"ref": 27492542,
"role": "",
"geometry": [
{ "lat": 50.8029899, "lon": 6.9991939 },
{ "lat": 50.8032828, "lon": 6.9988807 },
{ "lat": 50.8038702, "lon": 6.9982129 },
{ "lat": 50.8044350, "lon": 6.9974695 },
{ "lat": 50.8053262, "lon": 6.9961817 }
]
},
{
"type": "way",
"ref": 27492543,
"role": "",
"geometry": [
{ "lat": 50.8026483, "lon": 6.9995590 },
{ "lat": 50.8029899, "lon": 6.9991939 }
]
},
{
"type": "way",
"ref": 29233646,
"role": "",
"geometry": [
{ "lat": 50.8793943, "lon": 6.9687847 },
{ "lat": 50.8716935, "lon": 6.9696241 },
{ "lat": 50.8701666, "lon": 6.9697243 },
{ "lat": 50.8688585, "lon": 6.9697057 },
{ "lat": 50.8652424, "lon": 6.9693872 }
]
},
{
"type": "way",
"ref": 235820561,
"role": "",
"geometry": [
{ "lat": 50.8652424, "lon": 6.9693872 },
{ "lat": 50.8636340, "lon": 6.9692339 }
]
},
{
"type": "way",
"ref": 29233647,
"role": "",
"geometry": [
{ "lat": 50.8636340, "lon": 6.9692339 },
{ "lat": 50.8608791, "lon": 6.9689787 }
]
},
{
"type": "way",
"ref": 235820559,
"role": "",
"geometry": [
{ "lat": 50.8608791, "lon": 6.9689787 },
{ "lat": 50.8590168, "lon": 6.9688055 }
]
},
{
"type": "way",
"ref": 235820562,
"role": "",
"geometry": [
{ "lat": 50.8590168, "lon": 6.9688055 },
{ "lat": 50.8523854, "lon": 6.9681888 }
]
},
{
"type": "way",
"ref": 29233648,
"role": "",
"geometry": [
{ "lat": 50.8522171, "lon": 6.9684787 },
{ "lat": 50.8590359, "lon": 6.9691023 }
]
},
{
"type": "way",
"ref": 29382960,
"role": "",
"geometry": [
{ "lat": 50.8391695, "lon": 6.9667285 },
{ "lat": 50.8411491, "lon": 6.9672118 },
{ "lat": 50.8425706, "lon": 6.9674985 }
]
},
{
"type": "way",
"ref": 271008229,
"role": "",
"geometry": [
{ "lat": 50.8425706, "lon": 6.9674985 },
{ "lat": 50.8443277, "lon": 6.9677563 }
]
},
{
"type": "way",
"ref": 271008238,
"role": "",
"geometry": [
{ "lat": 50.8443277, "lon": 6.9677563 },
{ "lat": 50.8453254, "lon": 6.9678465 },
{ "lat": 50.8468114, "lon": 6.9679862 }
]
},
{
"type": "way",
"ref": 271008230,
"role": "",
"geometry": [
{ "lat": 50.8468114, "lon": 6.9679862 },
{ "lat": 50.8491169, "lon": 6.9681907 }
]
},
{
"type": "way",
"ref": 271008226,
"role": "",
"geometry": [
{ "lat": 50.8491169, "lon": 6.9681907 },
{ "lat": 50.8518181, "lon": 6.9684403 }
]
},
{
"type": "way",
"ref": 40033062,
"role": "",
"geometry": [
{ "lat": 50.8391857, "lon": 6.9664246 },
{ "lat": 50.8386690, "lon": 6.9662911 }
]
},
{
"type": "way",
"ref": 40033063,
"role": "",
"geometry": [
{ "lat": 50.8386690, "lon": 6.9662911 },
{ "lat": 50.8314332, "lon": 6.9644546 }
]
},
{
"type": "way",
"ref": 29384561,
"role": "",
"geometry": [
{ "lat": 50.8523854, "lon": 6.9681888 },
{ "lat": 50.8519590, "lon": 6.9681595 }
]
},
{
"type": "way",
"ref": 29384563,
"role": "",
"geometry": [
{ "lat": 50.8519590, "lon": 6.9681595 },
{ "lat": 50.8506534, "lon": 6.9680320 }
]
},
{
"type": "way",
"ref": 271008224,
"role": "",
"geometry": [
{ "lat": 50.8506534, "lon": 6.9680320 },
{ "lat": 50.8490308, "lon": 6.9678717 }
]
},
{
"type": "way",
"ref": 271008227,
"role": "",
"geometry": [
{ "lat": 50.8490308, "lon": 6.9678717 },
{ "lat": 50.8478121, "lon": 6.9677589 }
]
},
{
"type": "way",
"ref": 271008237,
"role": "",
"geometry": [
{ "lat": 50.8478121, "lon": 6.9677589 },
{ "lat": 50.8459552, "lon": 6.9676249 },
{ "lat": 50.8451822, "lon": 6.9675256 }
]
},
{
"type": "way",
"ref": 271008232,
"role": "",
"geometry": [
{ "lat": 50.8451822, "lon": 6.9675256 },
{ "lat": 50.8433946, "lon": 6.9673373 }
]
},
{
"type": "way",
"ref": 271008239,
"role": "",
"geometry": [
{ "lat": 50.8433946, "lon": 6.9673373 },
{ "lat": 50.8424071, "lon": 6.9671724 },
{ "lat": 50.8411984, "lon": 6.9669289 },
{ "lat": 50.8391857, "lon": 6.9664246 }
]
},
{
"type": "way",
"ref": 29384564,
"role": "",
"geometry": [
{ "lat": 50.8518181, "lon": 6.9684403 },
{ "lat": 50.8522171, "lon": 6.9684787 }
]
},
{
"type": "way",
"ref": 31282638,
"role": "",
"geometry": [
{ "lat": 50.7547305, "lon": 7.0468957 },
{ "lat": 50.7550333, "lon": 7.0462257 }
]
},
{
"type": "way",
"ref": 31282787,
"role": "",
"geometry": [
{ "lat": 50.7548175, "lon": 7.0462659 },
{ "lat": 50.7545192, "lon": 7.0469416 }
]
},
{
"type": "way",
"ref": 383262762,
"role": "",
"geometry": [
{ "lat": 50.7545192, "lon": 7.0469416 },
{ "lat": 50.7522859, "lon": 7.0519784 },
{ "lat": 50.7519030, "lon": 7.0528750 }
]
},
{
"type": "way",
"ref": 31304443,
"role": "",
"geometry": [
{ "lat": 50.7519030, "lon": 7.0528750 },
{ "lat": 50.7514373, "lon": 7.0540731 },
{ "lat": 50.7512408, "lon": 7.0546346 },
{ "lat": 50.7511231, "lon": 7.0549962 },
{ "lat": 50.7508172, "lon": 7.0560135 }
]
},
{
"type": "way",
"ref": 128541594,
"role": "",
"geometry": [
{ "lat": 50.7508172, "lon": 7.0560135 },
{ "lat": 50.7504938, "lon": 7.0572440 }
]
},
{
"type": "way",
"ref": 31304503,
"role": "",
"geometry": [
{ "lat": 50.7509429, "lon": 7.0561605 },
{ "lat": 50.7512483, "lon": 7.0551357 },
{ "lat": 50.7513759, "lon": 7.0547500 },
{ "lat": 50.7515670, "lon": 7.0542197 },
{ "lat": 50.7520213, "lon": 7.0530348 },
{ "lat": 50.7524214, "lon": 7.0520935 },
{ "lat": 50.7547305, "lon": 7.0468957 }
]
},
{
"type": "way",
"ref": 31363881,
"role": "",
"geometry": [
{ "lat": 50.8026288, "lon": 6.9992932 },
{ "lat": 50.8018617, "lon": 7.0000625 },
{ "lat": 50.8010270, "lon": 7.0007950 },
{ "lat": 50.8001164, "lon": 7.0015291 },
{ "lat": 50.7928343, "lon": 7.0072406 },
{ "lat": 50.7832350, "lon": 7.0147268 },
{ "lat": 50.7826087, "lon": 7.0151803 }
]
},
{
"type": "way",
"ref": 31363891,
"role": "",
"geometry": [
{ "lat": 50.7826087, "lon": 7.0151803 },
{ "lat": 50.7823221, "lon": 7.0153822 }
]
},
{
"type": "way",
"ref": 31363892,
"role": "",
"geometry": [
{ "lat": 50.7823221, "lon": 7.0153822 },
{ "lat": 50.7802850, "lon": 7.0170023 },
{ "lat": 50.7782200, "lon": 7.0186241 }
]
},
{
"type": "way",
"ref": 31363898,
"role": "",
"geometry": [
{ "lat": 50.7826777, "lon": 7.0153975 },
{ "lat": 50.7833048, "lon": 7.0149295 },
{ "lat": 50.8001641, "lon": 7.0017836 },
{ "lat": 50.8010947, "lon": 7.0010142 },
{ "lat": 50.8019538, "lon": 7.0002540 },
{ "lat": 50.8026483, "lon": 6.9995590 }
]
},
{
"type": "way",
"ref": 31363910,
"role": "",
"geometry": [
{ "lat": 50.7823930, "lon": 7.0156008 },
{ "lat": 50.7826777, "lon": 7.0153975 }
]
},
{
"type": "way",
"ref": 31364152,
"role": "",
"geometry": [
{ "lat": 50.7782200, "lon": 7.0186241 },
{ "lat": 50.7779774, "lon": 7.0188037 }
]
},
{
"type": "way",
"ref": 31364158,
"role": "",
"geometry": [
{ "lat": 50.7783056, "lon": 7.0188240 },
{ "lat": 50.7788577, "lon": 7.0183860 },
{ "lat": 50.7803473, "lon": 7.0172040 },
{ "lat": 50.7816582, "lon": 7.0161766 },
{ "lat": 50.7823930, "lon": 7.0156008 }
]
},
{
"type": "way",
"ref": 31364178,
"role": "",
"geometry": [
{ "lat": 50.7780676, "lon": 7.0190054 },
{ "lat": 50.7783056, "lon": 7.0188240 }
]
},
{
"type": "way",
"ref": 31364384,
"role": "",
"geometry": [
{ "lat": 50.7749036, "lon": 7.0214625 },
{ "lat": 50.7780676, "lon": 7.0190054 }
]
},
{
"type": "way",
"ref": 31364387,
"role": "",
"geometry": [
{ "lat": 50.7744886, "lon": 7.0214841 },
{ "lat": 50.7712930, "lon": 7.0240315 },
{ "lat": 50.7695809, "lon": 7.0254447 },
{ "lat": 50.7686243, "lon": 7.0263151 }
]
},
{
"type": "way",
"ref": 31364484,
"role": "",
"geometry": [
{ "lat": 50.7748248, "lon": 7.0212347 },
{ "lat": 50.7744886, "lon": 7.0214841 }
]
},
{
"type": "way",
"ref": 31364512,
"role": "",
"geometry": [
{ "lat": 50.7745735, "lon": 7.0217089 },
{ "lat": 50.7749036, "lon": 7.0214625 }
]
},
{
"type": "way",
"ref": 31364656,
"role": "",
"geometry": [
{ "lat": 50.7686546, "lon": 7.0266216 },
{ "lat": 50.7696586, "lon": 7.0256891 },
{ "lat": 50.7713905, "lon": 7.0242565 },
{ "lat": 50.7745735, "lon": 7.0217089 }
]
},
{
"type": "way",
"ref": 31364667,
"role": "",
"geometry": [
{ "lat": 50.7686243, "lon": 7.0263151 },
{ "lat": 50.7676165, "lon": 7.0273126 },
{ "lat": 50.7665957, "lon": 7.0283332 },
{ "lat": 50.7653333, "lon": 7.0297134 }
]
},
{
"type": "way",
"ref": 271008234,
"role": "",
"geometry": [
{ "lat": 50.7653333, "lon": 7.0297134 },
{ "lat": 50.7643799, "lon": 7.0308081 }
]
},
{
"type": "way",
"ref": 31364888,
"role": "",
"geometry": [
{ "lat": 50.7635269, "lon": 7.0321873 },
{ "lat": 50.7641966, "lon": 7.0313729 }
]
},
{
"type": "way",
"ref": 122158730,
"role": "",
"geometry": [
{ "lat": 50.7641966, "lon": 7.0313729 },
{ "lat": 50.7644716, "lon": 7.0310241 }
]
},
{
"type": "way",
"ref": 31364985,
"role": "",
"geometry": [
{ "lat": 50.7644716, "lon": 7.0310241 },
{ "lat": 50.7648596, "lon": 7.0305814 }
]
},
{
"type": "way",
"ref": 271008235,
"role": "",
"geometry": [
{ "lat": 50.7648596, "lon": 7.0305814 },
{ "lat": 50.7657812, "lon": 7.0295145 },
{ "lat": 50.7666465, "lon": 7.0285903 }
]
},
{
"type": "way",
"ref": 271008231,
"role": "",
"geometry": [
{ "lat": 50.7666465, "lon": 7.0285903 },
{ "lat": 50.7679887, "lon": 7.0272481 }
]
},
{
"type": "way",
"ref": 271008233,
"role": "",
"geometry": [
{ "lat": 50.7679887, "lon": 7.0272481 },
{ "lat": 50.7686546, "lon": 7.0266216 }
]
},
{
"type": "way",
"ref": 31365377,
"role": "",
"geometry": [
{ "lat": 50.7643799, "lon": 7.0308081 },
{ "lat": 50.7640807, "lon": 7.0311662 }
]
},
{
"type": "way",
"ref": 31365425,
"role": "",
"geometry": [
{ "lat": 50.7640807, "lon": 7.0311662 },
{ "lat": 50.7638566, "lon": 7.0314272 }
]
},
{
"type": "way",
"ref": 271008236,
"role": "",
"geometry": [
{ "lat": 50.7638566, "lon": 7.0314272 },
{ "lat": 50.7628914, "lon": 7.0326760 },
{ "lat": 50.7621053, "lon": 7.0336961 }
]
},
{
"type": "way",
"ref": 36447898,
"role": "",
"geometry": [
{ "lat": 50.7621053, "lon": 7.0336961 },
{ "lat": 50.7613433, "lon": 7.0347526 }
]
},
{
"type": "way",
"ref": 271008228,
"role": "",
"geometry": [
{ "lat": 50.7613433, "lon": 7.0347526 },
{ "lat": 50.7608295, "lon": 7.0354890 }
]
},
{
"type": "way",
"ref": 31366812,
"role": "",
"geometry": [
{ "lat": 50.7588227, "lon": 7.0386254 },
{ "lat": 50.7583011, "lon": 7.0394929 },
{ "lat": 50.7576749, "lon": 7.0405773 },
{ "lat": 50.7569096, "lon": 7.0419812 },
{ "lat": 50.7558745, "lon": 7.0439976 },
{ "lat": 50.7548175, "lon": 7.0462659 }
]
},
{
"type": "way",
"ref": 31366880,
"role": "",
"geometry": [
{ "lat": 50.7550333, "lon": 7.0462257 },
{ "lat": 50.7559939, "lon": 7.0442408 },
{ "lat": 50.7570656, "lon": 7.0421620 },
{ "lat": 50.7578037, "lon": 7.0408023 },
{ "lat": 50.7584541, "lon": 7.0396561 },
{ "lat": 50.7589669, "lon": 7.0387984 }
]
},
{
"type": "way",
"ref": 31367017,
"role": "",
"geometry": [
{ "lat": 50.7609333, "lon": 7.0356976 },
{ "lat": 50.7619690, "lon": 7.0342371 },
{ "lat": 50.7630051, "lon": 7.0328461 },
{ "lat": 50.7635269, "lon": 7.0321873 }
]
},
{
"type": "way",
"ref": 31367443,
"role": "",
"geometry": [
{ "lat": 50.7607331, "lon": 7.0359794 },
{ "lat": 50.7609333, "lon": 7.0356976 }
]
},
{
"type": "way",
"ref": 31367449,
"role": "",
"geometry": [
{ "lat": 50.7589669, "lon": 7.0387984 },
{ "lat": 50.7602933, "lon": 7.0366481 },
{ "lat": 50.7607331, "lon": 7.0359794 }
]
},
{
"type": "way",
"ref": 31367526,
"role": "",
"geometry": [
{ "lat": 50.7606164, "lon": 7.0358121 },
{ "lat": 50.7601681, "lon": 7.0365126 },
{ "lat": 50.7588227, "lon": 7.0386254 }
]
},
{
"type": "way",
"ref": 31367534,
"role": "",
"geometry": [
{ "lat": 50.7608295, "lon": 7.0354890 },
{ "lat": 50.7606164, "lon": 7.0358121 }
]
},
{
"type": "way",
"ref": 31369852,
"role": "",
"geometry": [
{ "lat": 50.7779774, "lon": 7.0188037 },
{ "lat": 50.7748248, "lon": 7.0212347 }
]
},
{
"type": "way",
"ref": 449397558,
"role": "",
"geometry": [
{ "lat": 50.7479418, "lon": 7.0693723 },
{ "lat": 50.7494783, "lon": 7.0624630 }
]
},
{
"type": "way",
"ref": 31797389,
"role": "",
"geometry": [
{ "lat": 50.7494783, "lon": 7.0624630 },
{ "lat": 50.7502727, "lon": 7.0588905 },
{ "lat": 50.7506441, "lon": 7.0572942 },
{ "lat": 50.7509429, "lon": 7.0561605 }
]
},
{
"type": "way",
"ref": 31798039,
"role": "",
"geometry": [
{ "lat": 50.7504938, "lon": 7.0572440 },
{ "lat": 50.7501306, "lon": 7.0588140 }
]
},
{
"type": "way",
"ref": 235363212,
"role": "",
"geometry": [
{ "lat": 50.7501306, "lon": 7.0588140 },
{ "lat": 50.7492636, "lon": 7.0626737 },
{ "lat": 50.7489407, "lon": 7.0641605 }
]
},
{
"type": "way",
"ref": 156492546,
"role": "",
"geometry": [
{ "lat": 50.7489407, "lon": 7.0641605 },
{ "lat": 50.7488307, "lon": 7.0647205 },
{ "lat": 50.7483739, "lon": 7.0668216 }
]
},
{
"type": "way",
"ref": 156492545,
"role": "",
"geometry": [
{ "lat": 50.7483739, "lon": 7.0668216 },
{ "lat": 50.7483009, "lon": 7.0672440 },
{ "lat": 50.7478400, "lon": 7.0692844 }
]
},
{
"type": "way",
"ref": 130749935,
"role": "",
"geometry": [
{ "lat": 50.7478400, "lon": 7.0692844 },
{ "lat": 50.7477294, "lon": 7.0697394 },
{ "lat": 50.7476187, "lon": 7.0701855 },
{ "lat": 50.7474997, "lon": 7.0706232 },
{ "lat": 50.7473468, "lon": 7.0711189 },
{ "lat": 50.7472087, "lon": 7.0715434 },
{ "lat": 50.7470472, "lon": 7.0719838 },
{ "lat": 50.7469114, "lon": 7.0723163 },
{ "lat": 50.7467733, "lon": 7.0726489 },
{ "lat": 50.7465937, "lon": 7.0730580 },
{ "lat": 50.7464112, "lon": 7.0734310 }
]
},
{
"type": "way",
"ref": 32472877,
"role": "",
"geometry": [
{ "lat": 50.8246828, "lon": 6.9651077 },
{ "lat": 50.8253375, "lon": 6.9647718 },
{ "lat": 50.8260000, "lon": 6.9645354 },
{ "lat": 50.8266134, "lon": 6.9643649 },
{ "lat": 50.8272671, "lon": 6.9642646 },
{ "lat": 50.8278017, "lon": 6.9642349 }
]
},
{
"type": "way",
"ref": 31798988,
"role": "",
"geometry": [
{ "lat": 50.8278017, "lon": 6.9642349 },
{ "lat": 50.8284805, "lon": 6.9642342 },
{ "lat": 50.8294617, "lon": 6.9643395 },
{ "lat": 50.8302437, "lon": 6.9644810 },
{ "lat": 50.8309474, "lon": 6.9646345 }
]
},
{
"type": "way",
"ref": 31798989,
"role": "",
"geometry": [
{ "lat": 50.8590359, "lon": 6.9691023 },
{ "lat": 50.8634113, "lon": 6.9695191 }
]
},
{
"type": "way",
"ref": 235820560,
"role": "",
"geometry": [
{ "lat": 50.8634113, "lon": 6.9695191 },
{ "lat": 50.8656224, "lon": 6.9697185 }
]
},
{
"type": "way",
"ref": 235820563,
"role": "",
"geometry": [
{ "lat": 50.8656224, "lon": 6.9697185 },
{ "lat": 50.8679633, "lon": 6.9699314 }
]
},
{
"type": "way",
"ref": 235820564,
"role": "",
"geometry": [
{ "lat": 50.8679633, "lon": 6.9699314 },
{ "lat": 50.8691580, "lon": 6.9700171 },
{ "lat": 50.8699302, "lon": 6.9700221 }
]
},
{
"type": "way",
"ref": 235820570,
"role": "",
"geometry": [
{ "lat": 50.8699302, "lon": 6.9700221 },
{ "lat": 50.8717399, "lon": 6.9699121 },
{ "lat": 50.8746263, "lon": 6.9695939 }
]
},
{
"type": "way",
"ref": 32472855,
"role": "",
"geometry": [
{ "lat": 50.8246253, "lon": 6.9648384 },
{ "lat": 50.8242516, "lon": 6.9650453 }
]
},
{
"type": "way",
"ref": 32472856,
"role": "",
"geometry": [
{ "lat": 50.8242516, "lon": 6.9650453 },
{ "lat": 50.8237235, "lon": 6.9653841 },
{ "lat": 50.8232034, "lon": 6.9657948 },
{ "lat": 50.8224317, "lon": 6.9665263 },
{ "lat": 50.8216642, "lon": 6.9673886 },
{ "lat": 50.8209037, "lon": 6.9684049 },
{ "lat": 50.8201541, "lon": 6.9695500 },
{ "lat": 50.8192181, "lon": 6.9711445 },
{ "lat": 50.8138575, "lon": 6.9806731 }
]
},
{
"type": "way",
"ref": 37881520,
"role": "",
"geometry": [
{ "lat": 50.8138575, "lon": 6.9806731 },
{ "lat": 50.8135770, "lon": 6.9811721 }
]
},
{
"type": "way",
"ref": 37881519,
"role": "",
"geometry": [
{ "lat": 50.8135770, "lon": 6.9811721 },
{ "lat": 50.8113547, "lon": 6.9851361 }
]
},
{
"type": "way",
"ref": 234434902,
"role": "",
"geometry": [
{ "lat": 50.8113547, "lon": 6.9851361 },
{ "lat": 50.8105743, "lon": 6.9865001 }
]
},
{
"type": "way",
"ref": 32472875,
"role": "",
"geometry": [
{ "lat": 50.8243279, "lon": 6.9653077 },
{ "lat": 50.8246828, "lon": 6.9651077 }
]
},
{
"type": "way",
"ref": 32473071,
"role": "",
"geometry": [
{ "lat": 50.8309464, "lon": 6.9643368 },
{ "lat": 50.8302815, "lon": 6.9641912 }
]
},
{
"type": "way",
"ref": 128522486,
"role": "",
"geometry": [
{ "lat": 50.8302815, "lon": 6.9641912 },
{ "lat": 50.8294728, "lon": 6.9640448 },
{ "lat": 50.8284964, "lon": 6.9639463 },
{ "lat": 50.8277970, "lon": 6.9639432 }
]
},
{
"type": "way",
"ref": 36447896,
"role": "",
"geometry": [
{ "lat": 50.8277970, "lon": 6.9639432 },
{ "lat": 50.8272631, "lon": 6.9639682 },
{ "lat": 50.8265661, "lon": 6.9640827 },
{ "lat": 50.8259717, "lon": 6.9642405 },
{ "lat": 50.8252714, "lon": 6.9645096 },
{ "lat": 50.8246253, "lon": 6.9648384 }
]
},
{
"type": "way",
"ref": 32473075,
"role": "",
"geometry": [
{ "lat": 50.8314332, "lon": 6.9644546 },
{ "lat": 50.8309464, "lon": 6.9643368 }
]
},
{
"type": "way",
"ref": 32473086,
"role": "",
"geometry": [
{ "lat": 50.8309474, "lon": 6.9646345 },
{ "lat": 50.8314534, "lon": 6.9647679 }
]
},
{
"type": "way",
"ref": 32473087,
"role": "",
"geometry": [
{ "lat": 50.8314534, "lon": 6.9647679 },
{ "lat": 50.8386440, "lon": 6.9665955 }
]
},
{
"type": "way",
"ref": 40033064,
"role": "",
"geometry": [
{ "lat": 50.8386440, "lon": 6.9665955 },
{ "lat": 50.8391695, "lon": 6.9667285 }
]
},
{
"type": "way",
"ref": 189189059,
"role": "",
"geometry": [
{ "lat": 50.8746263, "lon": 6.9695939 },
{ "lat": 50.8760907, "lon": 6.9694358 }
]
},
{
"type": "way",
"ref": 271008225,
"role": "",
"geometry": [
{ "lat": 50.8760907, "lon": 6.9694358 },
{ "lat": 50.8775484, "lon": 6.9692784 }
]
},
{
"type": "way",
"ref": 41550921,
"role": "",
"geometry": [
{ "lat": 50.8775484, "lon": 6.9692784 },
{ "lat": 50.8797318, "lon": 6.9690108 }
]
}
],
"tags": {
"TMC:cid_58:tabcd_1:Class": "Road",
"TMC:cid_58:tabcd_1:LCLversion": "8.00",
"TMC:cid_58:tabcd_1:LocationCode": "7142",
"name": "Bundesautobahn 555",
"network": "BAB",
"operator": "Bundesrepublik Deutschland",
"ref": "A 555",
"route": "road",
"type": "route",
"wikipedia": "de:Bundesautobahn 555"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2014-12-14T13:34:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "node",
"id": 3233854233,
"lat": 50.7494187,
"lon": 7.1758731
},
{
"type": "node",
"id": 3233854234,
"lat": 50.7494287,
"lon": 7.1758731
},
{
"type": "way",
"id": 317146077,
"nodes": [
3233854233,
3233854234
],
"tags": {
"building": "yes"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2014-12-14T13:34:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "area",
"id": 3605945176
},
{
"type": "node",
"id": 3233854233,
"lat": 50.7494187,
"lon": 7.1758731
},
{
"type": "node",
"id": 3233854235,
"lat": 50.7494287,
"lon": 7.1758731
},
{
"type": "way",
"id": 317146078,
"nodes": [
3233854233,
3233854235
],
"tags": {
"building": "yes"
}
},
{
"type": "relation",
"id": 2046898,
"timestamp": "2014-12-15T13:13:11Z",
"version": 12,
"changeset": 17433822,
"user": "Username",
"uid": 12345,
"members": [
{
"type": "node",
"ref": 3233854233,
"role": "platform"
},
{
"type": "node",
"ref": 3233854234,
"role": "stop"
},
{
"type": "node",
"ref": 3233854235,
"role": "platform"
},
{
"type": "way",
"ref": 317146078,
"role": ""
}
],
"tags": {
"from": "Here",
"name": "Test relation",
"ref": "609",
"route": "bus",
"to": "There",
"type": "route"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2014-12-14T13:34:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "way",
"id": 317146077,
"nodes": [
3233854233,
3233854234
],
"tags": {
"building": "yes"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2014-12-14T13:34:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "node",
"id": 3233854233,
"lat": 50.7494187,
"lon": 7.1758731
},
{
"type": "way",
"id": 317146077,
"nodes": [
3233854233,
3233854234
],
"tags": {
"building": "yes"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2014-12-14T13:34:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "node",
"id": 3233854233,
"lat": 50.7494187,
"lon": 7.1758731
},
{
"type": "node",
"id": 3233854234,
"lat": 50.7494287,
"lon": 7.1758731
},
{
"type": "way",
"id": 317146077,
"nodes": [
3233854233,
3233854234
],
"tags": {
"building": "yes"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2014-12-14T13:33:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "way",
"id": 317146077,
"nodes": [
3233854241,
3233854238,
3233854233,
3233854234,
3233854236,
3233854237,
3233854241
],
"tags": {
"building": "yes"
}
},
{
"type": "way",
"id": 317146078,
"timestamp": "2014-12-14T07:27:21Z",
"version": 1,
"changeset": 23456789,
"user": "TestUser",
"uid": 345678,
"nodes": [
3233854241,
3233854238,
3233854233,
3233854234,
3233854236,
3233854237,
3233854241
]
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2014-12-14T13:34:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "node",
"id": 3233854233,
"lat": 50.7494187,
"lon": 7.1758731
},
{
"type": "node",
"id": 3233854234,
"lat": 50.7494236,
"lon": 7.1757664
},
{
"type": "node",
"id": 3233854236,
"lat": 50.7494909,
"lon": 7.1757741
},
{
"type": "node",
"id": 3233854237,
"lat": 50.7494985,
"lon": 7.1756064
},
{
"type": "node",
"id": 3233854238,
"lat": 50.7495391,
"lon": 7.1758868
},
{
"type": "node",
"id": 3233854241,
"lat": 50.7495516,
"lon": 7.1756125
},
{
"type": "way",
"id": 317146077,
"nodes": [
3233854241,
3233854238,
3233854233,
3233854234,
3233854236,
3233854237,
3233854241
],
"tags": {
"building": "yes"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2016-11-22T22:33:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "node",
"id": 2343425523,
"lat": 41.8954452,
"lon": 12.5032169,
"timestamp": "2013-06-13T15:34:01Z",
"version": 1,
"changeset": 16539126,
"user": "Giardia",
"uid": 113909
},
{
"type": "node",
"id": 2343425525,
"lat": 41.8954752,
"lon": 12.5031604,
"timestamp": "2013-06-13T15:34:01Z",
"version": 1,
"changeset": 16539126,
"user": "Giardia",
"uid": 113909
},
{
"type": "node",
"id": 2343425526,
"lat": 41.8955244,
"lon": 12.5032926,
"timestamp": "2013-06-13T15:34:01Z",
"version": 1,
"changeset": 16539126,
"user": "Giardia",
"uid": 113909
},
{
"type": "node",
"id": 2343425528,
"lat": 41.8955543,
"lon": 12.5032362,
"timestamp": "2013-06-13T15:34:01Z",
"version": 1,
"changeset": 16539126,
"user": "Giardia",
"uid": 113909
},
{
"type": "way",
"id": 225576797,
"timestamp": "2013-06-13T15:34:01Z",
"version": 1,
"changeset": 16539126,
"user": "Giardia",
"uid": 113909,
"center": {
"lat": 41.8954998,
"lon": 12.5032265
},
"nodes": [
2343425525,
2343425528,
2343425526,
2343425523,
2343425525
],
"tags": {
"building": "kiosk",
"shop": "florist"
}
}
]
}
{
"version": 0.6,
"generator": "Overpass API",
"osm3s": {
"timestamp_osm_base": "2016-11-22T23:25:02Z",
"copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL."
},
"elements": [
{
"type": "way",
"id": 225576797,
"center": {},
"nodes": [
2343425525,
2343425528,
2343425526,
2343425523,
2343425525
],
"tags": {
"building": "kiosk",
"shop": "florist"
}
}
]
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" lang="en"/>
<title>OSM3S Response</title>
</head>
<body>
<p>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</p>
<!-- Wrong encoding iso8859-15 -->
<p><strong style="color:#FF0000">Error</strong>: line 2: parse error: ';' expected - 'out' found. ���</p>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" lang="en"/>
<title>OSM3S Response</title>
</head>
<body>
<p>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</p>
<p><strong style="color:#FF0000">Error</strong>: line 2: parse error: ';' expected - 'out' found. </p>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base="2016-11-22T20:23:03Z" areas="2016-11-22T19:07:02Z"/>
<area id="2448756446">
<tag k="addr:city" v="Troisdorf"/>
<tag k="addr:postcode" v="53840"/>
<tag k="area" v="yes"/>
<tag k="description" v="Troisdorf Bahnsteig Gleis 9"/>
<tag k="name" v="Troisdorf"/>
<tag k="public_transport" v="platform"/>
<tag k="railway" v="platform"/>
<tag k="ref" v="9"/>
<tag k="train" v="yes"/>
<tag k="wheelchair" v="no"/>
<tag k="wheelchair:description" v="Plattformlift ist vorhanden, Betriebsbereitschaft nach 8 Jahren stillstand fraglich."/>
<tag k="width" v="5"/>
</area>
<area id="3600055060">
<tag k="TMC:cid_58:tabcd_1:Class" v="Area"/>
<tag k="TMC:cid_58:tabcd_1:LCLversion" v="8.00"/>
<tag k="TMC:cid_58:tabcd_1:LocationCode" v="2550"/>
<tag k="admin_level" v="8"/>
<tag k="boundary" v="administrative"/>
<tag k="de:amtlicher_gemeindeschluessel" v="05382068"/>
<tag k="de:place" v="town"/>
<tag k="de:regionalschluessel" v="053820068068"/>
<tag k="name" v="Troisdorf"/>
<tag k="name:prefix" v="Stadt"/>
<tag k="type" v="boundary"/>
<tag k="wikidata" v="Q3900"/>
<tag k="wikipedia" v="de:Troisdorf"/>
</area>
<area id="3605945175">
<tag k="addr:city" v="Troisdorf"/>
<tag k="addr:postcode" v="53840"/>
<tag k="description" v="Troisdorf Bahnsteig Gleis 1+2"/>
<tag k="local_ref" v="1;2"/>
<tag k="name" v="Troisdorf"/>
<tag k="public_transport" v="platform"/>
<tag k="railway" v="platform"/>
<tag k="ref" v="1/2"/>
<tag k="tactile_paving" v="yes"/>
<tag k="train" v="yes"/>
<tag k="type" v="multipolygon"/>
<tag k="wheelchair" v="yes"/>
</area>
<area id="3605945176">
<tag k="addr:city" v="Troisdorf"/>
<tag k="addr:postcode" v="53840"/>
<tag k="description" v="Troisdorf Bahnsteig Gleis 5+6"/>
<tag k="name" v="Troisdorf"/>
<tag k="phone" v="+49 221 1411055"/>
<tag k="public_transport" v="platform"/>
<tag k="railway" v="platform"/>
<tag k="ref" v="5/6"/>
<tag k="tactile_paving" v="yes"/>
<tag k="train" v="yes"/>
<tag k="type" v="multipolygon"/>
<tag k="wheelchair" v="yes"/>
<tag k="wheelchair:description" v="Der Aufzug zu diesem Bahnsteig ist oft defekt, bitte informieren. Betriebszustand kann bei 3S-Zentrale erfragt werden (siehe Telefonnummer, aber Vorsicht, die sind nicht immer informiert!)"/>
<tag k="width" v="6"/>
</area>
</osm>
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base="2014-12-14T12:58:02Z"/>
<node id="50878400" lat="50.7461788" lon="7.1742257"/>
<node id="100793192" lat="50.7468472" lon="7.1709376">
<tag k="highway" v="turning_circle"/>
</node>
<node id="3233854234" lat="50.7494236" lon="7.1757664" version="1" timestamp="2014-12-14T07:27:19Z" changeset="23456789" uid="345678" user="TestUser"/>
</osm>
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base="2014-12-21T20:00:03Z"/>
<relation id="2046898" version="12" timestamp="2014-12-15T13:13:11Z" changeset="17433822" uid="12345" user="Username">
<member type="node" ref="507464632" role="platform"/>
<member type="node" ref="2252681768" role="stop"/>
<member type="node" ref="507464636" role="platform"/>
<member type="node" ref="1620886108" role="stop"/>
<member type="way" ref="4893348" role=""/>
<tag k="from" v="Here"/>
<tag k="name" v="Test relation"/>
<tag k="ref" v="609"/>
<tag k="route" v="bus"/>
<tag k="to" v="There"/>
<tag k="type" v="route"/>
</relation>
</osm>
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base="2014-12-14T13:34:02Z"/>
<node id="3233854233" lat="50.7494187" lon="7.1758731"/>
<node id="3233854234" lat="50.7494287" lon="7.1758731"/>
<node id="3233854235" lat="50.7494287" lon="7.1758731"/>
<way id="317146078">
<nd ref="3233854233"/>
<nd ref="3233854234"/>
<nd ref="3233854235"/>
</way>
<relation id="2046898" version="12" timestamp="2014-12-15T13:13:11Z" changeset="17433822" uid="12345" user="Username">
<member type="node" ref="3233854233" role="platform"/>
<member type="node" ref="3233854234" role="stop"/>
<member type="node" ref="3233854235" role="platform"/>
<member type="way" ref="317146078" role=""/>
<tag k="from" v="Here"/>
<tag k="name" v="Test relation"/>
<tag k="ref" v="609"/>
<tag k="route" v="bus"/>
<tag k="to" v="There"/>
<tag k="type" v="route"/>
</relation>
</osm>
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base="2016-11-23T20:27:02Z"/>
<relation id="23092">
<center lat="50.8176646" lon="7.0208539"/>
<member type="way" ref="4334856" role=""/>
<member type="way" ref="234434903" role=""/>
<member type="way" ref="37881522" role=""/>
<member type="way" ref="37881521" role=""/>
<member type="way" ref="4356491" role=""/>
<member type="way" ref="235363211" role=""/>
<member type="way" ref="48290877" role=""/>
<member type="way" ref="210683519" role=""/>
<member type="way" ref="42743961" role=""/>
<member type="way" ref="210683522" role=""/>
<member type="way" ref="48290881" role=""/>
<member type="way" ref="235363214" role=""/>
<member type="way" ref="4400137" role=""/>
<member type="way" ref="230940375" role=""/>
<member type="way" ref="4400140" role=""/>
<member type="way" ref="4400142" role=""/>
<member type="way" ref="235824476" role=""/>
<member type="way" ref="4400143" role=""/>
<member type="way" ref="235824475" role=""/>
<member type="way" ref="178797123" role=""/>
<member type="way" ref="233553030" role=""/>
<member type="way" ref="4829989" role=""/>
<member type="way" ref="99834112" role=""/>
<member type="way" ref="133081219" role=""/>
<member type="way" ref="234434905" role=""/>
<member type="way" ref="20661567" role=""/>
<member type="way" ref="230941900" role=""/>
<member type="way" ref="20661568" role=""/>
<member type="way" ref="20661572" role=""/>
<member type="way" ref="230940374" role=""/>
<member type="way" ref="20661573" role=""/>
<member type="way" ref="20662817" role=""/>
<member type="way" ref="230941903" role=""/>
<member type="way" ref="20662819" role=""/>
<member type="way" ref="20662824" role=""/>
<member type="way" ref="20662827" role=""/>
<member type="way" ref="27492515" role=""/>
<member type="way" ref="129125122" role=""/>
<member type="way" ref="234434901" role=""/>
<member type="way" ref="234434904" role=""/>
<member type="way" ref="27492542" role=""/>
<member type="way" ref="27492543" role=""/>
<member type="way" ref="29233646" role=""/>
<member type="way" ref="235820561" role=""/>
<member type="way" ref="29233647" role=""/>
<member type="way" ref="235820559" role=""/>
<member type="way" ref="235820562" role=""/>
<member type="way" ref="29233648" role=""/>
<member type="way" ref="29382960" role=""/>
<member type="way" ref="271008229" role=""/>
<member type="way" ref="271008238" role=""/>
<member type="way" ref="271008230" role=""/>
<member type="way" ref="271008226" role=""/>
<member type="way" ref="40033062" role=""/>
<member type="way" ref="40033063" role=""/>
<member type="way" ref="29384561" role=""/>
<member type="way" ref="29384563" role=""/>
<member type="way" ref="271008224" role=""/>
<member type="way" ref="271008227" role=""/>
<member type="way" ref="271008237" role=""/>
<member type="way" ref="271008232" role=""/>
<member type="way" ref="271008239" role=""/>
<member type="way" ref="29384564" role=""/>
<member type="way" ref="31282638" role=""/>
<member type="way" ref="31282787" role=""/>
<member type="way" ref="383262762" role=""/>
<member type="way" ref="31304443" role=""/>
<member type="way" ref="128541594" role=""/>
<member type="way" ref="31304503" role=""/>
<member type="way" ref="31363881" role=""/>
<member type="way" ref="31363891" role=""/>
<member type="way" ref="31363892" role=""/>
<member type="way" ref="31363898" role=""/>
<member type="way" ref="31363910" role=""/>
<member type="way" ref="31364152" role=""/>
<member type="way" ref="31364158" role=""/>
<member type="way" ref="31364178" role=""/>
<member type="way" ref="31364384" role=""/>
<member type="way" ref="31364387" role=""/>
<member type="way" ref="31364484" role=""/>
<member type="way" ref="31364512" role=""/>
<member type="way" ref="31364656" role=""/>
<member type="way" ref="31364667" role=""/>
<member type="way" ref="271008234" role=""/>
<member type="way" ref="31364888" role=""/>
<member type="way" ref="122158730" role=""/>
<member type="way" ref="31364985" role=""/>
<member type="way" ref="271008235" role=""/>
<member type="way" ref="271008231" role=""/>
<member type="way" ref="271008233" role=""/>
<member type="way" ref="31365377" role=""/>
<member type="way" ref="31365425" role=""/>
<member type="way" ref="271008236" role=""/>
<member type="way" ref="36447898" role=""/>
<member type="way" ref="271008228" role=""/>
<member type="way" ref="31366812" role=""/>
<member type="way" ref="31366880" role=""/>
<member type="way" ref="31367017" role=""/>
<member type="way" ref="31367443" role=""/>
<member type="way" ref="31367449" role=""/>
<member type="way" ref="31367526" role=""/>
<member type="way" ref="31367534" role=""/>
<member type="way" ref="31369852" role=""/>
<member type="way" ref="449397558" role=""/>
<member type="way" ref="31797389" role=""/>
<member type="way" ref="31798039" role=""/>
<member type="way" ref="235363212" role=""/>
<member type="way" ref="156492546" role=""/>
<member type="way" ref="156492545" role=""/>
<member type="way" ref="130749935" role=""/>
<member type="way" ref="32472877" role=""/>
<member type="way" ref="31798988" role=""/>
<member type="way" ref="31798989" role=""/>
<member type="way" ref="235820560" role=""/>
<member type="way" ref="235820563" role=""/>
<member type="way" ref="235820564" role=""/>
<member type="way" ref="235820570" role=""/>
<member type="way" ref="32472855" role=""/>
<member type="way" ref="32472856" role=""/>
<member type="way" ref="37881520" role=""/>
<member type="way" ref="37881519" role=""/>
<member type="way" ref="234434902" role=""/>
<member type="way" ref="32472875" role=""/>
<member type="way" ref="32473071" role=""/>
<member type="way" ref="128522486" role=""/>
<member type="way" ref="36447896" role=""/>
<member type="way" ref="32473075" role=""/>
<member type="way" ref="32473086" role=""/>
<member type="way" ref="32473087" role=""/>
<member type="way" ref="40033064" role=""/>
<member type="way" ref="189189059" role=""/>
<member type="way" ref="271008225" role=""/>
<member type="way" ref="41550921" role=""/>
<tag k="TMC:cid_58:tabcd_1:Class" v="Road"/>
<tag k="TMC:cid_58:tabcd_1:LCLversion" v="8.00"/>
<tag k="TMC:cid_58:tabcd_1:LocationCode" v="7142"/>
<tag k="name" v="Bundesautobahn 555"/>
<tag k="network" v="BAB"/>
<tag k="operator" v="Bundesrepublik Deutschland"/>
<tag k="ref" v="A 555"/>
<tag k="route" v="road"/>
<tag k="type" v="route"/>
<tag k="wikipedia" v="de:Bundesautobahn 555"/>
</relation>
</osm>
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base="2016-11-24T22:22:03Z"/>
<relation id="23092">
<bounds minlat="50.7432318" minlon="6.9639432" maxlat="50.8920975" maxlon="7.0777645"/>
<member type="way" ref="4334856" role="">
<nd lat="50.8104598" lon="6.9871803"/>
<nd lat="50.8117239" lon="6.9849282"/>
</member>
<member type="way" ref="234434903" role="">
<nd lat="50.8117239" lon="6.9849282"/>
<nd lat="50.8137408" lon="6.9813352"/>
</member>
<member type="way" ref="37881522" role="">
<nd lat="50.8137408" lon="6.9813352"/>
<nd lat="50.8140146" lon="6.9808445"/>
</member>
<member type="way" ref="37881521" role="">
<nd lat="50.8140146" lon="6.9808445"/>
<nd lat="50.8193541" lon="6.9713457"/>
<nd lat="50.8203182" lon="6.9697248"/>
<nd lat="50.8210652" lon="6.9685758"/>
<nd lat="50.8217885" lon="6.9676136"/>
<nd lat="50.8225495" lon="6.9667439"/>
<nd lat="50.8233005" lon="6.9660515"/>
<nd lat="50.8238128" lon="6.9656463"/>
<nd lat="50.8243279" lon="6.9653077"/>
</member>
<member type="way" ref="4356491" role="">
<nd lat="50.7433997" lon="7.0777645"/>
<nd lat="50.7434097" lon="7.0775890"/>
<nd lat="50.7434629" lon="7.0774402"/>
<nd lat="50.7435198" lon="7.0773718"/>
<nd lat="50.7437507" lon="7.0771524"/>
</member>
<member type="way" ref="235363211" role="">
<nd lat="50.7437507" lon="7.0771524"/>
<nd lat="50.7446592" lon="7.0762926"/>
</member>
<member type="way" ref="48290877" role="">
<nd lat="50.7446592" lon="7.0762926"/>
<nd lat="50.7450803" lon="7.0757571"/>
<nd lat="50.7453888" lon="7.0753312"/>
<nd lat="50.7457125" lon="7.0748518"/>
<nd lat="50.7460370" lon="7.0743265"/>
<nd lat="50.7462718" lon="7.0739425"/>
<nd lat="50.7464798" lon="7.0735173"/>
<nd lat="50.7468359" lon="7.0727449"/>
</member>
<member type="way" ref="210683519" role="">
<nd lat="50.7468359" lon="7.0727449"/>
<nd lat="50.7471006" lon="7.0720546"/>
<nd lat="50.7473135" lon="7.0714640"/>
<nd lat="50.7475199" lon="7.0708095"/>
<nd lat="50.7479418" lon="7.0693723"/>
</member>
<member type="way" ref="42743961" role="">
<nd lat="50.7464112" lon="7.0734310"/>
<nd lat="50.7459053" lon="7.0743560"/>
<nd lat="50.7457638" lon="7.0745740"/>
</member>
<member type="way" ref="210683522" role="">
<nd lat="50.7457638" lon="7.0745740"/>
<nd lat="50.7456300" lon="7.0747409"/>
<nd lat="50.7454858" lon="7.0749187"/>
<nd lat="50.7452550" lon="7.0752554"/>
<nd lat="50.7450000" lon="7.0756385"/>
<nd lat="50.7448878" lon="7.0758027"/>
<nd lat="50.7447522" lon="7.0759730"/>
<nd lat="50.7445514" lon="7.0762032"/>
<nd lat="50.7443577" lon="7.0764098"/>
<nd lat="50.7441185" lon="7.0766490"/>
</member>
<member type="way" ref="48290881" role="">
<nd lat="50.7441185" lon="7.0766490"/>
<nd lat="50.7439033" lon="7.0768575"/>
<nd lat="50.7437722" lon="7.0769631"/>
<nd lat="50.7436609" lon="7.0770394"/>
</member>
<member type="way" ref="235363214" role="">
<nd lat="50.7436609" lon="7.0770394"/>
<nd lat="50.7435688" lon="7.0771154"/>
<nd lat="50.7434662" lon="7.0771906"/>
<nd lat="50.7434058" lon="7.0772230"/>
<nd lat="50.7433331" lon="7.0772525"/>
<nd lat="50.7432822" lon="7.0772636"/>
<nd lat="50.7432318" lon="7.0772601"/>
</member>
<member type="way" ref="4400137" role="">
<nd lat="50.8887155" lon="6.9676900"/>
<nd lat="50.8876384" lon="6.9678150"/>
</member>
<member type="way" ref="230940375" role="">
<nd lat="50.8876384" lon="6.9678150"/>
<nd lat="50.8870572" lon="6.9679058"/>
<nd lat="50.8858563" lon="6.9680103"/>
</member>
<member type="way" ref="4400140" role="">
<nd lat="50.8797318" lon="6.9690108"/>
<nd lat="50.8799208" lon="6.9689396"/>
<nd lat="50.8807058" lon="6.9688470"/>
<nd lat="50.8824762" lon="6.9687068"/>
</member>
<member type="way" ref="4400142" role="">
<nd lat="50.8919691" lon="6.9670292"/>
<nd lat="50.8918982" lon="6.9671419"/>
<nd lat="50.8918068" lon="6.9672404"/>
<nd lat="50.8917186" lon="6.9673001"/>
<nd lat="50.8916153" lon="6.9673480"/>
<nd lat="50.8914588" lon="6.9673816"/>
</member>
<member type="way" ref="235824476" role="">
<nd lat="50.8914588" lon="6.9673816"/>
<nd lat="50.8892470" lon="6.9676302"/>
<nd lat="50.8887155" lon="6.9676900"/>
</member>
<member type="way" ref="4400143" role="">
<nd lat="50.8887787" lon="6.9681629"/>
<nd lat="50.8896224" lon="6.9680604"/>
<nd lat="50.8897525" lon="6.9680446"/>
</member>
<member type="way" ref="235824475" role="">
<nd lat="50.8897525" lon="6.9680446"/>
<nd lat="50.8906556" lon="6.9679349"/>
<nd lat="50.8912013" lon="6.9678862"/>
</member>
<member type="way" ref="178797123" role="">
<nd lat="50.8912013" lon="6.9678862"/>
<nd lat="50.8913492" lon="6.9678648"/>
</member>
<member type="way" ref="233553030" role="">
<nd lat="50.8913492" lon="6.9678648"/>
<nd lat="50.8916648" lon="6.9677762"/>
<nd lat="50.8917895" lon="6.9677694"/>
<nd lat="50.8919294" lon="6.9677947"/>
<nd lat="50.8920975" lon="6.9678618"/>
</member>
<member type="way" ref="4829989" role="">
<nd lat="50.8105743" lon="6.9865001"/>
<nd lat="50.8088268" lon="6.9896207"/>
</member>
<member type="way" ref="99834112" role="">
<nd lat="50.8088268" lon="6.9896207"/>
<nd lat="50.8066272" lon="6.9935457"/>
<nd lat="50.8057165" lon="6.9951151"/>
</member>
<member type="way" ref="133081219" role="">
<nd lat="50.8057165" lon="6.9951151"/>
<nd lat="50.8050332" lon="6.9962100"/>
<nd lat="50.8043133" lon="6.9972614"/>
</member>
<member type="way" ref="234434905" role="">
<nd lat="50.8043133" lon="6.9972614"/>
<nd lat="50.8038004" lon="6.9979304"/>
<nd lat="50.8032120" lon="6.9986363"/>
<nd lat="50.8029818" lon="6.9989181"/>
</member>
<member type="way" ref="20661567" role="">
<nd lat="50.8849681" lon="6.9681126"/>
<nd lat="50.8839667" lon="6.9682524"/>
<nd lat="50.8829770" lon="6.9684059"/>
</member>
<member type="way" ref="230941900" role="">
<nd lat="50.8829770" lon="6.9684059"/>
<nd lat="50.8826286" lon="6.9684595"/>
</member>
<member type="way" ref="20661568" role="">
<nd lat="50.8850872" lon="6.9685052"/>
<nd lat="50.8859127" lon="6.9684079"/>
</member>
<member type="way" ref="20661572" role="">
<nd lat="50.8859127" lon="6.9684079"/>
<nd lat="50.8872823" lon="6.9682592"/>
<nd lat="50.8876807" lon="6.9682539"/>
</member>
<member type="way" ref="230940374" role="">
<nd lat="50.8876807" lon="6.9682539"/>
<nd lat="50.8887787" lon="6.9681629"/>
</member>
<member type="way" ref="20661573" role="">
<nd lat="50.8858563" lon="6.9680103"/>
<nd lat="50.8849681" lon="6.9681126"/>
</member>
<member type="way" ref="20662817" role="">
<nd lat="50.8823655" lon="6.9684998"/>
<nd lat="50.8806620" lon="6.9686453"/>
</member>
<member type="way" ref="230941903" role="">
<nd lat="50.8806620" lon="6.9686453"/>
<nd lat="50.8793943" lon="6.9687847"/>
</member>
<member type="way" ref="20662819" role="">
<nd lat="50.8824762" lon="6.9687068"/>
<nd lat="50.8827522" lon="6.9686901"/>
</member>
<member type="way" ref="20662824" role="">
<nd lat="50.8827522" lon="6.9686901"/>
<nd lat="50.8839133" lon="6.9686122"/>
<nd lat="50.8850872" lon="6.9685052"/>
</member>
<member type="way" ref="20662827" role="">
<nd lat="50.8826286" lon="6.9684595"/>
<nd lat="50.8823655" lon="6.9684998"/>
</member>
<member type="way" ref="27492515" role="">
<nd lat="50.8029818" lon="6.9989181"/>
<nd lat="50.8026288" lon="6.9992932"/>
</member>
<member type="way" ref="129125122" role="">
<nd lat="50.8093979" lon="6.9890430"/>
<nd lat="50.8104598" lon="6.9871803"/>
</member>
<member type="way" ref="234434901" role="">
<nd lat="50.8063753" lon="6.9944172"/>
<nd lat="50.8093979" lon="6.9890430"/>
</member>
<member type="way" ref="234434904" role="">
<nd lat="50.8053262" lon="6.9961817"/>
<nd lat="50.8058108" lon="6.9953914"/>
<nd lat="50.8063753" lon="6.9944172"/>
</member>
<member type="way" ref="27492542" role="">
<nd lat="50.8029899" lon="6.9991939"/>
<nd lat="50.8032828" lon="6.9988807"/>
<nd lat="50.8038702" lon="6.9982129"/>
<nd lat="50.8044350" lon="6.9974695"/>
<nd lat="50.8053262" lon="6.9961817"/>
</member>
<member type="way" ref="27492543" role="">
<nd lat="50.8026483" lon="6.9995590"/>
<nd lat="50.8029899" lon="6.9991939"/>
</member>
<member type="way" ref="29233646" role="">
<nd lat="50.8793943" lon="6.9687847"/>
<nd lat="50.8716935" lon="6.9696241"/>
<nd lat="50.8701666" lon="6.9697243"/>
<nd lat="50.8688585" lon="6.9697057"/>
<nd lat="50.8652424" lon="6.9693872"/>
</member>
<member type="way" ref="235820561" role="">
<nd lat="50.8652424" lon="6.9693872"/>
<nd lat="50.8636340" lon="6.9692339"/>
</member>
<member type="way" ref="29233647" role="">
<nd lat="50.8636340" lon="6.9692339"/>
<nd lat="50.8608791" lon="6.9689787"/>
</member>
<member type="way" ref="235820559" role="">
<nd lat="50.8608791" lon="6.9689787"/>
<nd lat="50.8590168" lon="6.9688055"/>
</member>
<member type="way" ref="235820562" role="">
<nd lat="50.8590168" lon="6.9688055"/>
<nd lat="50.8523854" lon="6.9681888"/>
</member>
<member type="way" ref="29233648" role="">
<nd lat="50.8522171" lon="6.9684787"/>
<nd lat="50.8590359" lon="6.9691023"/>
</member>
<member type="way" ref="29382960" role="">
<nd lat="50.8391695" lon="6.9667285"/>
<nd lat="50.8411491" lon="6.9672118"/>
<nd lat="50.8425706" lon="6.9674985"/>
</member>
<member type="way" ref="271008229" role="">
<nd lat="50.8425706" lon="6.9674985"/>
<nd lat="50.8443277" lon="6.9677563"/>
</member>
<member type="way" ref="271008238" role="">
<nd lat="50.8443277" lon="6.9677563"/>
<nd lat="50.8453254" lon="6.9678465"/>
<nd lat="50.8468114" lon="6.9679862"/>
</member>
<member type="way" ref="271008230" role="">
<nd lat="50.8468114" lon="6.9679862"/>
<nd lat="50.8491169" lon="6.9681907"/>
</member>
<member type="way" ref="271008226" role="">
<nd lat="50.8491169" lon="6.9681907"/>
<nd lat="50.8518181" lon="6.9684403"/>
</member>
<member type="way" ref="40033062" role="">
<nd lat="50.8391857" lon="6.9664246"/>
<nd lat="50.8386690" lon="6.9662911"/>
</member>
<member type="way" ref="40033063" role="">
<nd lat="50.8386690" lon="6.9662911"/>
<nd lat="50.8314332" lon="6.9644546"/>
</member>
<member type="way" ref="29384561" role="">
<nd lat="50.8523854" lon="6.9681888"/>
<nd lat="50.8519590" lon="6.9681595"/>
</member>
<member type="way" ref="29384563" role="">
<nd lat="50.8519590" lon="6.9681595"/>
<nd lat="50.8506534" lon="6.9680320"/>
</member>
<member type="way" ref="271008224" role="">
<nd lat="50.8506534" lon="6.9680320"/>
<nd lat="50.8490308" lon="6.9678717"/>
</member>
<member type="way" ref="271008227" role="">
<nd lat="50.8490308" lon="6.9678717"/>
<nd lat="50.8478121" lon="6.9677589"/>
</member>
<member type="way" ref="271008237" role="">
<nd lat="50.8478121" lon="6.9677589"/>
<nd lat="50.8459552" lon="6.9676249"/>
<nd lat="50.8451822" lon="6.9675256"/>
</member>
<member type="way" ref="271008232" role="">
<nd lat="50.8451822" lon="6.9675256"/>
<nd lat="50.8433946" lon="6.9673373"/>
</member>
<member type="way" ref="271008239" role="">
<nd lat="50.8433946" lon="6.9673373"/>
<nd lat="50.8424071" lon="6.9671724"/>
<nd lat="50.8411984" lon="6.9669289"/>
<nd lat="50.8391857" lon="6.9664246"/>
</member>
<member type="way" ref="29384564" role="">
<nd lat="50.8518181" lon="6.9684403"/>
<nd lat="50.8522171" lon="6.9684787"/>
</member>
<member type="way" ref="31282638" role="">
<nd lat="50.7547305" lon="7.0468957"/>
<nd lat="50.7550333" lon="7.0462257"/>
</member>
<member type="way" ref="31282787" role="">
<nd lat="50.7548175" lon="7.0462659"/>
<nd lat="50.7545192" lon="7.0469416"/>
</member>
<member type="way" ref="383262762" role="">
<nd lat="50.7545192" lon="7.0469416"/>
<nd lat="50.7522859" lon="7.0519784"/>
<nd lat="50.7519030" lon="7.0528750"/>
</member>
<member type="way" ref="31304443" role="">
<nd lat="50.7519030" lon="7.0528750"/>
<nd lat="50.7514373" lon="7.0540731"/>
<nd lat="50.7512408" lon="7.0546346"/>
<nd lat="50.7511231" lon="7.0549962"/>
<nd lat="50.7508172" lon="7.0560135"/>
</member>
<member type="way" ref="128541594" role="">
<nd lat="50.7508172" lon="7.0560135"/>
<nd lat="50.7504938" lon="7.0572440"/>
</member>
<member type="way" ref="31304503" role="">
<nd lat="50.7509429" lon="7.0561605"/>
<nd lat="50.7512483" lon="7.0551357"/>
<nd lat="50.7513759" lon="7.0547500"/>
<nd lat="50.7515670" lon="7.0542197"/>
<nd lat="50.7520213" lon="7.0530348"/>
<nd lat="50.7524214" lon="7.0520935"/>
<nd lat="50.7547305" lon="7.0468957"/>
</member>
<member type="way" ref="31363881" role="">
<nd lat="50.8026288" lon="6.9992932"/>
<nd lat="50.8018617" lon="7.0000625"/>
<nd lat="50.8010270" lon="7.0007950"/>
<nd lat="50.8001164" lon="7.0015291"/>
<nd lat="50.7928343" lon="7.0072406"/>
<nd lat="50.7832350" lon="7.0147268"/>
<nd lat="50.7826087" lon="7.0151803"/>
</member>
<member type="way" ref="31363891" role="">
<nd lat="50.7826087" lon="7.0151803"/>
<nd lat="50.7823221" lon="7.0153822"/>
</member>
<member type="way" ref="31363892" role="">
<nd lat="50.7823221" lon="7.0153822"/>
<nd lat="50.7802850" lon="7.0170023"/>
<nd lat="50.7782200" lon="7.0186241"/>
</member>
<member type="way" ref="31363898" role="">
<nd lat="50.7826777" lon="7.0153975"/>
<nd lat="50.7833048" lon="7.0149295"/>
<nd lat="50.8001641" lon="7.0017836"/>
<nd lat="50.8010947" lon="7.0010142"/>
<nd lat="50.8019538" lon="7.0002540"/>
<nd lat="50.8026483" lon="6.9995590"/>
</member>
<member type="way" ref="31363910" role="">
<nd lat="50.7823930" lon="7.0156008"/>
<nd lat="50.7826777" lon="7.0153975"/>
</member>
<member type="way" ref="31364152" role="">
<nd lat="50.7782200" lon="7.0186241"/>
<nd lat="50.7779774" lon="7.0188037"/>
</member>
<member type="way" ref="31364158" role="">
<nd lat="50.7783056" lon="7.0188240"/>
<nd lat="50.7788577" lon="7.0183860"/>
<nd lat="50.7803473" lon="7.0172040"/>
<nd lat="50.7816582" lon="7.0161766"/>
<nd lat="50.7823930" lon="7.0156008"/>
</member>
<member type="way" ref="31364178" role="">
<nd lat="50.7780676" lon="7.0190054"/>
<nd lat="50.7783056" lon="7.0188240"/>
</member>
<member type="way" ref="31364384" role="">
<nd lat="50.7749036" lon="7.0214625"/>
<nd lat="50.7780676" lon="7.0190054"/>
</member>
<member type="way" ref="31364387" role="">
<nd lat="50.7744886" lon="7.0214841"/>
<nd lat="50.7712930" lon="7.0240315"/>
<nd lat="50.7695809" lon="7.0254447"/>
<nd lat="50.7686243" lon="7.0263151"/>
</member>
<member type="way" ref="31364484" role="">
<nd lat="50.7748248" lon="7.0212347"/>
<nd lat="50.7744886" lon="7.0214841"/>
</member>
<member type="way" ref="31364512" role="">
<nd lat="50.7745735" lon="7.0217089"/>
<nd lat="50.7749036" lon="7.0214625"/>
</member>
<member type="way" ref="31364656" role="">
<nd lat="50.7686546" lon="7.0266216"/>
<nd lat="50.7696586" lon="7.0256891"/>
<nd lat="50.7713905" lon="7.0242565"/>
<nd lat="50.7745735" lon="7.0217089"/>
</member>
<member type="way" ref="31364667" role="">
<nd lat="50.7686243" lon="7.0263151"/>
<nd lat="50.7676165" lon="7.0273126"/>
<nd lat="50.7665957" lon="7.0283332"/>
<nd lat="50.7653333" lon="7.0297134"/>
</member>
<member type="way" ref="271008234" role="">
<nd lat="50.7653333" lon="7.0297134"/>
<nd lat="50.7643799" lon="7.0308081"/>
</member>
<member type="way" ref="31364888" role="">
<nd lat="50.7635269" lon="7.0321873"/>
<nd lat="50.7641966" lon="7.0313729"/>
</member>
<member type="way" ref="122158730" role="">
<nd lat="50.7641966" lon="7.0313729"/>
<nd lat="50.7644716" lon="7.0310241"/>
</member>
<member type="way" ref="31364985" role="">
<nd lat="50.7644716" lon="7.0310241"/>
<nd lat="50.7648596" lon="7.0305814"/>
</member>
<member type="way" ref="271008235" role="">
<nd lat="50.7648596" lon="7.0305814"/>
<nd lat="50.7657812" lon="7.0295145"/>
<nd lat="50.7666465" lon="7.0285903"/>
</member>
<member type="way" ref="271008231" role="">
<nd lat="50.7666465" lon="7.0285903"/>
<nd lat="50.7679887" lon="7.0272481"/>
</member>
<member type="way" ref="271008233" role="">
<nd lat="50.7679887" lon="7.0272481"/>
<nd lat="50.7686546" lon="7.0266216"/>
</member>
<member type="way" ref="31365377" role="">
<nd lat="50.7643799" lon="7.0308081"/>
<nd lat="50.7640807" lon="7.0311662"/>
</member>
<member type="way" ref="31365425" role="">
<nd lat="50.7640807" lon="7.0311662"/>
<nd lat="50.7638566" lon="7.0314272"/>
</member>
<member type="way" ref="271008236" role="">
<nd lat="50.7638566" lon="7.0314272"/>
<nd lat="50.7628914" lon="7.0326760"/>
<nd lat="50.7621053" lon="7.0336961"/>
</member>
<member type="way" ref="36447898" role="">
<nd lat="50.7621053" lon="7.0336961"/>
<nd lat="50.7613433" lon="7.0347526"/>
</member>
<member type="way" ref="271008228" role="">
<nd lat="50.7613433" lon="7.0347526"/>
<nd lat="50.7608295" lon="7.0354890"/>
</member>
<member type="way" ref="31366812" role="">
<nd lat="50.7588227" lon="7.0386254"/>
<nd lat="50.7583011" lon="7.0394929"/>
<nd lat="50.7576749" lon="7.0405773"/>
<nd lat="50.7569096" lon="7.0419812"/>
<nd lat="50.7558745" lon="7.0439976"/>
<nd lat="50.7548175" lon="7.0462659"/>
</member>
<member type="way" ref="31366880" role="">
<nd lat="50.7550333" lon="7.0462257"/>
<nd lat="50.7559939" lon="7.0442408"/>
<nd lat="50.7570656" lon="7.0421620"/>
<nd lat="50.7578037" lon="7.0408023"/>
<nd lat="50.7584541" lon="7.0396561"/>
<nd lat="50.7589669" lon="7.0387984"/>
</member>
<member type="way" ref="31367017" role="">
<nd lat="50.7609333" lon="7.0356976"/>
<nd lat="50.7619690" lon="7.0342371"/>
<nd lat="50.7630051" lon="7.0328461"/>
<nd lat="50.7635269" lon="7.0321873"/>
</member>
<member type="way" ref="31367443" role="">
<nd lat="50.7607331" lon="7.0359794"/>
<nd lat="50.7609333" lon="7.0356976"/>
</member>
<member type="way" ref="31367449" role="">
<nd lat="50.7589669" lon="7.0387984"/>
<nd lat="50.7602933" lon="7.0366481"/>
<nd lat="50.7607331" lon="7.0359794"/>
</member>
<member type="way" ref="31367526" role="">
<nd lat="50.7606164" lon="7.0358121"/>
<nd lat="50.7601681" lon="7.0365126"/>
<nd lat="50.7588227" lon="7.0386254"/>
</member>
<member type="way" ref="31367534" role="">
<nd lat="50.7608295" lon="7.0354890"/>
<nd lat="50.7606164" lon="7.0358121"/>
</member>
<member type="way" ref="31369852" role="">
<nd lat="50.7779774" lon="7.0188037"/>
<nd lat="50.7748248" lon="7.0212347"/>
</member>
<member type="way" ref="449397558" role="">
<nd lat="50.7479418" lon="7.0693723"/>
<nd lat="50.7494783" lon="7.0624630"/>
</member>
<member type="way" ref="31797389" role="">
<nd lat="50.7494783" lon="7.0624630"/>
<nd lat="50.7502727" lon="7.0588905"/>
<nd lat="50.7506441" lon="7.0572942"/>
<nd lat="50.7509429" lon="7.0561605"/>
</member>
<member type="way" ref="31798039" role="">
<nd lat="50.7504938" lon="7.0572440"/>
<nd lat="50.7501306" lon="7.0588140"/>
</member>
<member type="way" ref="235363212" role="">
<nd lat="50.7501306" lon="7.0588140"/>
<nd lat="50.7492636" lon="7.0626737"/>
<nd lat="50.7489407" lon="7.0641605"/>
</member>
<member type="way" ref="156492546" role="">
<nd lat="50.7489407" lon="7.0641605"/>
<nd lat="50.7488307" lon="7.0647205"/>
<nd lat="50.7483739" lon="7.0668216"/>
</member>
<member type="way" ref="156492545" role="">
<nd lat="50.7483739" lon="7.0668216"/>
<nd lat="50.7483009" lon="7.0672440"/>
<nd lat="50.7478400" lon="7.0692844"/>
</member>
<member type="way" ref="130749935" role="">
<nd lat="50.7478400" lon="7.0692844"/>
<nd lat="50.7477294" lon="7.0697394"/>
<nd lat="50.7476187" lon="7.0701855"/>
<nd lat="50.7474997" lon="7.0706232"/>
<nd lat="50.7473468" lon="7.0711189"/>
<nd lat="50.7472087" lon="7.0715434"/>
<nd lat="50.7470472" lon="7.0719838"/>
<nd lat="50.7469114" lon="7.0723163"/>
<nd lat="50.7467733" lon="7.0726489"/>
<nd lat="50.7465937" lon="7.0730580"/>
<nd lat="50.7464112" lon="7.0734310"/>
</member>
<member type="way" ref="32472877" role="">
<nd lat="50.8246828" lon="6.9651077"/>
<nd lat="50.8253375" lon="6.9647718"/>
<nd lat="50.8260000" lon="6.9645354"/>
<nd lat="50.8266134" lon="6.9643649"/>
<nd lat="50.8272671" lon="6.9642646"/>
<nd lat="50.8278017" lon="6.9642349"/>
</member>
<member type="way" ref="31798988" role="">
<nd lat="50.8278017" lon="6.9642349"/>
<nd lat="50.8284805" lon="6.9642342"/>
<nd lat="50.8294617" lon="6.9643395"/>
<nd lat="50.8302437" lon="6.9644810"/>
<nd lat="50.8309474" lon="6.9646345"/>
</member>
<member type="way" ref="31798989" role="">
<nd lat="50.8590359" lon="6.9691023"/>
<nd lat="50.8634113" lon="6.9695191"/>
</member>
<member type="way" ref="235820560" role="">
<nd lat="50.8634113" lon="6.9695191"/>
<nd lat="50.8656224" lon="6.9697185"/>
</member>
<member type="way" ref="235820563" role="">
<nd lat="50.8656224" lon="6.9697185"/>
<nd lat="50.8679633" lon="6.9699314"/>
</member>
<member type="way" ref="235820564" role="">
<nd lat="50.8679633" lon="6.9699314"/>
<nd lat="50.8691580" lon="6.9700171"/>
<nd lat="50.8699302" lon="6.9700221"/>
</member>
<member type="way" ref="235820570" role="">
<nd lat="50.8699302" lon="6.9700221"/>
<nd lat="50.8717399" lon="6.9699121"/>
<nd lat="50.8746263" lon="6.9695939"/>
</member>
<member type="way" ref="32472855" role="">
<nd lat="50.8246253" lon="6.9648384"/>
<nd lat="50.8242516" lon="6.9650453"/>
</member>
<member type="way" ref="32472856" role="">
<nd lat="50.8242516" lon="6.9650453"/>
<nd lat="50.8237235" lon="6.9653841"/>
<nd lat="50.8232034" lon="6.9657948"/>
<nd lat="50.8224317" lon="6.9665263"/>
<nd lat="50.8216642" lon="6.9673886"/>
<nd lat="50.8209037" lon="6.9684049"/>
<nd lat="50.8201541" lon="6.9695500"/>
<nd lat="50.8192181" lon="6.9711445"/>
<nd lat="50.8138575" lon="6.9806731"/>
</member>
<member type="way" ref="37881520" role="">
<nd lat="50.8138575" lon="6.9806731"/>
<nd lat="50.8135770" lon="6.9811721"/>
</member>
<member type="way" ref="37881519" role="">
<nd lat="50.8135770" lon="6.9811721"/>
<nd lat="50.8113547" lon="6.9851361"/>
</member>
<member type="way" ref="234434902" role="">
<nd lat="50.8113547" lon="6.9851361"/>
<nd lat="50.8105743" lon="6.9865001"/>
</member>
<member type="way" ref="32472875" role="">
<nd lat="50.8243279" lon="6.9653077"/>
<nd lat="50.8246828" lon="6.9651077"/>
</member>
<member type="way" ref="32473071" role="">
<nd lat="50.8309464" lon="6.9643368"/>
<nd lat="50.8302815" lon="6.9641912"/>
</member>
<member type="way" ref="128522486" role="">
<nd lat="50.8302815" lon="6.9641912"/>
<nd lat="50.8294728" lon="6.9640448"/>
<nd lat="50.8284964" lon="6.9639463"/>
<nd lat="50.8277970" lon="6.9639432"/>
</member>
<member type="way" ref="36447896" role="">
<nd lat="50.8277970" lon="6.9639432"/>
<nd lat="50.8272631" lon="6.9639682"/>
<nd lat="50.8265661" lon="6.9640827"/>
<nd lat="50.8259717" lon="6.9642405"/>
<nd lat="50.8252714" lon="6.9645096"/>
<nd lat="50.8246253" lon="6.9648384"/>
</member>
<member type="way" ref="32473075" role="">
<nd lat="50.8314332" lon="6.9644546"/>
<nd lat="50.8309464" lon="6.9643368"/>
</member>
<member type="way" ref="32473086" role="">
<nd lat="50.8309474" lon="6.9646345"/>
<nd lat="50.8314534" lon="6.9647679"/>
</member>
<member type="way" ref="32473087" role="">
<nd lat="50.8314534" lon="6.9647679"/>
<nd lat="50.8386440" lon="6.9665955"/>
</member>
<member type="way" ref="40033064" role="">
<nd lat="50.8386440" lon="6.9665955"/>
<nd lat="50.8391695" lon="6.9667285"/>
</member>
<member type="way" ref="189189059" role="">
<nd lat="50.8746263" lon="6.9695939"/>
<nd lat="50.8760907" lon="6.9694358"/>
</member>
<member type="way" ref="271008225" role="">
<nd lat="50.8760907" lon="6.9694358"/>
<nd lat="50.8775484" lon="6.9692784"/>
</member>
<member type="way" ref="41550921" role="">
<nd lat="50.8775484" lon="6.9692784"/>
<nd lat="50.8797318" lon="6.9690108"/>
</member>
<tag k="TMC:cid_58:tabcd_1:Class" v="Road"/>
<tag k="TMC:cid_58:tabcd_1:LCLversion" v="8.00"/>
<tag k="TMC:cid_58:tabcd_1:LocationCode" v="7142"/>
<tag k="name" v="Bundesautobahn 555"/>
<tag k="network" v="BAB"/>
<tag k="operator" v="Bundesrepublik Deutschland"/>
<tag k="ref" v="A 555"/>
<tag k="route" v="road"/>
<tag k="type" v="route"/>
<tag k="wikipedia" v="de:Bundesautobahn 555"/>
</relation>
</osm>
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base="2014-12-14T13:33:02Z"/>
<way id="317146077">
<nd ref="3233854241"/>
<nd ref="3233854238"/>
<nd ref="3233854233"/>
<nd ref="3233854234"/>
<nd ref="3233854236"/>
<nd ref="3233854237"/>
<nd ref="3233854241"/>
<tag k="building" v="yes"/>
</way>
<way id="317146078" version="1" timestamp="2014-12-14T07:27:21Z" changeset="23456789" uid="345678" user="TestUser">
<nd ref="3233854241"/>
<nd ref="3233854238"/>
<nd ref="3233854233"/>
<nd ref="3233854234"/>
<nd ref="3233854236"/>
<nd ref="3233854237"/>
<nd ref="3233854241"/>
</way>
</osm>
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base="2014-12-14T13:34:02Z"/>
<node id="3233854233" lat="50.7494187" lon="7.1758731"/>
<node id="3233854234" lat="50.7494236" lon="7.1757664"/>
<node id="3233854236" lat="50.7494909" lon="7.1757741"/>
<node id="3233854237" lat="50.7494985" lon="7.1756064"/>
<node id="3233854238" lat="50.7495391" lon="7.1758868"/>
<node id="3233854241" lat="50.7495516" lon="7.1756125"/>
<way id="317146077">
<nd ref="3233854241"/>
<nd ref="3233854238"/>
<nd ref="3233854233"/>
<nd ref="3233854234"/>
<nd ref="3233854236"/>
<nd ref="3233854237"/>
<nd ref="3233854241"/>
<tag k="building" v="yes"/>
</way>
</osm>
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base="2016-11-22T22:35:03Z"/>
<node id="2343425523" lat="41.8954452" lon="12.5032169" version="1" timestamp="2013-06-13T15:34:01Z" changeset="16539126" uid="113909" user="Giardia"/>
<node id="2343425525" lat="41.8954752" lon="12.5031604" version="1" timestamp="2013-06-13T15:34:01Z" changeset="16539126" uid="113909" user="Giardia"/>
<node id="2343425526" lat="41.8955244" lon="12.5032926" version="1" timestamp="2013-06-13T15:34:01Z" changeset="16539126" uid="113909" user="Giardia"/>
<node id="2343425528" lat="41.8955543" lon="12.5032362" version="1" timestamp="2013-06-13T15:34:01Z" changeset="16539126" uid="113909" user="Giardia"/>
<way id="225576797" version="1" timestamp="2013-06-13T15:34:01Z" changeset="16539126" uid="113909" user="Giardia">
<center lat="41.8954998" lon="12.5032265"/>
<nd ref="2343425525"/>
<nd ref="2343425528"/>
<nd ref="2343425526"/>
<nd ref="2343425523"/>
<nd ref="2343425525"/>
<tag k="building" v="kiosk"/>
<tag k="shop" v="florist"/>
</way>
</osm>
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
<note>The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.</note>
<meta osm_base="2016-11-22T23:24:03Z"/>
<way id="225576797">
<center/>
<nd ref="2343425525"/>
<nd ref="2343425528"/>
<nd ref="2343425526"/>
<nd ref="2343425523"/>
<nd ref="2343425525"/>
<tag k="building" v="kiosk"/>
<tag k="shop" v="florist"/>
</way>
</osm>
+3
-1
Metadata-Version: 1.1
Name: overpy
Version: 0.3.1
Version: 0.4
Summary: Python Wrapper to access the OpenStreepMap Overpass API

@@ -110,2 +110,3 @@ Home-page: https://github.com/DinoTools/python-overpy

Keywords: OverPy Overpass OSM OpenStreetMap
Platform: UNKNOWN

@@ -121,3 +122,4 @@ Classifier: Development Status :: 4 - Beta

Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy

@@ -0,3 +1,18 @@

CHANGELOG.rst
LICENSE
MANIFEST.in
README.rst
setup.cfg
setup.py
docs/make.bat
docs/source/api.rst
docs/source/changelog.rst
docs/source/conf.py
docs/source/contributing.rst
docs/source/example.rst
docs/source/index.rst
docs/source/introduction.rst
examples/get_areas.py
examples/get_nodes.py
examples/get_ways.py
overpy/__about__.py

@@ -19,2 +34,29 @@ overpy/__init__.py

tests/test_result_way.py
tests/test_xml.py
tests/test_xml.py
tests/json/area-01.json
tests/json/node-01.json
tests/json/relation-01.json
tests/json/relation-02.json
tests/json/relation-03.json
tests/json/relation-04.json
tests/json/result-expand-01.json
tests/json/result-expand-02.json
tests/json/result-way-01.json
tests/json/result-way-02.json
tests/json/result-way-03.json
tests/json/way-01.json
tests/json/way-02.json
tests/json/way-03.json
tests/json/way-04.json
tests/response/bad-request-encoding.html
tests/response/bad-request.html
tests/xml/area-01.xml
tests/xml/node-01.xml
tests/xml/relation-01.xml
tests/xml/relation-02.xml
tests/xml/relation-03.xml
tests/xml/relation-04.xml
tests/xml/way-01.xml
tests/xml/way-02.xml
tests/xml/way-03.xml
tests/xml/way-04.xml

@@ -16,3 +16,3 @@ __all__ = [

__version__ = "0.3.1"
__version__ = "0.4"

@@ -23,2 +23,2 @@ __author__ = "PhiBo (DinoTools)"

__license__ = "MIT"
__copyright__ = "Copyright 2014-2015 %s" % __author__
__copyright__ = "Copyright 2014-2016 %s" % __author__
from collections import OrderedDict
from datetime import datetime
from decimal import Decimal
from xml.sax import handler, make_parser
import json

@@ -13,6 +15,8 @@ import re

PY2 = sys.version_info[0] == 2
PY3 = sys.version_info[0] == 3
XML_PARSER_DOM = 1
XML_PARSER_SAX = 2
if PY2:

@@ -43,9 +47,17 @@ from urllib2 import urlopen

default_read_chunk_size = 4096
default_url = "http://overpass-api.de/api/interpreter"
def __init__(self, read_chunk_size=None):
def __init__(self, read_chunk_size=None, url=None, xml_parser=XML_PARSER_SAX):
"""
:param read_chunk_size: Max size of each chunk read from the server response
:type read_chunk_size: Integer
:param url: Optional URL of the Overpass server. Defaults to http://overpass-api.de/api/interpreter
:type url: str
:param xml_parser: The xml parser to use
:type xml_parser: Integer
"""
self.url = "http://overpass-api.de/api/interpreter"
self.url = self.default_url
if url is not None:
self.url = url
self._regex_extract_error_msg = re.compile(b"\<p\>(?P<msg>\<strong\s.*?)\</p\>")

@@ -56,2 +68,3 @@ self._regex_remove_tag = re.compile(b"<[^>]*?>")

self.read_chunk_size = read_chunk_size
self.xml_parser = xml_parser

@@ -67,3 +80,3 @@ def query(self, query):

if not isinstance(query, bytes):
query = bytes(query, "utf-8")
query = query.encode("utf-8")

@@ -137,3 +150,3 @@ try:

def parse_xml(self, data, encoding="utf-8"):
def parse_xml(self, data, encoding="utf-8", parser=None):
"""

@@ -148,2 +161,5 @@

"""
if parser is None:
parser = self.xml_parser
if isinstance(data, bytes):

@@ -154,7 +170,6 @@ data = data.decode(encoding)

data = data.encode(encoding)
import xml.etree.ElementTree as ET
root = ET.fromstring(data)
return Result.from_xml(root, api=self)
return Result.from_xml(data, api=self, parser=parser)
class Result(object):

@@ -164,2 +179,3 @@ """

"""
def __init__(self, elements=None, api=None):

@@ -174,6 +190,8 @@ """

elements = []
self._areas = OrderedDict((element.id, element) for element in elements if is_valid_type(element, Area))
self._nodes = OrderedDict((element.id, element) for element in elements if is_valid_type(element, Node))
self._ways = OrderedDict((element.id, element) for element in elements if is_valid_type(element, Way))
self._relations = OrderedDict((element.id, element) for element in elements if is_valid_type(element, Relation))
self._class_collection_map = {Node: self._nodes, Way: self._ways, Relation: self._relations}
self._relations = OrderedDict((element.id, element)
for element in elements if is_valid_type(element, Relation))
self._class_collection_map = {Node: self._nodes, Way: self._ways, Relation: self._relations, Area: self._areas}
self.api = api

@@ -194,3 +212,3 @@

other_collection_map = {Node: other.nodes, Way: other.ways, Relation: other.relations}
other_collection_map = {Node: other.nodes, Way: other.ways, Relation: other.relations, Area: other.areas}
for element_type, own_collection in self._class_collection_map.items():

@@ -249,2 +267,5 @@ for element in other_collection_map[element_type]:

def get_area_ids(self):
return self.get_ids(filter_cls=Area)
@classmethod

@@ -263,3 +284,3 @@ def from_json(cls, data, api=None):

result = cls(api=api)
for elem_cls in [Node, Way, Relation]:
for elem_cls in [Node, Way, Relation, Area]:
for element in data.get("elements", []):

@@ -273,3 +294,3 @@ e_type = element.get("type")

@classmethod
def from_xml(cls, root, api=None):
def from_xml(cls, data, api=None, parser=XML_PARSER_SAX):
"""

@@ -282,2 +303,4 @@ Create a new instance and load data from xml object.

:type api: Overpass
:param parser: Specify the parser to use(DOM or SAX)
:type parser: Integer
:return: New instance of Result object

@@ -287,9 +310,71 @@ :rtype: Result

result = cls(api=api)
for elem_cls in [Node, Way, Relation]:
for child in root:
if child.tag.lower() == elem_cls._type_value:
result.append(elem_cls.from_xml(child, result=result))
if parser == XML_PARSER_DOM:
import xml.etree.ElementTree as ET
root = ET.fromstring(data)
for elem_cls in [Node, Way, Relation, Area]:
for child in root:
if child.tag.lower() == elem_cls._type_value:
result.append(elem_cls.from_xml(child, result=result))
elif parser == XML_PARSER_SAX:
if PY2:
from StringIO import StringIO
else:
from io import StringIO
source = StringIO(data)
sax_handler = OSMSAXHandler(result)
parser = make_parser()
parser.setContentHandler(sax_handler)
parser.parse(source)
else:
# ToDo: better exception
raise Exception("Unknown XML parser")
return result
def get_area(self, area_id, resolve_missing=False):
"""
Get an area by its ID.
:param area_id: The area ID
:type area_id: Integer
:param resolve_missing: Query the Overpass API if the area is missing in the result set.
:return: The area
:rtype: overpy.Area
:raises overpy.exception.DataIncomplete: The requested way is not available in the result cache.
:raises overpy.exception.DataIncomplete: If resolve_missing is True and the area can't be resolved.
"""
areas = self.get_areas(area_id=area_id)
if len(areas) == 0:
if resolve_missing is False:
raise exception.DataIncomplete("Resolve missing area is disabled")
query = ("\n"
"[out:json];\n"
"area({area_id});\n"
"out body;\n"
)
query = query.format(
area_id=area_id
)
tmp_result = self.api.query(query)
self.expand(tmp_result)
areas = self.get_areas(area_id=area_id)
if len(areas) == 0:
raise exception.DataIncomplete("Unable to resolve requested areas")
return areas[0]
def get_areas(self, area_id=None, **kwargs):
"""
Alias for get_elements() but filter the result by Area
:param area_id: The Id of the area
:type area_id: Integer
:return: List of elements
"""
return self.get_elements(Area, elem_id=area_id, **kwargs)
def get_node(self, node_id, resolve_missing=False):

@@ -313,6 +398,6 @@ """

query = ("\n"
"[out:json];\n"
"node({node_id});\n"
"out body;\n"
)
"[out:json];\n"
"node({node_id});\n"
"out body;\n"
)
query = query.format(

@@ -359,6 +444,6 @@ node_id=node_id

query = ("\n"
"[out:json];\n"
"relation({relation_id});\n"
"out body;\n"
)
"[out:json];\n"
"relation({relation_id});\n"
"out body;\n"
)
query = query.format(

@@ -405,6 +490,6 @@ relation_id=rel_id

query = ("\n"
"[out:json];\n"
"way({way_id});\n"
"out body;\n"
)
"[out:json];\n"
"way({way_id});\n"
"out body;\n"
)
query = query.format(

@@ -433,2 +518,4 @@ way_id=way_id

area_ids = property(get_area_ids)
areas = property(get_areas)
node_ids = property(get_node_ids)

@@ -457,6 +544,149 @@ nodes = property(get_nodes)

self._result = result
# Try to convert some common attributes
# http://wiki.openstreetmap.org/wiki/Elements#Common_attributes
self._attribute_modifiers = {
"changeset": int,
"timestamp": lambda ts: datetime.strptime(ts, "%Y-%m-%dT%H:%M:%SZ"),
"uid": int,
"version": int,
"visible": lambda v: v.lower() == "true"
}
self.attributes = attributes
for n, m in self._attribute_modifiers.items():
if n in self.attributes:
self.attributes[n] = m(self.attributes[n])
self.id = None
self.tags = tags
@classmethod
def get_center_from_json(cls, data):
"""
Get center information from json data
:param data: json data
:return: tuple with two elements: lat and lon
:rtype: tuple
"""
center_lat = None
center_lon = None
center = data.get("center")
if isinstance(center, dict):
center_lat = center.get("lat")
center_lon = center.get("lon")
if center_lat is None or center_lon is None:
raise ValueError("Unable to get lat or lon of way center.")
center_lat = Decimal(center_lat)
center_lon = Decimal(center_lon)
return (center_lat, center_lon)
@classmethod
def get_center_from_xml_dom(cls, sub_child):
center_lat = sub_child.attrib.get("lat")
center_lon = sub_child.attrib.get("lon")
if center_lat is None or center_lon is None:
raise ValueError("Unable to get lat or lon of way center.")
center_lat = Decimal(center_lat)
center_lon = Decimal(center_lon)
return center_lat, center_lon
class Area(Element):
"""
Class to represent an element of type area
"""
_type_value = "area"
def __init__(self, area_id=None, **kwargs):
"""
:param area_id: Id of the area element
:type area_id: Integer
:param kwargs: Additional arguments are passed directly to the parent class
"""
Element.__init__(self, **kwargs)
#: The id of the way
self.id = area_id
def __repr__(self):
return "<overpy.Area id={}>".format(self.id)
@classmethod
def from_json(cls, data, result=None):
"""
Create new Area element from JSON data
:param data: Element data from JSON
:type data: Dict
:param result: The result this element belongs to
:type result: overpy.Result
:return: New instance of Way
:rtype: overpy.Area
:raises overpy.exception.ElementDataWrongType: If type value of the passed JSON data does not match.
"""
if data.get("type") != cls._type_value:
raise exception.ElementDataWrongType(
type_expected=cls._type_value,
type_provided=data.get("type")
)
tags = data.get("tags", {})
area_id = data.get("id")
attributes = {}
ignore = ["id", "tags", "type"]
for n, v in data.items():
if n in ignore:
continue
attributes[n] = v
return cls(area_id=area_id, attributes=attributes, tags=tags, result=result)
@classmethod
def from_xml(cls, child, result=None):
"""
Create new way element from XML data
:param child: XML node to be parsed
:type child: xml.etree.ElementTree.Element
:param result: The result this node belongs to
:type result: overpy.Result
:return: New Way oject
:rtype: overpy.Way
:raises overpy.exception.ElementDataWrongType: If name of the xml child node doesn't match
:raises ValueError: If the ref attribute of the xml node is not provided
:raises ValueError: If a tag doesn't have a name
"""
if child.tag.lower() != cls._type_value:
raise exception.ElementDataWrongType(
type_expected=cls._type_value,
type_provided=child.tag.lower()
)
tags = {}
for sub_child in child:
if sub_child.tag.lower() == "tag":
name = sub_child.attrib.get("k")
if name is None:
raise ValueError("Tag without name/key.")
value = sub_child.attrib.get("v")
tags[name] = value
area_id = child.attrib.get("id")
if area_id is not None:
area_id = int(area_id)
attributes = {}
ignore = ["id"]
for n, v in child.attrib.items():
if n in ignore:
continue
attributes[n] = v
return cls(area_id=area_id, attributes=attributes, tags=tags, result=result)
class Node(Element):

@@ -484,3 +714,3 @@ """

self.lon = lon
def __repr__(self):

@@ -494,4 +724,4 @@ return "<overpy.Node id={} lat={} lon={}>".format(self.id, self.lat, self.lon)

:param child: Element data from JSON
:type child: Dict
:param data: Element data from JSON
:type data: Dict
:param result: The result this element belongs to

@@ -581,3 +811,3 @@ :type result: overpy.Result

def __init__(self, way_id=None, node_ids=None, **kwargs):
def __init__(self, way_id=None, center_lat=None, center_lon=None, node_ids=None, **kwargs):
"""

@@ -598,3 +828,7 @@ :param node_ids: List of node IDs

self._node_ids = node_ids
#: The lat/lon of the center of the way (optional depending on query)
self.center_lat = center_lat
self.center_lon = center_lon
def __repr__(self):

@@ -642,7 +876,7 @@ return "<overpy.Way id={} nodes={}>".format(self.id, self._node_ids)

query = ("\n"
"[out:json];\n"
"way({way_id});\n"
"node(w);\n"
"out body;\n"
)
"[out:json];\n"
"way({way_id});\n"
"node(w);\n"
"out body;\n"
)
query = query.format(

@@ -672,4 +906,4 @@ way_id=self.id

:param child: Element data from JSON
:type child: Dict
:param data: Element data from JSON
:type data: Dict
:param result: The result this element belongs to

@@ -691,5 +925,6 @@ :type result: overpy.Result

node_ids = data.get("nodes")
(center_lat, center_lon) = cls.get_center_from_json(data=data)
attributes = {}
ignore = ["id", "nodes", "tags", "type"]
ignore = ["center", "id", "nodes", "tags", "type"]
for n, v in data.items():

@@ -700,3 +935,11 @@ if n in ignore:

return cls(way_id=way_id, attributes=attributes, node_ids=node_ids, tags=tags, result=result)
return cls(
attributes=attributes,
center_lat=center_lat,
center_lon=center_lon,
node_ids=node_ids,
tags=tags,
result=result,
way_id=way_id
)

@@ -726,2 +969,4 @@ @classmethod

node_ids = []
center_lat = None
center_lon = None

@@ -741,2 +986,4 @@ for sub_child in child:

node_ids.append(ref_id)
if sub_child.tag.lower() == "center":
(center_lat, center_lon) = cls.get_center_from_xml_dom(sub_child=sub_child)

@@ -754,3 +1001,4 @@ way_id = child.attrib.get("id")

return cls(way_id=way_id, attributes=attributes, node_ids=node_ids, tags=tags, result=result)
return cls(way_id=way_id, center_lat=center_lat, center_lon=center_lon,
attributes=attributes, node_ids=node_ids, tags=tags, result=result)

@@ -765,3 +1013,3 @@

def __init__(self, rel_id=None, members=None, **kwargs):
def __init__(self, rel_id=None, center_lat=None, center_lon=None, members=None, **kwargs):
"""

@@ -778,3 +1026,7 @@ :param members:

self.members = members
#: The lat/lon of the center of the way (optional depending on query)
self.center_lat = center_lat
self.center_lon = center_lon
def __repr__(self):

@@ -788,4 +1040,4 @@ return "<overpy.Relation id={}>".format(self.id)

:param child: Element data from JSON
:type child: Dict
:param data: Element data from JSON
:type data: Dict
:param result: The result this element belongs to

@@ -806,6 +1058,7 @@ :type result: overpy.Result

rel_id = data.get("id")
(center_lat, center_lon) = cls.get_center_from_json(data=data)
members = []
supported_members = [RelationNode, RelationWay]
supported_members = [RelationNode, RelationWay, RelationRelation]
for member in data.get("members", []):

@@ -829,3 +1082,11 @@ type_value = member.get("type")

return cls(rel_id=rel_id, attributes=attributes, members=members, tags=tags, result=result)
return cls(
rel_id=rel_id,
attributes=attributes,
center_lat=center_lat,
center_lon=center_lon,
members=members,
tags=tags,
result=result
)

@@ -854,4 +1115,6 @@ @classmethod

members = []
center_lat = None
center_lon = None
supported_members = [RelationNode, RelationWay]
supported_members = [RelationNode, RelationWay, RelationRelation, RelationArea]
for sub_child in child:

@@ -874,2 +1137,4 @@ if sub_child.tag.lower() == "tag":

)
if sub_child.tag.lower() == "center":
(center_lat, center_lon) = cls.get_center_from_xml_dom(sub_child=sub_child)

@@ -887,3 +1152,11 @@ rel_id = child.attrib.get("id")

return cls(rel_id=rel_id, attributes=attributes, members=members, tags=tags, result=result)
return cls(
rel_id=rel_id,
attributes=attributes,
center_lat=center_lat,
center_lon=center_lon,
members=members,
tags=tags,
result=result
)

@@ -895,3 +1168,4 @@

"""
def __init__(self, ref=None, role=None, result=None):
def __init__(self, attributes=None, geometry=None, ref=None, role=None, result=None):
"""

@@ -907,2 +1181,4 @@ :param ref: Reference Id

self.role = role
self.attributes = attributes
self.geometry = geometry

@@ -930,4 +1206,32 @@ @classmethod

role = data.get("role")
return cls(ref=ref, role=role, result=result)
attributes = {}
ignore = ["geometry", "type", "ref", "role"]
for n, v in data.items():
if n in ignore:
continue
attributes[n] = v
geometry = data.get("geometry")
if isinstance(geometry, list):
geometry_orig = geometry
geometry = []
for v in geometry_orig:
geometry.append(
RelationWayGeometryValue(
lat=v.get("lat"),
lon=v.get("lon")
)
)
else:
geometry = None
return cls(
attributes=attributes,
geometry=geometry,
ref=ref,
role=role,
result=result
)
@classmethod

@@ -956,5 +1260,31 @@ def from_xml(cls, child, result=None):

role = child.attrib.get("role")
return cls(ref=ref, role=role, result=result)
attributes = {}
ignore = ["geometry", "ref", "role", "type"]
for n, v in child.attrib.items():
if n in ignore:
continue
attributes[n] = v
geometry = None
for sub_child in child:
if sub_child.tag.lower() == "nd":
if geometry is None:
geometry = []
geometry.append(
RelationWayGeometryValue(
lat=Decimal(sub_child.attrib["lat"]),
lon=Decimal(sub_child.attrib["lon"])
)
)
return cls(
attributes=attributes,
geometry=geometry,
ref=ref,
role=role,
result=result
)
class RelationNode(RelationMember):

@@ -965,3 +1295,3 @@ _type_value = "node"

return self._result.get_node(self.ref, resolve_missing=resolve_missing)
def __repr__(self):

@@ -976,4 +1306,276 @@ return "<overpy.RelationNode ref={} role={}>".format(self.ref, self.role)

return self._result.get_way(self.ref, resolve_missing=resolve_missing)
def __repr__(self):
return "<overpy.RelationWay ref={} role={}>".format(self.ref, self.role)
class RelationWayGeometryValue(object):
def __init__(self, lat, lon):
self.lat = lat
self.lon = lon
def __repr__(self):
return "<overpy.RelationWayGeometryValue lat={} lon={}>".format(self.lat, self.lon)
class RelationRelation(RelationMember):
_type_value = "relation"
def resolve(self, resolve_missing=False):
return self._result.get_relation(self.ref, resolve_missing=resolve_missing)
def __repr__(self):
return "<overpy.RelationRelation ref={} role={}>".format(self.ref, self.role)
class RelationArea(RelationMember):
_type_value = "area"
def resolve(self, resolve_missing=False):
return self._result.get_area(self.ref, resolve_missing=resolve_missing)
def __repr__(self):
return "<overpy.RelationArea ref={} role={}>".format(self.ref, self.role)
class OSMSAXHandler(handler.ContentHandler):
"""
SAX parser for Overpass XML response.
"""
#: Tuple of opening elements to ignore
ignore_start = ('osm', 'meta', 'note', 'bounds', 'remark')
#: Tuple of closing elements to ignore
ignore_end = ('osm', 'meta', 'note', 'bounds', 'remark', 'tag', 'nd', 'center')
def __init__(self, result):
"""
:param result: Append results to this result set.
:type result: overpy.Result
"""
handler.ContentHandler.__init__(self)
self._result = result
self._curr = {}
#: Current relation member object
self.cur_relation_member = None
def startElement(self, name, attrs):
"""
Handle opening elements.
:param name: Name of the element
:type name: String
:param attrs: Attributes of the element
:type attrs: Dict
"""
if name in self.ignore_start:
return
try:
handler = getattr(self, '_handle_start_%s' % name)
except AttributeError:
raise KeyError("Unknown element start '%s'" % name)
handler(attrs)
def endElement(self, name):
"""
Handle closing elements
:param name: Name of the element
:type name: String
"""
if name in self.ignore_end:
return
try:
handler = getattr(self, '_handle_end_%s' % name)
except AttributeError:
raise KeyError("Unknown element end '%s'" % name)
handler()
def _handle_start_center(self, attrs):
"""
Handle opening center element
:param attrs: Attributes of the element
:type attrs: Dict
"""
center_lat = attrs.get("lat")
center_lon = attrs.get("lon")
if center_lat is None or center_lon is None:
raise ValueError("Unable to get lat or lon of way center.")
self._curr["center_lat"] = Decimal(center_lat)
self._curr["center_lon"] = Decimal(center_lon)
def _handle_start_tag(self, attrs):
"""
Handle opening tag element
:param attrs: Attributes of the element
:type attrs: Dict
"""
try:
tag_key = attrs['k']
except KeyError:
raise ValueError("Tag without name/key.")
self._curr['tags'][tag_key] = attrs.get('v')
def _handle_start_node(self, attrs):
"""
Handle opening node element
:param attrs: Attributes of the element
:type attrs: Dict
"""
self._curr = {
'attributes': dict(attrs),
'lat': None,
'lon': None,
'node_id': None,
'tags': {}
}
if attrs.get('id', None) is not None:
self._curr['node_id'] = int(attrs['id'])
del self._curr['attributes']['id']
if attrs.get('lat', None) is not None:
self._curr['lat'] = Decimal(attrs['lat'])
del self._curr['attributes']['lat']
if attrs.get('lon', None) is not None:
self._curr['lon'] = Decimal(attrs['lon'])
del self._curr['attributes']['lon']
def _handle_end_node(self):
"""
Handle closing node element
"""
self._result.append(Node(result=self._result, **self._curr))
self._curr = {}
def _handle_start_way(self, attrs):
"""
Handle opening way element
:param attrs: Attributes of the element
:type attrs: Dict
"""
self._curr = {
'center_lat': None,
'center_lon': None,
'attributes': dict(attrs),
'node_ids': [],
'tags': {},
'way_id': None
}
if attrs.get('id', None) is not None:
self._curr['way_id'] = int(attrs['id'])
del self._curr['attributes']['id']
def _handle_end_way(self):
"""
Handle closing way element
"""
self._result.append(Way(result=self._result, **self._curr))
self._curr = {}
def _handle_start_area(self, attrs):
"""
Handle opening area element
:param attrs: Attributes of the element
:type attrs: Dict
"""
self._curr = {
'attributes': dict(attrs),
'tags': {},
'area_id': None
}
if attrs.get('id', None) is not None:
self._curr['area_id'] = int(attrs['id'])
del self._curr['attributes']['id']
def _handle_end_area(self):
"""
Handle closing area element
"""
self._result.append(Area(result=self._result, **self._curr))
self._curr = {}
def _handle_start_nd(self, attrs):
"""
Handle opening nd element
:param attrs: Attributes of the element
:type attrs: Dict
"""
if isinstance(self.cur_relation_member, RelationWay):
if self.cur_relation_member.geometry is None:
self.cur_relation_member.geometry = []
self.cur_relation_member.geometry.append(
RelationWayGeometryValue(
lat=Decimal(attrs["lat"]),
lon=Decimal(attrs["lon"])
)
)
else:
try:
node_ref = attrs['ref']
except KeyError:
raise ValueError("Unable to find required ref value.")
self._curr['node_ids'].append(int(node_ref))
def _handle_start_relation(self, attrs):
"""
Handle opening relation element
:param attrs: Attributes of the element
:type attrs: Dict
"""
self._curr = {
'attributes': dict(attrs),
'members': [],
'rel_id': None,
'tags': {}
}
if attrs.get('id', None) is not None:
self._curr['rel_id'] = int(attrs['id'])
del self._curr['attributes']['id']
def _handle_end_relation(self):
"""
Handle closing relation element
"""
self._result.append(Relation(result=self._result, **self._curr))
self._curr = {}
def _handle_start_member(self, attrs):
"""
Handle opening member element
:param attrs: Attributes of the element
:type attrs: Dict
"""
params = {
# ToDo: Parse attributes
'attributes': {},
'ref': None,
'result': self._result,
'role': None
}
if attrs.get('ref', None):
params['ref'] = int(attrs['ref'])
if attrs.get('role', None):
params['role'] = attrs['role']
cls_map = {
"area": RelationArea,
"node": RelationNode,
"relation": RelationRelation,
"way": RelationWay
}
cls = cls_map.get(attrs["type"])
if cls is None:
raise ValueError("Undefined type for member: '%s'" % attrs['type'])
self.cur_relation_member = cls(**params)
self._curr['members'].append(self.cur_relation_member)
def _handle_end_member(self):
self.cur_relation_member = None

@@ -67,6 +67,6 @@ class OverPyException(BaseException):

"""
Raised if load of the Overpass API service is to high and it can't handle the request.
Raised if load of the Overpass API service is too high and it can't handle the request.
"""
def __init__(self):
OverPyException.__init__(self, "Server load to high")
OverPyException.__init__(self, "Server load too high")

@@ -73,0 +73,0 @@

Metadata-Version: 1.1
Name: overpy
Version: 0.3.1
Version: 0.4
Summary: Python Wrapper to access the OpenStreepMap Overpass API

@@ -110,2 +110,3 @@ Home-page: https://github.com/DinoTools/python-overpy

Keywords: OverPy Overpass OSM OpenStreetMap
Platform: UNKNOWN

@@ -121,3 +122,4 @@ Classifier: Development Status :: 4 - Beta

Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy

@@ -0,1 +1,10 @@

[metadata]
license-file = LICENSE
[aliases]
test = pytest
[tool:pytest]
python_files = tests/*.py
[egg_info]

@@ -2,0 +11,0 @@ tag_build =

#!/usr/bin/env python
import os
import sys
from setuptools import setup, find_packages

@@ -11,4 +12,9 @@

with open(os.path.join(base_dir, "README.rst")) as f:
long_description = f.read()
filename_readme = os.path.join(base_dir, "README.rst")
if sys.version_info[0] == 2:
import io
fp = io.open(filename_readme, encoding="utf-8")
else:
fp = open(filename_readme, encoding="utf-8")
long_description = fp.read()

@@ -36,5 +42,7 @@ setup(

"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy"
],
keywords="OverPy Overpass OSM OpenStreetMap",
install_requires=[],

@@ -46,2 +54,4 @@ packages=find_packages(exclude=["*.tests", "*.tests.*"]),

},
setup_requires=["pytest-runner"],
tests_require=["pytest"],
)
import os
import sys
from threading import Thread, Lock
import time
from multiprocessing import Process
from threading import Lock

@@ -14,3 +16,3 @@ PY2 = sys.version_info[0] == 2

HOST = "127.0.0.1"
PORT_START = 10000
PORT_START = sys.version_info[0] * 10000 + sys.version_info[1] * 100

@@ -45,5 +47,10 @@ current_port = PORT_START

)
p = Process(target=server_thread, args=(server,))
p.start()
# Give the server some time to bind
# Is there a better option?
time.sleep(0.2)
return (
"http://%s:%d" % (HOST, port),
Thread(target=server_thread, args=(server,))
)
p
)
from decimal import Decimal
from datetime import datetime
import os

@@ -11,2 +12,69 @@

class BaseTestAreas(object):
def _test_area01(self, result):
assert len(result.areas) == 4
assert len(result.nodes) == 0
assert len(result.relations) == 0
assert len(result.ways) == 0
area = result.areas[0]
assert isinstance(area, overpy.Area)
assert isinstance(area.id, int)
assert area.id == 2448756446
assert isinstance(area.tags, dict)
assert len(area.tags) == 12
area = result.areas[1]
assert isinstance(area, overpy.Area)
assert isinstance(area.id, int)
assert area.id == 3600055060
assert isinstance(area.tags, dict)
assert len(area.tags) == 13
area = result.areas[2]
assert isinstance(area, overpy.Area)
assert isinstance(area.id, int)
assert area.id == 3605945175
assert isinstance(area.tags, dict)
assert len(area.tags) == 12
area = result.areas[3]
assert isinstance(area, overpy.Area)
assert isinstance(area.id, int)
assert area.id == 3605945176
assert isinstance(area.tags, dict)
assert len(area.tags) == 14
# try to get a single area by id
area = result.get_area(3605945175)
assert area.id == 3605945175
# try to get a single area by id not available in the result
with pytest.raises(overpy.exception.DataIncomplete):
result.get_area(123456)
# area_ids is an alias for get_node_ids() and should return the same data
for area_ids in (result.area_ids, result.get_area_ids()):
assert len(area_ids) == 4
assert area_ids[0] == 2448756446
assert area_ids[1] == 3600055060
assert area_ids[2] == 3605945175
assert area_ids[3] == 3605945176
assert len(result.node_ids) == 0
assert len(result.get_node_ids()) == 0
assert len(result.relation_ids) == 0
assert len(result.get_relation_ids()) == 0
assert len(result.way_ids) == 0
assert len(result.get_way_ids()) == 0
class BaseTestNodes(object):

@@ -57,6 +125,9 @@ def _test_node01(self, result):

assert len(node.attributes) == 5
# ToDo: fix
# assert node.attributes["changeset"] == 23456789
# assert node.attributes["user"] == "TestUser"
assert node.attributes["changeset"] == 23456789
assert node.attributes["timestamp"] == datetime(2014, 12, 14, 7, 27, 19, 0, None)
assert node.attributes["uid"] == 345678
assert node.attributes["user"] == "TestUser"
assert node.attributes["version"] == 1
# try to get a single node by id

@@ -108,2 +179,8 @@ node = result.get_node(50878400)

assert relation.attributes["changeset"] == 17433822
assert relation.attributes["timestamp"] == datetime(2014, 12, 15, 13, 13, 11, 0, None)
assert relation.attributes["uid"] == 12345
assert relation.attributes["user"] == "Username"
assert relation.attributes["version"] == 12
assert len(relation.members) == 5

@@ -169,3 +246,50 @@ assert isinstance(relation.members[0], overpy.RelationNode)

def _test_relation03(self, result):
assert len(result.nodes) == 0
assert len(result.relations) == 1
assert len(result.ways) == 0
relation = result.relations[0]
assert isinstance(relation, overpy.Relation)
assert isinstance(relation.id, int)
assert relation.id == 23092
assert isinstance(relation.tags, dict)
assert len(relation.tags) == 10
assert isinstance(relation.center_lat, Decimal)
assert isinstance(relation.center_lon, Decimal)
assert relation.center_lat == Decimal("50.8176646")
assert relation.center_lon == Decimal("7.0208539")
def _test_relation04(self, result):
assert len(result.nodes) == 0
assert len(result.relations) == 1
assert len(result.ways) == 0
relation = result.relations[0]
assert isinstance(relation, overpy.Relation)
assert isinstance(relation.id, int)
assert relation.id == 23092
assert isinstance(relation.tags, dict)
assert len(relation.tags) == 10
way = relation.members[2]
assert isinstance(way, overpy.RelationWay)
assert len(way.attributes) == 0
assert isinstance(way.attributes, dict)
assert isinstance(way.geometry, list)
assert len(way.geometry) == 2
assert isinstance(way.geometry[0], overpy.RelationWayGeometryValue)
assert isinstance(way.geometry[0].lat, Decimal)
assert isinstance(way.geometry[0].lon, Decimal)
assert way.geometry[0].lat == Decimal("50.8137408")
assert way.geometry[0].lon == Decimal("6.9813352")
class BaseTestWay(object):

@@ -202,6 +326,7 @@ def _test_way01(self, result):

# ToDo: fix it
# assert way.attributes["uid"] == 345678
# assert way.attributes["user"] == "TestUser"
# assert way.attributes["changeset"] == 23456789
assert way.attributes["changeset"] == 23456789
assert way.attributes["timestamp"] == datetime(2014, 12, 14, 7, 27, 21, 0, None)
assert way.attributes["uid"] == 345678
assert way.attributes["user"] == "TestUser"
assert way.attributes["version"] == 1

@@ -286,2 +411,59 @@ # try to get a single way by id

assert len(way_ids) == 1
assert way_ids[0] == 317146077
assert way_ids[0] == 317146077
def _test_way03(self, result):
assert len(result.nodes) == 4
assert len(result.relations) == 0
assert len(result.ways) == 1
way = result.ways[0]
assert isinstance(way, overpy.Way)
assert isinstance(way.id, int)
assert way.id == 225576797
assert isinstance(way.tags, dict)
assert len(way.tags) == 2
assert way.tags["building"] == "kiosk"
assert way.tags["shop"] == "florist"
assert isinstance(way.center_lat, Decimal)
assert isinstance(way.center_lon, Decimal)
assert way.center_lat == Decimal("41.8954998")
assert way.center_lon == Decimal("12.5032265")
for nodes in (way.nodes, way.get_nodes()):
assert len(nodes) == 5
for node in nodes:
assert isinstance(node, overpy.Node)
assert isinstance(node.id, int)
assert nodes[0].id == 2343425525
assert nodes[1].id == 2343425528
assert nodes[2].id == 2343425526
assert nodes[3].id == 2343425523
assert nodes[4].id == 2343425525
# try to get a single way by id
way = result.get_way(225576797)
assert way.id == 225576797
# try to get a single way by id not available in the result
with pytest.raises(overpy.exception.DataIncomplete):
result.get_way(123456)
# node_ids is an alias for get_node_ids() and should return the same data
for node_ids in (result.node_ids, result.get_node_ids()):
assert len(node_ids) == 4
assert node_ids[0] == 2343425523
assert node_ids[1] == 2343425525
assert node_ids[2] == 2343425526
assert node_ids[3] == 2343425528
assert len(result.relation_ids) == 0
assert len(result.get_relation_ids()) == 0
# way_ids is an alias for get_way_ids() and should return the same data
for way_ids in (result.way_ids, result.get_way_ids()):
assert len(way_ids) == 1
assert way_ids[0] == 225576797

@@ -5,6 +5,13 @@ import pytest

from tests.base_class import BaseTestNodes, BaseTestRelation, BaseTestWay
from tests.base_class import BaseTestAreas, BaseTestNodes, BaseTestRelation, BaseTestWay
from tests.base_class import read_file
class TestAreas(BaseTestAreas):
def test_area01(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/area-01.json"))
self._test_area01(result)
class TestNodes(BaseTestNodes):

@@ -28,3 +35,13 @@ def test_node01(self):

def test_relation03(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/relation-03.json"))
self._test_relation03(result)
def test_relation04(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/relation-04.json"))
self._test_relation04(result)
class TestWay(BaseTestWay):

@@ -41,3 +58,13 @@ def test_way01(self):

def test_way03(self):
api = overpy.Overpass()
result = api.parse_json(read_file("json/way-03.json"))
self._test_way03(result)
def test_way04(self):
api = overpy.Overpass()
with pytest.raises(ValueError):
api.parse_json(read_file("json/way-04.json"))
class TestDataError(object):

@@ -44,0 +71,0 @@ def test_element_wrong_type(self):

@@ -93,3 +93,2 @@ import pytest

url, t = new_server_thread(HandleResponseJSON)
t.start()

@@ -104,3 +103,2 @@ api = overpy.Overpass(read_chunk_size=128)

url, t = new_server_thread(HandleOverpassBadRequest)
t.start()

@@ -124,3 +122,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleOverpassBadRequestEncoding)
t.start()

@@ -139,3 +136,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleOverpassTooManyRequests)
t.start()

@@ -153,3 +149,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleOverpassGatewayTimeout)
t.start()

@@ -167,3 +162,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleOverpassUnknownHTTPStatusCode)
t.start()

@@ -181,3 +175,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleResponseJSON)
t.start()

@@ -192,3 +185,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleResponseUnknown)
t.start()

@@ -203,3 +195,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleResponseXML)
t.start()

@@ -206,0 +197,0 @@ api = overpy.Overpass()

@@ -41,3 +41,2 @@ import pytest

url, t = new_server_thread(HandleResponseJSON01)
t.start()

@@ -65,3 +64,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleResponseJSON02)
t.start()

@@ -89,3 +87,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleResponseJSON03)
t.start()

@@ -92,0 +89,0 @@ api = overpy.Overpass()

@@ -48,6 +48,37 @@ import pytest

class TestArea(object):
def test_missing_unresolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
api = overpy.Overpass()
api.url = url
result1 = api.parse_json(read_file("json/result-expand-01.json"))
with pytest.raises(overpy.exception.DataIncomplete):
result1.get_area(123, resolve_missing=True)
t.join()
def test_missing_resolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
api = overpy.Overpass()
api.url = url
result1 = api.parse_json(read_file("json/result-expand-01.json"))
# Node must not be available
with pytest.raises(overpy.exception.DataIncomplete):
result1.get_area(3605945176)
# Node must be available
area = result1.get_area(3605945176, resolve_missing=True)
assert isinstance(area, overpy.Area)
assert area.id == 3605945176
t.join()
class TestNode(object):
def test_missing_unresolvable(self):
url, t = new_server_thread(HandleResponseJSON02)
t.start()

@@ -64,3 +95,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleResponseJSON02)
t.start()

@@ -87,3 +117,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleResponseJSON02)
t.start()

@@ -100,3 +129,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleResponseJSON02)
t.start()

@@ -123,3 +151,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleResponseJSON02)
t.start()

@@ -136,3 +163,2 @@ api = overpy.Overpass()

url, t = new_server_thread(HandleResponseJSON02)
t.start()

@@ -139,0 +165,0 @@ api = overpy.Overpass()

@@ -5,11 +5,26 @@ import pytest

from tests.base_class import BaseTestNodes, BaseTestRelation, BaseTestWay
from tests.base_class import BaseTestAreas, BaseTestNodes, BaseTestRelation, BaseTestWay
from tests.base_class import read_file
class TestAreas(BaseTestAreas):
def test_node01(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/area-01.xml"), parser=overpy.XML_PARSER_DOM)
self._test_area01(result)
# SAX
result = api.parse_xml(read_file("xml/area-01.xml"), parser=overpy.XML_PARSER_SAX)
self._test_area01(result)
class TestNodes(BaseTestNodes):
def test_node01(self):
api = overpy.Overpass()
result = api.parse_xml(read_file("xml/node-01.xml"))
# DOM
result = api.parse_xml(read_file("xml/node-01.xml"), parser=overpy.XML_PARSER_DOM)
self._test_node01(result)
# SAX
result = api.parse_xml(read_file("xml/node-01.xml"), parser=overpy.XML_PARSER_SAX)
self._test_node01(result)

@@ -20,23 +35,76 @@

api = overpy.Overpass()
result = api.parse_xml(read_file("xml/relation-01.xml"))
# DOM
result = api.parse_xml(read_file("xml/relation-01.xml"), parser=overpy.XML_PARSER_DOM)
self._test_relation01(result)
# SAX
result = api.parse_xml(read_file("xml/relation-01.xml"), parser=overpy.XML_PARSER_SAX)
self._test_relation01(result)
def test_relation02(self):
api = overpy.Overpass()
result = api.parse_xml(read_file("xml/relation-02.xml"))
# DOM
result = api.parse_xml(read_file("xml/relation-02.xml"), parser=overpy.XML_PARSER_DOM)
self._test_relation02(result)
# SAX
result = api.parse_xml(read_file("xml/relation-02.xml"), parser=overpy.XML_PARSER_SAX)
self._test_relation02(result)
def test_relation03(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/relation-03.xml"), parser=overpy.XML_PARSER_DOM)
self._test_relation03(result)
# SAX
result = api.parse_xml(read_file("xml/relation-03.xml"), parser=overpy.XML_PARSER_SAX)
self._test_relation03(result)
def test_relation04(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/relation-04.xml"), parser=overpy.XML_PARSER_DOM)
self._test_relation04(result)
# SAX
result = api.parse_xml(read_file("xml/relation-04.xml"), parser=overpy.XML_PARSER_SAX)
self._test_relation04(result)
class TestWay(BaseTestWay):
def test_way01(self):
api = overpy.Overpass()
result = api.parse_xml(read_file("xml/way-01.xml"))
# DOM
result = api.parse_xml(read_file("xml/way-01.xml"), parser=overpy.XML_PARSER_DOM)
self._test_way01(result)
# SAX
result = api.parse_xml(read_file("xml/way-01.xml"), parser=overpy.XML_PARSER_SAX)
self._test_way01(result)
def test_way02(self):
api = overpy.Overpass()
result = api.parse_xml(read_file("xml/way-02.xml"))
# DOM
result = api.parse_xml(read_file("xml/way-02.xml"), parser=overpy.XML_PARSER_DOM)
self._test_way02(result)
# SAX
result = api.parse_xml(read_file("xml/way-02.xml"), parser=overpy.XML_PARSER_SAX)
self._test_way02(result)
def test_way03(self):
api = overpy.Overpass()
# DOM
result = api.parse_xml(read_file("xml/way-03.xml"), parser=overpy.XML_PARSER_DOM)
self._test_way03(result)
# SAX
result = api.parse_xml(read_file("xml/way-03.xml"), parser=overpy.XML_PARSER_SAX)
self._test_way03(result)
def test_way04(self):
api = overpy.Overpass()
# DOM
with pytest.raises(ValueError):
api.parse_xml(read_file("xml/way-04.xml"), parser=overpy.XML_PARSER_DOM)
# SAX
with pytest.raises(ValueError):
api.parse_xml(read_file("xml/way-04.xml"), parser=overpy.XML_PARSER_SAX)
class TestDataError(object):

@@ -43,0 +111,0 @@ def _get_element_wrong_type(self):