Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.83 KB | None | 0 0
  1. --Функция смещения узлов в топологическом отношении
  2. CREATE OR REPLACE FUNCTION SimplifyEdgeGeom(atopo varchar, anedge int, maxtolerance float8)
  3. RETURNS float8 AS $$
  4. DECLARE
  5. tol float8;
  6. sql varchar;
  7. BEGIN
  8. tol := maxtolerance;
  9. LOOP
  10. sql := 'SELECT topology.ST_ChangeEdgeGeom(' || quote_literal(atopo) || ', ' || anedge
  11. || ', ST_Simplify(geom, ' || tol || ')) FROM '
  12. || quote_ident(atopo) || '.edge WHERE edge_id = ' || anedge;
  13. BEGIN
  14. RAISE DEBUG 'Running %', sql;
  15. EXECUTE sql;
  16. RETURN tol;
  17. EXCEPTION
  18. WHEN OTHERS THEN
  19. RAISE WARNING 'Simplification of edge % with tolerance % failed: %', anedge, tol, SQLERRM;
  20. tol := round( (tol/2.0) * 1e8 ) / 1e8; -- round to get to zero quicker
  21. IF tol = 0 THEN RAISE EXCEPTION '%', SQLERRM; END IF;
  22. END;
  23. END LOOP;
  24. END
  25. $$ LANGUAGE 'plpgsql' STABLE STRICT;
  26.  
  27. -- создаем новое топологическое отношение
  28. -- polygons - таблица с геометриями, которые нужно симплифицировать
  29. -- geometry - поле с геометриями объектов
  30. -- 0.05 - порог объединение объектов в узле
  31. SELECT topology.CreateTopology('polygons_topo', find_srid('public', 'polygons', 'geometry'), 0.05);
  32. -- добавляем поле, в которую будем писать попологию
  33. SELECT topology.AddTopoGeometryColumn('polygons_topo', 'public', 'polygons', 'topogeometry', 'MULTIPOLYGON');
  34. -- обновляем поле с топологией
  35. UPDATE polygons SET topogeometry = topology.toTopoGeom(geometry, 'polygons_topo', 1);
  36. -- вычисляем новые узлы в топологическом отношении, параметр 10000 указываем с каким шагом симплифицировать узлы
  37. SELECT SimplifyEdgeGeom('polygons_topo', edge_id, 10000) FROM polygons_topo.edge;
  38. -- добавляем поле для симплифицированной геометрии
  39. ALTER TABLE polygons ADD geomsimp GEOMETRY;
  40. -- обновляем поле геометрии по "симплифицированным" узлам
  41. UPDATE polygons SET geomsimp = topogeometry::geometry;
  42. -- создаем пространственный индекс для симплифицированных геометрий
  43. CREATE INDEX sidx_polygons_geomsimp ON public.polygons USING gist(geomsimp);
  44. -- так как топология на больше не нужна удалем ее. Если топологию не удалить и попробовать повторно изменить узлы топологии,
  45. -- то результат может быть не предсказуем, так как они уже редактировались (были смещены)
  46. SELECT topology.droptopology('polygons_topo');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement