Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --Функция смещения узлов в топологическом отношении
- CREATE OR REPLACE FUNCTION SimplifyEdgeGeom(atopo varchar, anedge int, maxtolerance float8)
- RETURNS float8 AS $$
- DECLARE
- tol float8;
- sql varchar;
- BEGIN
- tol := maxtolerance;
- LOOP
- sql := 'SELECT topology.ST_ChangeEdgeGeom(' || quote_literal(atopo) || ', ' || anedge
- || ', ST_Simplify(geom, ' || tol || ')) FROM '
- || quote_ident(atopo) || '.edge WHERE edge_id = ' || anedge;
- BEGIN
- RAISE DEBUG 'Running %', sql;
- EXECUTE sql;
- RETURN tol;
- EXCEPTION
- WHEN OTHERS THEN
- RAISE WARNING 'Simplification of edge % with tolerance % failed: %', anedge, tol, SQLERRM;
- tol := round( (tol/2.0) * 1e8 ) / 1e8; -- round to get to zero quicker
- IF tol = 0 THEN RAISE EXCEPTION '%', SQLERRM; END IF;
- END;
- END LOOP;
- END
- $$ LANGUAGE 'plpgsql' STABLE STRICT;
- -- создаем новое топологическое отношение
- -- polygons - таблица с геометриями, которые нужно симплифицировать
- -- geometry - поле с геометриями объектов
- -- 0.05 - порог объединение объектов в узле
- SELECT topology.CreateTopology('polygons_topo', find_srid('public', 'polygons', 'geometry'), 0.05);
- -- добавляем поле, в которую будем писать попологию
- SELECT topology.AddTopoGeometryColumn('polygons_topo', 'public', 'polygons', 'topogeometry', 'MULTIPOLYGON');
- -- обновляем поле с топологией
- UPDATE polygons SET topogeometry = topology.toTopoGeom(geometry, 'polygons_topo', 1);
- -- вычисляем новые узлы в топологическом отношении, параметр 10000 указываем с каким шагом симплифицировать узлы
- SELECT SimplifyEdgeGeom('polygons_topo', edge_id, 10000) FROM polygons_topo.edge;
- -- добавляем поле для симплифицированной геометрии
- ALTER TABLE polygons ADD geomsimp GEOMETRY;
- -- обновляем поле геометрии по "симплифицированным" узлам
- UPDATE polygons SET geomsimp = topogeometry::geometry;
- -- создаем пространственный индекс для симплифицированных геометрий
- CREATE INDEX sidx_polygons_geomsimp ON public.polygons USING gist(geomsimp);
- -- так как топология на больше не нужна удалем ее. Если топологию не удалить и попробовать повторно изменить узлы топологии,
- -- то результат может быть не предсказуем, так как они уже редактировались (были смещены)
- SELECT topology.droptopology('polygons_topo');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement