Rengeteg fajta adatforrás érhető el, amellyel az OpenStreetMap-ben lévő adatok kiegészíthetők. Azonban ezeknek az adatoknak a felhasználásának engedélyeztetése OpenStreetMap szempontjából nem mindig egyszerű és egyértelmű. A felhasználható adatok beimportálása az OpenStreetMap adatbázisba is összetett feladat, figyelni kell a már meglévő adatokra: csak a megfelelő adatok és új POI-k kerüljenek fel, ne legyenek duplikációk. Ráadásul az OpenStreetMap-ben lévő adatok sem konzisztensek. Az egymás közelében hasonló tulajdonságú POI-k közül biztos, hogy jót kívánunk szerkeszteni? Mi az OpenStreetMap-be importálásnak a menete? Ki hagyja jóvá, kikkel lehet konzultálni? Számos kérdés, amelyek megválaszolása egyáltalán nem triviális. Ebben az előadásban összefoglalom tapasztalataimat, eddigi importálásokat, az ezzel kapcsolatos terveimet, valamint bemutatom azokat a munkafolyamatokat és az egyszerű pythonos eszközöket, amelyeket készítettem a feladat megkönnyítésére.#Importálás, #Python, #Overpass, #JOSM, #Közösség
„Mozilla: a mi hősünk Te vagy!” előadás a Corvinus Nyári Egyetem rendezvényen
Külső adatok (GTFS, UIC, boltok) félautomatikus importálása az OpenStreetMap-be
1. Külső adatok félautomatikus importálása1
Szalai Kálmán (KAMI)
kami911@gmail.com
@kami911kami
OpenStreetMap Meetup – 2017. november 6.
Külső adatok (GTFS, UIC, boltok) félautomatikus
importálása az OpenStreetMap-be
2. Külső adatok félautomatikus importálása2
Miről lesz ma szó?
Az előző rész tartalmából
GTFS, GO-Sync, tervezett átalakítások
Újratervezés
Python alapú apró programok, munkafolyamatok
Elvégzett feladatok, importálások
Felmerült problémák
További tervek
UIC, boltok, bankok és egyéb POI-k
3. Külső adatok félautomatikus importálása3
GTFS → OSM import
●
Mi a GTFS?
●
General Transit Feed Specifcation
●
Google által készített egységes adatformátum
menetrendi adatok tárolására (Google Maps)
●
Típusai (Google Transit API)
●
Statikus
●
https://developers.google.com/transit/gtfs/
●
Dinamikus
●
https://developers.google.com/transit/gtfs-realtime/
4. Külső adatok félautomatikus importálása4
GTFS – Statikus
Formátum
●
ZIP-fájl
●
Letölthető
●
Szöveges fájlokat
tartalmaz
5. Külső adatok félautomatikus importálása5
GTFS – Kötelező adatok
Tárolt adatok (kötelező)
●
Szolgáltató
●
Megállók (stops.txt) → OSM!
●
ID, kód, név, leírás, koordináta, zóna, url, kerekesszék, stb.
●
Útvonalak (routes.txt) → OSM(?)
●
ID, kód, név, leírás, jármű fajtája, url
●
Utazás (trips.txt), valamint érkezés és indulás idők
(stop_times.txt) → OSM(?)
●
Utazási idők, valamint érkezési és indulási idők
●
Naptár (calendar.txt)
●
Melyik nap érvényes
6. Külső adatok félautomatikus importálása6
GTFS – További adatok
További adatok (nem kötelező)
●
Útvonal (shapes.txt) → OSM!
●
ID, kód,koordináta
●
Viteldíjak (fare_attributes.txt és fare_rules.txt)
●
Időközök (frequencies.txt)
●
Átszállások (transfers.txt)
●
További információk (feed_info.txt)
7. Külső adatok félautomatikus importálása7
GTFS – Mire használható?
Lehetséges adatimportálás az OSM-be:
●
Megállók felvitele és ellenőrzése
●
GTFS: stops.txt
●
OSM: ref:bkk
●
Útvonalak felvitele és ellenőrzése
●
Útvonal, mint téradat
●
GTFS: shapes.txt
●
Indulási idők (új ötlet, lenne értelme)
●
OSM: stop_times.txt
●
GTFS: service_times
8. Külső adatok félautomatikus importálása8
GTFS – Elérhető adatok I
●
Budapesti Közlekedési Központ
●
http://www.bkk.hu/gtfs/budapest_gtfs.zip
●
Dokumentum: http://www.bkk.hu/magunkrol/fejlesztoknek/
●
Magyar Állam Vasutak
●
https://www.mavcsoport.hu/gtfs-igenybejelento
●
Jelszóval védett hozzáférés, engedélyt kértem és kaptam az
OSM felhasználáshoz
9. Külső adatok félautomatikus importálása9
GTFS – Elérhető adatok II
●
VOLÁN
●
Nem válaszoltak a megkeresésre, még próbálkozok
●
Szeged (nem hivatalos, OSM téradatokkal)
●
https://transitfeeds.com/p/dakk/625
●
http://members.upc.hu/cseh.attila/google_transit.zip
●
https://code.google.com/archive/p/googletransitdatafeed/wikis
/PublicFeeds.wiki
●
https://menetrend.appcorner.eu/data
10. Külső adatok félautomatikus importálása10
GO-Sync tapasztalatok
●
GO-Sync csak „bus” taget ismer más
közlekedési járművet nem. (például: vasút,
hajó, stb.).
●
Java-s alkalmazás
●
Grafkus felületen szerkesztés
●
JOSM mellett nehézkes a használata
●
Inkább egyszerűbb eszközöket használnék → Python
programok
●
OSM kimenet → Közösségi egyeztetés
12. Külső adatok félautomatikus importálása12
BKK GTFS és OSM megfgyelések I
●
Taginfo:
●
gtfs csak source-ként van;
●
gtfs_id = 0
●
ref:bkk = 118
●
ref:bkv = 5260
●
fref:bkv = 1
●
ref = 182 (rengeteg más is használja, nehéz kiválogatni)
●
code = 876
●
Módosítások
●
https://github.com/KAMI911/osm-import-
request/tree/master/ref_bkv_to_ref_bkk
●
BKK: 6482 az OSM-ben, 7419 a GTFS-ben
13. Külső adatok félautomatikus importálása13
BKK GTFS és OSM megfgyelések II
●
Eltérések és hibák okai
●
Nevek eltérése
●
A név a fő egyeztetési szempont
●
Aluljáró kijáratok neveiben szerepelnek a kijáratok betűjelei
●
Örs vezér tere [A]
●
A kisföldalatti állomásnevekben az irányok is benne vannak
●
Oktogon (» Mexikói út)
●
Oktogon (» Vörösmarty tér)
●
Túl sok hasonló megálló van a közelben
●
A távolság a másik egyeztetési szempont
●
Több objektumon van ref:bkk címke egy állomáson belül
●
{n}, F{n} mellett, L*, LM*, CSLM*, CSF*, stb csomópontok és
lejáratok
16. Külső adatok félautomatikus importálása16
MÁV GTFS és OSM megfgyelések I
●
Taginfo
●
ref:mav = 1295
●
Módosítások
●
https://github.com/KAMI911/osm-import-
request/blob/master/ref_mav/osm_same_name.osm
●
MÁV: 1295 az OSM-ben, 1230 a GTFS-ben
17. Külső adatok félautomatikus importálása17
MÁV GTFS és OSM megfgyelések II
●
Eltérések és hibák okai
●
Rosszul címkézett állomások
●
railway=station-ból nem egy van → public_transport=stop_position
●
Névtelen állomások
●
Nem MÁV állomások
●
Metró- és egyéb állomások
●
Ezeket az importálás során kiszűrtem
22. Külső adatok félautomatikus importálása22
Tömeges importálás I
●
Előkészületek
●
Adatok és OpenStreetMap megismerése
●
Mit ronthat el az importálás
●
Közösségi igénykeltés
●
Tervezett import megbeszélése
●
Komplexebb importálások ellenőriztetése a közösséggel
●
Licenc és engedélykérés
●
https://github.com/KAMI911/E12n/tree/master/osm
23. Külső adatok félautomatikus importálása23
Tömeges importálás II
●
Adminisztráció
●
Importálás oldal, dokumentálás
●
https://wiki.openstreetmap.org/wiki/WikiProject_Hungary/Import%C3%A
1l%C3%A1s
●
Import ellenőriztetése
●
Helyi
●
Globális: imports@openstreetmap.org
●
Importálás elvégzése
●
Feltöltés
●
Közösség tájékoztatás
●
Dedikált OSM account: nev+projekt@gmail.com trükk)
25. Külső adatok félautomatikus importálása25
Elvégzett feladatok
●
Importálások hozzáadása a wiki oldalhoz
●
https://wiki.openstreetmap.org/wiki/WikiProject_Hungary/Imp
ort%C3%A1l%C3%A1s
●
A ref, ref:bkk, ref:bkv, code egységesítése
ref:bkk-ra (első ötlet „gtfs_id” volt)
●
2011-es importálás frissítése és javítása
●
Hibásan írt BKK megállónevek javítása
●
MÁV GTFS adatokból a ref:mav felvitele
●
Itt még nem voltak importált adatok
●
GO-Sync használata és fejlesztése helyett apró
Python programok készítése
27. Külső adatok félautomatikus importálása27
Python alapú munkafolyamat
Python progam
OSM over-pass
lekérdezések
Külső adatok
CSV és web
Python külső
modulok
CSV-fájl
OSM XML fájl
Ellenőrzés
OSM importálás
JOSM progam
OSM javítás
JOSM progam
28. Külső adatok félautomatikus importálása28
Felhasznált eszközök
●
Adatkezeléshez
●
Numpy
●
Pandas
●
Lxml
●
BeautifulSoup
●
Nominatim és OverPass lekérdezések
●
OSMPythonTools
●
Térbeli keresés
●
Scipy
29. Külső adatok félautomatikus importálása29
Fejlesztés alatt lévő eszközök
https://github.com/KAMI911/GTFS2OSM
●
g2o-stops.py
●
BKK és MÁV GTFS adatok összehasonlítása az OSM adatokkal
●
CSV és OSM kimenet
●
g2o-shape.py
●
GTFS adaton alapján OSM LineString
●
OSM kimenet
●
hu_uic_parser.py
●
http://www.vpe.hu/takt oldalról az adatok CSV-fájllá alakítása
●
CSV kimenet, később OSM kimenet is importáláshoz
30. Külső adatok félautomatikus importálása30
OSM fájl készítés
def generate_xml(pd):
from lxml import etree
import lxml
osm_xml_data = etree.Element('osm', version='0.6', generator='JOSM')
for index, row in pd.iterrows():
data = etree.SubElement(osm_xml_data, 'node', action='modify',
id='{}'.format(row['osm_id']), lat='{}'.format(row['osm_lat']),
lon='{}'.format(row['osm_lon']), user='{}'.format(row['osm_user']),
timestamp='{}'.format(row['osm_timestamp']), uid='{}'.format(row['osm_uid']),
changeset='{}'.format(row['osm_changeset']), version='{}'.format(row['osm_version']))
comment = etree.Comment(' Stop name: {0}, ID: {1} '.format(row['stop_name'],
row['osm_merged_refs']))
data.append(comment)
if 'railway' in looking_for:
row['osm_tags']['ref:mav'] = row['stop_id']
for k, v in row['osm_tags'].items():
tags = etree.SubElement(data, 'tag', k='{}'.format(k), v='{}'.format(v))
osm_xml_data.append(data)
return lxml.etree.tostring(osm_xml_data, pretty_print=True, xml_declaration=True,
encoding="UTF-8")
31. Külső adatok félautomatikus importálása31
Overpass API lekérdezés
def query_overpass(area_id, query_statement, element_type='node'):
# Query Overpass based on area
global overpass
query = overpassQueryBuilder(area=area_id, elementType=element_type,
selector=query_statement)
return overpass.query(query)
city = 'Budapest'
local_area_id = get_area_id(city)
overpass = overpass.Overpass()
p = '"highway"="bus_stop"'
osm_stops_query = query_overpass(str(local_area_id), p, t)
32. Külső adatok félautomatikus importálása32
BeautifulSoup adatgyűjtés
table = soup.find('table', attrs={'style': 'text-align: left;'})
table_body = table.find('tbody')
rows = table_body.find_all('tr')
for row in rows:
cols = row.find_all('td')
link = cols[1].find('a').get('href') if cols[1].find('a') != None else []
sub_soup = download_soup('{}/{}'.format(link_base, link))
if sub_soup != None:
table = sub_soup.find('table', attrs={'style': 'text-align: left;'})
table_body = table.find('tbody')
sub_rows = table_body.find_all('tr')
add_cols = []
for sub_row in sub_rows:
sub_cols = sub_row.find_all('td')
sub_cols = [element.text.strip() for element in sub_cols]
add_cols.append(sub_cols[1])
cols = [element.text.strip() for element in cols]
cols.append(link)
if 'add_cols' in locals():
cols.append(add_cols)
data.append(cols)
df = pd.DataFrame(data=data[1:], columns = data[0])
34. Külső adatok félautomatikus importálása34
Levelezés
Szeretnénk arra kérni az Ön által képviselt intézményt,
hogy a fenti licenceknek megfelelően legyenek
szívesek az OpenStreetMap projekt részére az Önök
tulajdonában álló téradatokat biztosítani, OdbL
licenccel kompatibilis licenc alatt. Az így közzétett
adatok beépülhetnek az OpenStreetMap térképi
adatbázisába és a közösség számára hasznosíthatóvá
válnak.
(https://github.com/KAMI911/E12n/tree/master/osm)
35. Külső adatok félautomatikus importálása35
Válasz A cégtől:
„Köszönjük a megkeresést.
Amennyiben a jövőben részünkről igény merül fel az
együttműködésre, jelentkezni fogunk.”
36. Külső adatok félautomatikus importálása36
1. válasz B cégtől:
„Ezzel egyidejűleg 197 járásban jelenik meg
fogyasztóvédelmi elsőfokú hatósági feladatkör, így
tehát a fogyasztók 2017. január 1-től panaszaikkal
elsősorban a területileg illetékes járási hivatalokhoz
fordulhatnak.”
Melléklet: lista a fogyasztóvédelmi hatóságok
elérhetőségeiről
37. Külső adatok félautomatikus importálása37
2. válasz B cégtől:
„Kérem, hogy használja a szabadon felhasználható
listát, ami a honlapon van.”
38. Külső adatok félautomatikus importálása38
Válasz C cégtől:
„Tájékoztatjuk, hogy az illetékesektől kapott
információ alapján nem tudjuk fájl formájában
biztosítani az adatbázist, a honlapon elhelyezett
információk a publikusak.”
A honlapon találtam GeoJSON-t :)
40. Külső adatok félautomatikus importálása40
Problémák I
●
Kommunkáció
●
Adatforrások felkutatása
●
Mi a megfelelő formula az adatkérésre?
●
https://github.com/KAMI911/E12n/tree/master/osm
●
Elérhető =≠ Szabad
●
Publikus =≠ Szabad
●
Szabadon használható, de az adat copyright-tal védett
●
OpenStreetMap importálás
●
Mi az importálás feltétele?
●
Mekkora egyetértés kell?
●
Elegendő-e egy határidő az importálás előtt?
●
Mennyi legyen az?
41. Külső adatok félautomatikus importálása41
Problémák II
●
OpenStreetMap adatok változatossága
●
Igény az egységes címkézésre
●
Részben jól szerkesztett OSM adatok
●
Hibakereső / Hibakeresés
●
Léteznek már ilyen eszközök?
42. Külső adatok félautomatikus importálása42
További tervek II
●
Új adatok gyűjtése (POI)
●
Boltok, áruházláncok
●
Bankok
●
Éttermek, és étteremláncok
●
UIC (International Union of Railways)
●
Meglévő POI-k egységesítése
●
Azonos írásmód
●
Azonos kategória
●
Wiki oldal → közösen összeállítani
●
Azonosítási mechanizmus, szabály
●
Elegendő-e az OSM ID, vagy valami ref:* szükséges
43. Külső adatok félautomatikus importálása43
További tervek III
●
Adatok adatbázisba töltése
●
GTFS (Postgres, PostGIS, GTFSDB, ORM, python)
●
https://github.com/OpenTransitTools/gtfsdb
●
OSM (Postgres, PostGIS), napi frissítéssel
●
POI
●
Adatbázis építés a POI-kból (cím, koordináta, nyitvatartás, tag-ek)
●
Nominatim alapján koordináták
●
A saját POI adatbázis automatikus frissítése
●
Webes szerkesztő
●
Webes megjelenítő
●
Ütemezett automatikus frissítések OSM irányban
46. Külső adatok félautomatikus importálása46
További eszközök, információk I
GTFS2OSM:
https://github.com/KAMI911/GTFS2OSM/
OSM import request-jeim:
https://github.com/KAMI911/osm-import-request
OSM engedélykérés adatok felhasználásához:
https://github.com/KAMI911/E12n/tree/master/o
sm
Osm-python-tools:
https://github.com/mocnik-science/osm-python-t
ools
47. Külső adatok félautomatikus importálása47
További eszközök, információk II
GTFSDB:
https://github.com/OpenTransitTools/gtfsdb
GTFS: https://developers.google.com/transit/
GTFS validator:
https://github.com/google/transitfeed
Állomások (1143): http://overpass-turbo.eu/s/lBc
Állomások (2252): http://overpass-turbo.eu/s/lBd
https://transit.land/feed-registry/?country=Hung
ary
https://github.com/mapourtransit/gtfs-maker