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









