yandex-maps / yandex_maps / api.py

# coding: utf-8

"""
Yandex.Maps API wrapper
"""

import xml.dom.minidom
import urllib
from yandex_maps import http

STATIC_MAPS_URL = 'http://static-maps.yandex.ru/1.x/?'
GEOCODE_URL = 'http://geocode-maps.yandex.ru/1.x/?'

def get_map_url(api_key, longitude, latitude, zoom, width, height):
    ''' returns URL of static yandex map '''
    params = [
       'll=%0.7f,%0.7f' % (float(longitude), float(latitude),),
       'size=%d,%d' % (width, height,),
       'z=%d' % zoom,
       'l=map',
       'pt=%0.7f,%0.7f' % (float(longitude), float(latitude),),
       'key=%s' % api_key
    ]
    return '%s%s' % (STATIC_MAPS_URL, '&'.join(params))#efficient concatenation

def geocode(api_key, location, reverse=False, timeout=2, results=1):
    ''' returns coordinates for address or vice versa'''
    if isinstance(location, unicode):
        location = location.encode('utf8')
    params = urllib.urlencode({'geocode': location, 
        'key': api_key, 'results': results})
    url = '%s%s' % (GEOCODE_URL, params)
    try:
        status_code, response = http.request('GET', url, timeout=timeout)
    except IOError:
        return None, None
    return _get_coords(response, reverse)

def _get_coords(response, reverse):
    '''extract coordinates or place name if reverse is set'''
    try:
        dom = xml.dom.minidom.parseString(response)
        pos_elem = dom.getElementsByTagName(reverse and 'text' or 'pos')[0]
        pos_data = pos_elem.childNodes[0].data
        if reverse: 
            return pos_data
        else:
            return tuple(pos_data.split())
    except IndexError:
        return None, None
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.