Автоматично сваляне на POI-та за забележителности

Хората, които ме познават лично знаят, че последните години пътувам в чужбина като турист. Когато отивам в нов град, за да зная какво забележителности има за гледане, проверявам английската уикипедия за този град и после хвърлям и един поглед на wikitravel. Но в общи линии основната ми процедура е да отворя статията в уикипедия и да нащракам всички връзки в нея, които не са за понятия, а за обекти. Повечето от тях са геотагнати и след като прочета малко за тях и реша дали ми харесват си записвам координатите им и после ги въвеждам в телефона ми като POI-та. Което е ужасно бавно и досадно, а и за съжаление не е унифициран формата на координатите и съществуват статии с различен формат, което налага да превключвам формата в настройките на програмата ми (Mappero), което е още по-досадно. Отдавна се каня да напиша някакъв код, който да ми автоматизира процеса и вчера най-накрая се наканих. Написаната програмка/скрипт/апликейшън/солюшън 😀 е на python и е пробвана под Линукс.
Тя прави следното:

  • пуска заявка към geonames за името на града, получен като единствен параметър от командния ред и по този начин получава координатите
  • получените координати пуска като заявка към XML API на wikilocation. От там получава всички статии в радиус от 5 километра то центъра на града.
  • Обхожда XML файла и генерира файл с име poi.gpx, в който има се съдържат всички статии като точки с техните координати, с име името на статията и с описание хипервръзката към статията в уикипедия.

    Файлът poi.gpx директно се внася в mappero.
    Кодът е даден по-долу:
    from lxml import etree
    from os.path import basename
    from urlparse import urlsplit
    import urllib2
    import sys

    def url2name(url):
    return basename(urlsplit(url)[2])

    def download(url, localFileName = None):
    localName = url2name(url)
    req = urllib2.Request(url)
    r = urllib2.urlopen(req)
    f = open(localFileName, 'wb')
    f.write(r.read())
    f.close()

    city_str=sys.argv[1]
    download("http://api.geonames.org/search?q="+city_str+"&maxRows=1&fuzzy=0.8&username=XXXXXXXXXX", "./geoname")
    city = etree.parse("geoname")
    element = city.getroot()
    city_lat =city.find("geoname/lat")
    city_lon =city.find("geoname/lng")
    download("http://api.wikilocation.org/articles?lat="+city_lat.text+"&lng="+city_lon.text+"&limit=50&radius=5000&format=xml", "articles")
    context = etree.iterparse("articles")
    article_dict = {}
    articles = []

    for action, elem in context:
    if not elem.text:
    text = "None"
    else:
    text = elem.text
    article_dict[elem.tag] = text
    if elem.tag == "article":
    articles.append(article_dict)
    article_dict = {}

    f = open('poi.gpx', 'w')
    f.write("")
    f.write("")
    for a in articles:
    f.write(" ")
    f.write(""+a["title"].encode('utf8')+"")
    f.write(""+a["url"].encode('utf8')+"")
    f.write("")

    f.write("")
    f.close()


    Забележка:
    Трябва ви потребитеско име, за да използвате API-тата на geonames. В кода трабва да смените XXXXXXXXXX с вашето потребителско име.

    Leave a comment

    Your email address will not be published. Required fields are marked *

    This site uses Akismet to reduce spam. Learn how your comment data is processed.