2012. március 1., csütörtök

Vízrajz topologiájának részbeni javítása sql segítségével


-- Hol van az, amikor a vízfolyásnak egy adott befogadóba kellene torkollania,
-- de a torkolat mégsem érinti a vízfolyást

 
CREATE OR REPLACE VIEW hiba_lista AS
(SELECT
e1.gid_pk,
e1.vizfolyas,
e1.befogado,
e2.vizfolyas as bef_vizfolyas,
e2.befogado as bef_befogado,
ST_DISTANCE(ST_ENDPOINT(e1.the_geom),e2.the_geom) as ep_tavolsag,
ST_DISTANCE(ST_STARTPOINT(e1.the_geom),e2.the_geom) as sp_tavolsag,
ST_DISTANCE(e1.the_geom,e2.the_geom) as tavolsag,
ST_LENGTH(e1.the_geom) as hossz_e1
FROM
        (SELECT (ST_DUMP(the_geom)).geom as the_geom,befogado,vizfolyas,gid_pk FROM eszt_vegleges) as e1,
        (SELECT (ST_DUMP(the_geom)).geom as the_geom,befogado,vizfolyas,gid_pk FROM eszt_vegleges) as e2
    WHERE e1.gid_pk<>e2.gid_pk
    --AND ST_INTERSECTS(e1.the_geom,e2.the_geom) = 'f'
    AND e1.befogado = e2.vizfolyas
    AND ST_DISTANCE(ST_ENDPOINT(e1.the_geom),e2.the_geom)>0.001
ORDER BY tavolsag);


-- Ahol az kezdő pont (sp) távolság 0 és a végpont (ep) távolság nem nulla, ott
-- a geometria irányultsága helytelen

UPDATE eszt_vegleges
SET the_geom = ST_REVERSE(the_geom) WHERE eszt_vegleges.gid_pk IN
(
    SELECT gid_pk FROM hiba_lista
    WHERE ep_tavolsag > 0
    AND sp_tavolsag = 0
);

-- Közeli pontok hozzáfűzése
-- Amikor a vízfolyás épp nem éri el a befogadóját szükséges azt kiegészíteni (sql úton nem feltétlenül a legjobb)
-- Figyelni kell, hogy a két vizsgált geometria valóban ne metsze egymást,
-- És az áthidalt szakasz se legyen egy bizonyos távolságnál nagyobb 

SELECT
e1.gid_pk,ST_ADDPOINT(e1.the_geom,
ST_CLOSESTPOINT(e2.the_geom,e1.the_geom),ST_NPOINTS(e1.the_geom)) as the_geom
INTO to_close
FROM
(SELECT (ST_DUMP(the_geom)).geom as the_geom,befogado,vizfolyas,gid_pk FROM eszt_vegleges) as e1,
(SELECT (ST_DUMP(the_geom)).geom as the_geom,befogado,vizfolyas,gid_pk FROM eszt_vegleges) as e2
WHERE e1.gid_pk<>e2.gid_pk
AND ST_INTERSECTS(e1.the_geom,e2.the_geom) = 'f'
AND e1.befogado = e2.vizfolyas
AND ST_DISTANCE(ST_CLOSESTPOINT(e2.the_geom,ST_ENDPOINT(e1.the_geom)),ST_ENDPOINT(e1.the_geom)) BETWEEN 0.01 AND 20;

UPDATE eszt_vegleges SET the_geom = to_close.the_geom
FROM to_close
WHERE eszt_vegleges.gid_pk = to_close.gid_pk;


-- Túlnyúló pontok levágása
-- Túlnyúló pontok szakaszok ott vannak, ahol az ep távolság nem nulla, viszont a távolság nulla
-- Korlátozás, hogy a levágandó rész nem lehet hosszabb 20 méternél


SELECT
e1.gid_pk,
ST_LINE_SUBSTRING(e1.the_geom,0,ST_LINE_LOCATE_POINT(e1.the_geom,(ST_DUMP(ST_INTERSECTION(e1.the_geom,e2.the_geom))).geom)) as the_geom,
ST_LENGTH(e1.the_geom)*(1-ST_LINE_LOCATE_POINT(e1.the_geom,(ST_DUMP(ST_INTERSECTION(e1.the_geom,e2.the_geom))).geom)) as levagando_tavolsag
INTO to_trim
FROM
(SELECT (ST_DUMP(the_geom)).geom as the_geom,befogado,vizfolyas,gid_pk FROM eszt_vegleges) as e1,
(SELECT (ST_DUMP(the_geom)).geom as the_geom,befogado,vizfolyas,gid_pk FROM eszt_vegleges) as e2
WHERE e1.gid_pk<>e2.gid_pk
AND e1.befogado = e2.vizfolyas
AND ST_DISTANCE(ST_ENDPOINT(e1.the_geom),e2.the_geom) >0
AND ST_DISTANCE(e1.the_geom,e2.the_geom) = 0;

UPDATE eszt_vegleges SET the_geom = to_trim.the_geom
FROM to_trim
WHERE eszt_vegleges.gid_pk = to_trim.gid_pk
AND to_trim.levagando_tavolsag<20;


Nincsenek megjegyzések:

Megjegyzés küldése