Příklady topologického zpracování vektorových data

Otázky

1. Najděte parcely, které sousedí s parcelou, ve které se nachází adresní bod s označením kod=22560840.
278, 280/1, 562, 279/5
2. Proveďte generalizaci parcel.
-

Řešení

1. Najděte parcely, které sousedí s parcelou, ve které se nachází adresní bod s označením kod=22560840.
278, 280/1, 562, 279/5
WITH parcela AS
(
SELECT p.geom FROM parcely as p
JOIN ruian_praha.adresnimista AS a
ON a.kod=22560840 AND ST_Within(a.geom, p.geom)
)
SELECT id, kmenovecislo, pododdelenicisla FROM parcely AS p
JOIN parcela
ON st_touches(p.geom, parcela.geom);

topologické řešení: seznam hran (verze 1)

SELECT topology.ST_GetFaceEdges('topo_parcely', f.face_id) FROM
(
 SELECT face_id FROM topo_parcely.face AS f JOIN
  ruian_praha.adresnimista AS a ON a.kod=22560840 AND a.geom && f.mbr AND
  ST_Within(a.geom, topology.ST_GetFaceGeometry('topo_parcely', f.face_id))
) AS f;

topologické řešení: seznam hran (verze 2)

SELECT topology.ST_GetFaceEdges('topo_parcely', f.face_id) FROM
(
   SELECT
   topology.getFaceByPoint('topo_parcely', geom, 0) face_id
   FROM ruian_praha.adresnimista WHERE kod = 22560840
) AS f;

topologické řešení: seznam hran (verze 3)

with original_face_id AS
(
  SELECT
  topology.getFaceByPoint('topo_parcely', geom, 0) face_id
  FROM ruian_praha.adresnimista WHERE kod = 22560840
)
select * FROM original_face_id, topology.ST_GetFaceEdges('topo_parcely', face_id)
  JOIN topo_parcely.edge ON edge_id = @edge;

topologické řešení: seznam sousedních stěn

SELECT
 CASE right_face
  WHEN original_face_id.face_id THEN left_face
  ELSE right_face
 END AS face
 FROM original_face_id, topology.ST_GetFaceEdges('topo_parcely', face_id)
 JOIN topo_parcely.edge ON edge_id = @edge;

topologické řešení: výsledek

WITH original_face_id AS
(
   SELECT
   topology.getFaceByPoint('topo_parcely', geom, 0) face_id
   FROM ruian_praha.adresnimista WHERE kod = 22560840
),
sousedni AS
(
   SELECT
   CASE right_face
      WHEN original_face_id.face_id THEN left_face
      ELSE right_face
   END AS face
   FROM original_face_id
   , topology.ST_GetFaceEdges('topo_parcely', face_id)
   JOIN topo_parcely.edge ON edge_id = @edge
)
SELECT id, kmenovecislo, pododdelenicisla
FROM parcely p
JOIN topo_parcely.relation r
ON (p.topo).id = r.topogeo_id
AND (p.topo).layer_id = r.layer_id
AND (p.topo).type = 3
WHERE r.element_id IN
(
   SELECT face
   FROM sousedni
);
2. Proveďte generalizaci parcel.
-
SELECT st_simplify(geom, 5) AS geom
FROM parcely;

některé z prvků nejsou validní

SELECT st_isvalid(geom)
FROM
(
 SELECT st_simplify(geom, 5) AS geom
 FROM parcely
) AS foo;

řešení

SELECT st_simplifypreservetopology(geom, 5) AS geom
FROM parcely;

řešení topologicky korektní

SELECT id, topology.st_simplify(topo, 15) geom
FROM parcely;