User:Plutoz
Userboxes | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Bemutatkozás
Üdv! Nagykanizsán nőttem fel, Veszprémben végeztem a Pannon Egyetemen Mérnök Informatikusként. Jelenleg Balatonfüreden élek. Szeretek (teljesítmény)túrázni, elsősorban ilyenkor gyűjtöm a vidék trackjeit telefonommal. Célom, hogy az OSM is kitűnő térképforrás legyen a szabadba vágyó túrázók számára.
Minőségbiztosítás (QA)
Az alábbiakban az OSM adatbázis tartalmi minőségének növelésére, egységesítésére tett törekvéseim eredményeként létrehozott eljárások, script-ek találhatók. Az alábbi scriptekhez PostgreSQL, PostGIS, valamint az adatbázisban kialakított Database_schema#pgsnapshot séma szükséges.
Azonos nevű, de kis/nagybetűben, ékezetben vagy tagoló karakterekben eltérő POI-k egységesítése
Az adott eljárás célja, az azonos névvel, de eltérő kis/nagybetűvel, ékezettel (pl.: áruház vagy árúház) vagy tagolókarakterekkel( pl.: papír írószer vagy papír-írószer) írt objektumok írásmódjának egységesítése. A scriptet lefuttatva az alábbi kimenethez hasonlót kapunk:
total(numeric) | occurences_count(integer) | occurences(text) | ids(text) |
---|---|---|---|
11 | 2 | állatorvos, Állatorvos | w284079750, w289227546,n2891293575,n2313021216, n3195333006, ... |
11 | 3 | bauMax, Baumax, BAUMAX | n997540658, n375858915,w118506994,w262094887, w136666946, w146227733, ... |
11 | 2 | hírlap, Hírlap | n1502797507, n3194536700, n3124565887, n2381614002, n3188177769, ... |
Oszlopok
- total
- Összes előfordulás száma (írásfüggetlen)
- occurences_count
- Eltérő írásmódok száma
- occurences
- A konkrét, eltérő írásmódok
- ids
- Az érintett objektumok id-je JOSM-be tölthető formátumban (n: node, w: way, r:relation)
Script
-- Works with Osmosis's Snapshot Schema (http://wiki.openstreetmap.org/wiki/Database_schema#pgsnapshot)
-- ids column is directly loadable into JOSM (Download object function: CTRL + SHIFT + O )
SELECT total, array_length(occurrences,1) AS occurences_count, array_to_string(occurrences, ', ') AS occurences, ids FROM (
SELECT unaccent_string(lower(regexp_replace(tag_name,'\W','g'))) AS tag_name, SUM(count) AS total, array_agg(DISTINCT tag_name) AS occurrences, STRING_AGG(ids, ',') AS ids FROM (
SELECT tags->'name' AS tag_name, COUNT(*), STRING_AGG( ('w' || id::text), ', ') AS ids FROM ways
WHERE tags ?| ARRAY['amenity', 'shop', 'leisure', 'tourism'] AND tags ? 'name'
GROUP By tags->'name'
UNION ALL
SELECT tags->'name' AS tag_name, COUNT(*), STRING_AGG( ('n' || id::text), ', ') AS ids FROM nodes
WHERE tags ?| ARRAY['amenity', 'shop', 'leisure', 'tourism'] AND tags ? 'name'
GROUP By tags->'name'
UNION ALL
SELECT tags->'name' AS tag_name, COUNT(*), STRING_AGG( ('r' || id::text), ', ') AS ids FROM relations
WHERE tags ?| ARRAY['amenity', 'shop', 'leisure', 'tourism'] AND tags ? 'name'
GROUP By tags->'name'
) q1
GROUP by unaccent_string(lower(regexp_replace(tag_name,'\W','g')))
) q2
WHERE array_length(occurrences,1) > 1
ORDER BY total DESC, tag_name
További lehetséges/szükséges fejlesztések
A jelenlegi script csak a kis és nagy betűk között tesznek különbséget. Egy lehetséges továbbfejlesztési lehetőség lehet x karakter eltérésig tűrés az esetleges elírások, karakterfelcserélések kimutatására. Pl: zöldséges vagy zödlséges.
Polygonon belüli azonos kulccsal ellátott pontok keresése
Az alábbi kód célja elsősorban a duplikált POI-k közül azok felderítése, ahol az adott entitás pontként és polygonként is létezik és a pont a polygonon belül található. A Script jelenleg az alábbi kulcsokat ellenőrzi: shop=*, amenity=*, leisure=*, tourism=*
A feladatot nehéz, ha nem lehetetlen automatizálni, mivel minden esetben emberi szükséges a meglévő kulcsok értelemszerű egyesítésére. Az alábbi táblázatban például megfigyelhető, hogy nem elengedő a pont törlése, mivel a polygon nem rendelkezik name=* értékkel. A két entitás összefűzése lenne célszerű, de ilyenkor is fordulhat elő kulcs ütközés, pl: a ponton name="Coop", a polygonon viszont name="Coop mini".
Megjegyzés: A polygons tábla létrehozása a segédletben található.
node_tags(hstore) | polygon_tags(hstore) | ids(text) |
---|---|---|
"name"=>"Coop", "shop"=>"convenience" | "shop"=>"convenience", "building"=>"yes", "addr:city"=>"Ráckeve", ... | n3053165552, w301212399 |
Oszlopok
- node_tags
- A ponthoz tartozó összes kulcs-érték pár
- polygon_tags
- A polygonhoz tartozó összes kulcs-érték pár
- ids
- Az érintett objektumok id-je JOSM-be tölthető formátumban (n: node, w: way)
Script
SELECT n.tags AS node_tags, p.tags AS polygon_tags, 'n' || n.id::text || ', w' || p.id::text AS ids FROM polygons p
INNER JOIN nodes n ON n.geom @ p.polygon AND (n.tags -> 'shop' = p.tags -> 'shop')
WHERE p.tags ? 'shop' AND n.tags ? 'shop'
UNION ALL
SELECT n.tags AS node_tags, p.tags AS polygon_tags, 'n' || n.id::text || ', w' || p.id::text AS ids FROM polygons p
INNER JOIN nodes n ON n.geom @ p.polygon AND (n.tags -> 'amenity' = p.tags -> 'amenity')
WHERE p.tags ? 'amenity' AND n.tags ? 'amenity'
UNION ALL
SELECT n.tags AS node_tags, p.tags AS polygon_tags, 'n' || n.id::text || ', w' || p.id::text AS ids FROM polygons p
INNER JOIN nodes n ON n.geom @ p.polygon AND (n.tags -> 'leisure' = p.tags -> 'leisure')
WHERE p.tags ? 'leisure' AND n.tags ? 'leisure'
UNION ALL
SELECT n.tags AS node_tags, p.tags AS polygon_tags, 'n' || n.id::text || ', w' || p.id::text AS ids FROM polygons p
INNER JOIN nodes n ON n.geom @ p.polygon AND (n.tags -> 'tourism' = p.tags -> 'tourism')
WHERE p.tags ? 'tourism' AND n.tags ? 'tourism'
Segédlet
Ékezetes karakterek ékezet nélküliekre cserélése
CREATE OR REPLACE FUNCTION unaccent_string(t text)
RETURNS text AS
$BODY$
DECLARE
result TEXT;
BEGIN
result := regexp_replace(t, '[âãäåāăąá]', 'a','g');
result := regexp_replace(result, '[ÁÂÃÄÅĀĂĄ]', 'A','g');
result := regexp_replace(result, '[èééêëēĕėęě]', 'e','g');
result := regexp_replace(result, '[ĒĔĖĘĚÉ]', 'E','g');
result := regexp_replace(result, '[ìíîïìĩīĭ]', 'i','g');
result := regexp_replace(result, '[ÌÍÎÏÌĨĪĬ]', 'I','g');
result := regexp_replace(result, '[óôõöōŏő]', 'o','g');
result := regexp_replace(result, '[ÒÓÔÕÖŌŎŐ]', 'O','g');
result := regexp_replace(result, '[ùúûüűũūŭů\u00FA]', 'u','g');
result := regexp_replace(result, '[ÚÙÚÛÜŰŨŪŬŮ]', 'U','g');
return result;
END
$BODY$ LANGUAGE plpgsql IMMUTABLE;
SELECT unaccent_string(strings) FROM
( SELECT unnest(ARRAY['ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP', 'árvíztűrő tükörfúrógép']) AS strings) q1;
Polygonok készítése ways táblából
Megjegyzés: A relációkkal leírt multipolygonok megoldásra várnak.
DROP TABLE IF EXISTS polygons;
SELECT id, version, user_id, tstamp, changeset_id, tags, nodes, bbox, ST_SetSRID(ST_MakePolygon(linestring), ST_SRID(linestring)) AS polygon
INTO polygons
FROM ways
WHERE ST_IsClosed(linestring) AND ST_NPoints(linestring) >=4;
CREATE INDEX idx_polygons_bbox ON polygons USING gist (bbox);
CREATE INDEX idx_polygons_polygon ON polygons USING gist (polygon);
CREATE INDEX idx_polygons_gist_tags ON polygons USING gist (tags);
SELECT Populate_Geometry_Columns('public.polygons'::regclass);