Merge pyextra subtree
commit
92c596544d
|
@ -0,0 +1,123 @@
|
|||
Metadata-Version: 1.1
|
||||
Name: overpy
|
||||
Version: 0.4
|
||||
Summary: Python Wrapper to access the OpenStreepMap Overpass API
|
||||
Home-page: https://github.com/DinoTools/python-overpy
|
||||
Author: PhiBo (DinoTools)
|
||||
Author-email: UNKNOWN
|
||||
License: MIT
|
||||
Description: Python Overpass Wrapper
|
||||
=======================
|
||||
|
||||
A Python Wrapper to access the Overpass API.
|
||||
|
||||
Have a look at the `documentation`_ to find additional information.
|
||||
|
||||
.. image:: https://pypip.in/version/overpy/badge.svg
|
||||
:target: https://pypi.python.org/pypi/overpy/
|
||||
:alt: Latest Version
|
||||
|
||||
.. image:: https://pypip.in/license/overpy/badge.svg
|
||||
:target: https://pypi.python.org/pypi/overpy/
|
||||
:alt: License
|
||||
|
||||
.. image:: https://travis-ci.org/DinoTools/python-overpy.svg?branch=master
|
||||
:target: https://travis-ci.org/DinoTools/python-overpy
|
||||
|
||||
.. image:: https://coveralls.io/repos/DinoTools/python-overpy/badge.png?branch=master
|
||||
:target: https://coveralls.io/r/DinoTools/python-overpy?branch=master
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Query Overpass API
|
||||
* Parse JSON and XML response data
|
||||
* Additional helper functions
|
||||
|
||||
Install
|
||||
-------
|
||||
|
||||
**Requirements:**
|
||||
|
||||
Supported Python versions:
|
||||
|
||||
* Python 2.7
|
||||
* Python >= 3.2
|
||||
* PyPy and PyPy3
|
||||
|
||||
**Install:**
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ pip install overpy
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
Additional examples can be found in the `documentation`_ and 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))
|
||||
|
||||
|
||||
Helper
|
||||
~~~~~~
|
||||
|
||||
Helper methods are available to provide easy access to often used requests.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import overpy.helper
|
||||
|
||||
# 3600062594 is the OSM id of Chemnitz and is the bounding box for the request
|
||||
street = overpy.helper.get_street(
|
||||
"Straße der Nationen",
|
||||
"3600062594"
|
||||
)
|
||||
|
||||
# this finds an intersection between Straße der Nationen and Carolastraße in Chemnitz
|
||||
intersection = overpy.helper.get_intersection(
|
||||
"Straße der Nationen",
|
||||
"Carolastraße",
|
||||
"3600062594"
|
||||
)
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Published under the MIT (see LICENSE for more information)
|
||||
|
||||
.. _`documentation`: http://python-overpy.readthedocs.org/
|
||||
|
||||
Keywords: OverPy Overpass OSM OpenStreetMap
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 4 - Beta
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.2
|
||||
Classifier: Programming Language :: Python :: 3.3
|
||||
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,0 +1,61 @@
|
|||
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
|
||||
overpy/__init__.py
|
||||
overpy/exception.py
|
||||
overpy/helper.py
|
||||
overpy.egg-info/PKG-INFO
|
||||
overpy.egg-info/SOURCES.txt
|
||||
overpy.egg-info/dependency_links.txt
|
||||
overpy.egg-info/not-zip-safe
|
||||
overpy.egg-info/top_level.txt
|
||||
tests/__init__.py
|
||||
tests/base_class.py
|
||||
tests/test_exception.py
|
||||
tests/test_json.py
|
||||
tests/test_request.py
|
||||
tests/test_result.py
|
||||
tests/test_result_way.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
|
|
@ -0,0 +1 @@
|
|||
|
|
@ -0,0 +1,56 @@
|
|||
../overpy/__about__.py
|
||||
../overpy/__about__.pyc
|
||||
../overpy/__init__.py
|
||||
../overpy/__init__.pyc
|
||||
../overpy/exception.py
|
||||
../overpy/exception.pyc
|
||||
../overpy/helper.py
|
||||
../overpy/helper.pyc
|
||||
../tests/__init__.py
|
||||
../tests/__init__.pyc
|
||||
../tests/base_class.py
|
||||
../tests/base_class.pyc
|
||||
../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/test_exception.py
|
||||
../tests/test_exception.pyc
|
||||
../tests/test_json.py
|
||||
../tests/test_json.pyc
|
||||
../tests/test_request.py
|
||||
../tests/test_request.pyc
|
||||
../tests/test_result.py
|
||||
../tests/test_result.pyc
|
||||
../tests/test_result_way.py
|
||||
../tests/test_result_way.pyc
|
||||
../tests/test_xml.py
|
||||
../tests/test_xml.pyc
|
||||
../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
|
||||
PKG-INFO
|
||||
SOURCES.txt
|
||||
dependency_links.txt
|
||||
not-zip-safe
|
||||
top_level.txt
|
|
@ -0,0 +1 @@
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
overpy
|
||||
tests
|
|
@ -0,0 +1,22 @@
|
|||
__all__ = [
|
||||
"__author__",
|
||||
"__copyright__",
|
||||
"__email__",
|
||||
"__license__",
|
||||
"__summary__",
|
||||
"__title__",
|
||||
"__uri__",
|
||||
"__version__",
|
||||
]
|
||||
|
||||
__title__ = "overpy"
|
||||
__summary__ = "Python Wrapper to access the OpenStreepMap Overpass API"
|
||||
__uri__ = "https://github.com/DinoTools/python-overpy"
|
||||
|
||||
__version__ = "0.4"
|
||||
|
||||
__author__ = "PhiBo (DinoTools)"
|
||||
__email__ = ""
|
||||
|
||||
__license__ = "MIT"
|
||||
__copyright__ = "Copyright 2014-2016 %s" % __author__
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,108 @@
|
|||
class OverPyException(BaseException):
|
||||
"""OverPy base exception"""
|
||||
pass
|
||||
|
||||
|
||||
class DataIncomplete(OverPyException):
|
||||
"""
|
||||
Raised if the requested data isn't available in the result.
|
||||
Try to improve the query or to resolve the missing data.
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
OverPyException.__init__(
|
||||
self,
|
||||
"Data incomplete try to improve the query to resolve the missing data",
|
||||
*args,
|
||||
**kwargs
|
||||
)
|
||||
|
||||
|
||||
class ElementDataWrongType(OverPyException):
|
||||
"""
|
||||
Raised if the provided element does not match the expected type.
|
||||
|
||||
:param type_expected: The expected element type
|
||||
:type type_expected: String
|
||||
:param type_provided: The provided element type
|
||||
:type type_provided: String|None
|
||||
"""
|
||||
def __init__(self, type_expected, type_provided=None):
|
||||
self.type_expected = type_expected
|
||||
self.type_provided = type_provided
|
||||
|
||||
def __str__(self):
|
||||
return "Type expected '%s' but '%s' provided" % (
|
||||
self.type_expected,
|
||||
str(self.type_provided)
|
||||
)
|
||||
|
||||
|
||||
class OverpassBadRequest(OverPyException):
|
||||
"""
|
||||
Raised if the Overpass API service returns a syntax error.
|
||||
|
||||
:param query: The encoded query how it was send to the server
|
||||
:type query: Bytes
|
||||
:param msgs: List of error messages
|
||||
:type msgs: List
|
||||
"""
|
||||
def __init__(self, query, msgs=None):
|
||||
self.query = query
|
||||
if msgs is None:
|
||||
msgs = []
|
||||
self.msgs = msgs
|
||||
|
||||
def __str__(self):
|
||||
tmp_msgs = []
|
||||
for tmp_msg in self.msgs:
|
||||
if not isinstance(tmp_msg, str):
|
||||
tmp_msg = str(tmp_msg)
|
||||
tmp_msgs.append(tmp_msg)
|
||||
|
||||
return "\n".join(tmp_msgs)
|
||||
|
||||
|
||||
class OverpassGatewayTimeout(OverPyException):
|
||||
"""
|
||||
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 too high")
|
||||
|
||||
|
||||
class OverpassTooManyRequests(OverPyException):
|
||||
"""
|
||||
Raised if the Overpass API service returns a 429 status code.
|
||||
"""
|
||||
def __init__(self):
|
||||
OverPyException.__init__(self, "Too many requests")
|
||||
|
||||
|
||||
class OverpassUnknownContentType(OverPyException):
|
||||
"""
|
||||
Raised if the reported content type isn't handled by OverPy.
|
||||
|
||||
:param content_type: The reported content type
|
||||
:type content_type: None or String
|
||||
"""
|
||||
def __init__(self, content_type):
|
||||
self.content_type = content_type
|
||||
|
||||
def __str__(self):
|
||||
if self.content_type is None:
|
||||
return "No content type returned"
|
||||
return "Unknown content type: %s" % self.content_type
|
||||
|
||||
|
||||
class OverpassUnknownHTTPStatusCode(OverPyException):
|
||||
"""
|
||||
Raised if the returned HTTP status code isn't handled by OverPy.
|
||||
|
||||
:param code: The HTTP status code
|
||||
:type code: Integer
|
||||
"""
|
||||
def __init__(self, code):
|
||||
self.code = code
|
||||
|
||||
def __str__(self):
|
||||
return "Unknown/Unhandled status code: %d" % self.code
|
|
@ -0,0 +1,64 @@
|
|||
__author__ = 'mjob'
|
||||
|
||||
import overpy
|
||||
|
||||
|
||||
def get_street(street, areacode, api=None):
|
||||
"""
|
||||
Retrieve streets in a given bounding area
|
||||
|
||||
:param overpy.Overpass api: First street of intersection
|
||||
:param String street: Name of street
|
||||
:param String areacode: The OSM id of the bounding area
|
||||
:return: Parsed result
|
||||
:raises overpy.exception.OverPyException: If something bad happens.
|
||||
"""
|
||||
if api is None:
|
||||
api = overpy.Overpass()
|
||||
|
||||
query = """
|
||||
area(%s)->.location;
|
||||
(
|
||||
way[highway][name="%s"](area.location);
|
||||
- (
|
||||
way[highway=service](area.location);
|
||||
way[highway=track](area.location);
|
||||
);
|
||||
);
|
||||
out body;
|
||||
>;
|
||||
out skel qt;
|
||||
"""
|
||||
|
||||
data = api.query(query % (areacode, street))
|
||||
|
||||
return data
|
||||
|
||||
|
||||
def get_intersection(street1, street2, areacode, api=None):
|
||||
"""
|
||||
Retrieve intersection of two streets in a given bounding area
|
||||
|
||||
:param overpy.Overpass api: First street of intersection
|
||||
:param String street1: Name of first street of intersection
|
||||
:param String street2: Name of second street of intersection
|
||||
:param String areacode: The OSM id of the bounding area
|
||||
:return: List of intersections
|
||||
:raises overpy.exception.OverPyException: If something bad happens.
|
||||
"""
|
||||
if api is None:
|
||||
api = overpy.Overpass()
|
||||
|
||||
query = """
|
||||
area(%s)->.location;
|
||||
(
|
||||
way[highway][name="%s"](area.location); node(w)->.n1;
|
||||
way[highway][name="%s"](area.location); node(w)->.n2;
|
||||
);
|
||||
node.n1.n2;
|
||||
out meta;
|
||||
"""
|
||||
|
||||
data = api.query(query % (areacode, street1, street2))
|
||||
|
||||
return data.get_nodes()
|
Loading…
Reference in New Issue