User:Plutoz

From OpenStreetMap Wiki
Jump to navigation Jump to search
Userboxes
Babel user information
hu-N Ennek a szerkesztőnek magyar az anyanyelve.
en-2 This user has intermediate knowledge of English.
Users by language
Flag of Hungary.svg Plutoz has mapped in Hungary.
JOSM Plutoz submits data to OpenStreetMap using JOSM.
OsmAnd icon Plutoz uses OsmAnd, mobile map viewing & navigation app.
Gps-304419.svg Plutoz uses a ZTE Blade V and is willing to answer questions on it from OSM users.
Hiker Plutoz
is a hiker.
Bike Plutoz
is a bicyclist.

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

Egy azon entitás (jelenleg bolt) duplikált jelölé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);