Osmose QA is a quality assurance tool that analyzes OpenStreetMap data to detect issues using over 200 rules. It provides interactive maps and reports to help identify missing data, errors, and suggest improvements. The tool splits analysis of OpenStreetMap data among over 70 countries and regions to allow for localized knowledge and practices. It also integrates third-party open data sources like postal office locations in France to detect discrepancies between OpenStreetMap and the additional datasets.
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
20150607 sotm-us-osmose-qa
1. SotM-US 2015
Osmose QA
Issue reported
at NYC on 2015-06-07
Frédéric Rodrigo <frederic@carte-libre.fr>
(c)left 2015 - CC-BY-SA v3.0
http://osmose.openstreetmap.fr
2. Osmose QA ?
Quality tool
Data analysis
Issues detection with rules
Missing data from OpenData
Integration suggestions
3. Osmose QA way
No duplicate analyses with other tools
No force mapping way
– Adapt to local mapping approach
– No choose one alternative among others
4. Frontend - Interface
1 ligne 2 ligne 3 ligne 4 ligne
0
2
4
6
8
10
12
1 colonne
2 colonne
3 colonne
10. Backend - Countries
Split : specifics analyser
– Languages, Country, Projection
→ allow statistics
Sublevels split : France, Italy, Belgium, USA, Canada...
70% of planet data
→ Need more servers
→ Aim self support from local community: mapping practice,
knowledge, OpenData
11. Backend - Analysers
Analysers
– Rules on one object tags
● Capitals, ref...
– SQL spatial rules or multi-objects check
● Reverse roundabout, unconnected highway...
– OpenData features checking
● Schools, post offices, bus stops...
More than 200 analysers
12. Sax analyser
class Name_Spaces(Plugin):
def init(self, logger):
self.errors[903] = { "item": 5010, "level": 2, "tag": ["name", "fix:chair"], "desc": T_(u"Too
many spaces") }
def node(self, data, tags):
name = tags[u"name"]
if u" " in name:
err.append({"class": 903, "subclass": 0, "text": T_("Name contains successive
spaces")})
if len(err) > 0:
name = re.sub(r' +', ' ', name.strip())
for e in err:
e["fix"] = {"name": name}
issue definition
issue detection
issue possible fix
13. Osmosis analyserSql10 = """
SELECT
id,
ST_AsText(way_locate(linestring))
FROM
ways
WHERE
tags ? 'junction' AND tags->'junction' = 'roundabout' AND
is_polygon AND ST_IsSimple(linestring) AND
{1} ST_OrderingEquals(ST_Makepolygon(linestring), st_forceRHR(ST_Makepolygon(linestring)))"""
class Analyser_Osmosis_Roundabout_Reverse(Analyser_Osmosis):
def __init__(self, config, logger = None):
Analyser_Osmosis.__init__(self, config, logger)
self.classs_change[1] = {"item":"1050", "level": 1, "tag": ["highway", "roundabout", "fix:chair"], "desc": T_(u"Reverse
roundabout") }
self.callback10 = lambda res: {"class":1, "data":[self.way_full, self.positionAsText]}
if self.config.options.get("driving_side") == "left":
self.driving_side = "NOT "
else:
self.driving_side = ""
def analyser_osmosis_all(self):
self.run(sql10.format("", self.driving_side), self.callback10)
issue detection
issue definition
20. Stats
15 millions of issues
– 850 000 of level=1
3 700 000 executed analyses
– 12 000 analysis / 2 days
15 virtuals serveurs
500 rules checked
19,8 / 28 Go : 70 % of planet
352 area (countries or sub areas)
21. Maproulette
Bridge to Maproulette
Reports choose:
– [world] Highway intersecting building
– [world] Object tagged twice as node or way
– [france] Missing soccer pitch
– [world] Broken highway level continuity
→ OSM as a Marathon