Guest User

Untitled

a guest
Nov 25th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.56 KB | None | 0 0
  1. -- таблица точек на дорогах напротив терминалов. Генерируются точки на всех ближайших дорогах в заданом радиусе
  2. CREATE TEMP TABLE cut_points AS (
  3. SELECT
  4. terminals.id AS id, line_id AS line_id,
  5. ST_ClosestPoint(subquery.wkb_geometry::geography, terminals.geom::geography) AS wkb_geometry,
  6. ST_Distance(terminals.geom::geography, ST_ClosestPoint(subquery.wkb_geometry, terminals.geom)::geography) AS dist
  7. FROM (SELECT
  8. ST_Multi(St_collect(network.wkb_geometry)) AS wkb_geometry,
  9. network.line_id
  10. FROM
  11. (SELECT (ST_dump(wkb_geometry)).geom as wkb_geometry, id AS line_id FROM roads ) AS network
  12. GROUP BY network.line_id ) AS subquery,
  13. terminals
  14. WHERE
  15. st_distance(st_closestpoint(subquery.wkb_geometry, terminals.geom)::geography,terminals.geom::geography) < $MAX_CONN_LEN
  16. );
  17. COMMENT ON TABLE cut_points IS 'nodes at network near poinst. Here points at all roads in distance';
  18.  
  19. -- таблица для выборки только одной ближайшей точки от каждого терминала до дороги
  20. CREATE TEMP TABLE nearest_cutpoints AS
  21. (SELECT cut_points.id,
  22. cut_points.line_id,
  23. cut_points.wkb_geometry
  24. FROM cut_points,
  25.  
  26. (SELECT id,
  27. min(dist) AS dist
  28. FROM cut_points
  29. GROUP BY id) AS subquery
  30. WHERE cut_points.id=subquery.id
  31. AND cut_points.dist=subquery.dist);
  32. COMMENT ON TABLE nearest_cutpoints IS 'Select only one nearest network node for each point';
  33.  
  34. -- таблица связей терминалов с дорогами
  35. DROP TABLE IF EXISTS conn;
  36. CREATE TABLE conn AS (
  37. SELECT
  38. terminals.id AS id,
  39. ST_MakeLine(terminals.geom,nearest_cutpoints.wkb_geometry) AS wkb_geometry,
  40. ST_Distance(terminals.geom::geography, nearest_cutpoints.wkb_geometry::geography) AS dist
  41. FROM terminals JOIN nearest_cutpoints ON terminals.id = nearest_cutpoints.id
  42. );
  43. COMMENT ON TABLE conn IS 'Lines from points to network';
  44.  
  45. --Добавление точку в дороги в местах примыкания пепендикуляров от поставщиков
  46. --Insert nodes to network at intercections with lines from points
  47. UPDATE roads
  48. SET wkb_geometry=ST_Snap(roads.wkb_geometry,points_near_way.wkb_geometry,$TOLERANCE)
  49. FROM
  50. (SELECT ST_Collect(points.wkb_geometry) AS wkb_geometry,
  51. points.line_id
  52. FROM nearest_cutpoints AS points
  53. GROUP BY points.line_id
  54. ) AS points_near_way
  55. WHERE points_near_way.line_id=roads.id;
Add Comment
Please, Sign In to add comment