Você está na página 1de 3

F:\DCIM\AABE\20171109-CTE.

sql 1
1 DECLARE @idruta int = 1
2 DECLARE @longrutam float = (SELECT ROUND( geom.STLength(), 6) FROM Normalizacion..RN0011_NUEVA WHERE
Layer = CASE WHEN @idruta = 1 THEN 'IDA' ELSE 'VUELTA' END)
3 DECLARE @linestring geometry = (SELECT geom FROM Normalizacion..RN0011_NUEVA WHERE Layer = CASE WHEN
@idruta = 1 THEN 'IDA' ELSE 'VUELTA' END)
4 /*factor 0.000011*/
5 ;
6 WITH puntos (PuntoN, x, y) AS (
7 SELECT 1, ROUND( @linestring.STPointN(1).STX, 6), ROUND( @linestring.STPointN(1).STY, 6)
8 UNION ALL
9 SELECT PuntoN+1, ROUND( @linestring.STPointN(PuntoN+1).STX, 6), ROUND( @linestring.STPointN(PuntoN
+1).STY, 6)
10 FROM puntos
11 WHERE PuntoN < 100--@linestring.STNumPoints()
12 ),
13 rectas (id, x1, y1, x2, y2) AS (
14 SELECT PuntoN, x, y, LEAD(x,1) OVER(ORDER BY PuntoN), LEAD(y,1) OVER(ORDER BY PuntoN) FROM puntos
15 ),
16 puntosruta (idrec, PuntoN, x1, y1, x2, y2, radianeso, signoxo, signoyo, drecta, inicio, fin, radianes,
signox, signoy)
17 AS (
18 SELECT 1
19 , id, x1, y1, x2, y2
20 , CASE WHEN Y1=Y2 THEN 0 WHEN X1=X2 THEN PI()/2 ELSE ABS( ATAN((Y2-Y1)/(X2-X1))) END
21 , CASE WHEN X1<X2 THEN 1 WHEN X1>X2 THEN -1 ELSE 0 END
22 , CASE WHEN Y1<Y2 THEN 1 WHEN Y1>Y2 THEN -1 ELSE 0 END
23 , ROUND( SQRT( POWER( Y2-Y1, 2) + POWER( X2-X1, 2)), 6)
24 , CONVERT( float, 0)
25 , ROUND( SQRT( POWER( Y2-Y1, 2) + POWER( X2-X1, 2)), 6)
26 , CASE WHEN Y1=Y2 THEN PI()/2 WHEN X1=X2 THEN 0 ELSE ABS( ATAN(-(X2-X1)/(Y2-Y1))) END
27 , CASE WHEN Y1<Y2 THEN -1 WHEN Y1>Y2 THEN 1 ELSE 0 END
28 , CASE WHEN X1<X2 THEN 1 WHEN X1>X2 THEN -1 ELSE 0 END
29 FROM rectas
30 WHERE y2 IS NOT NULL
31 AND id = 1
32 UNION ALL
33 SELECT c.idrec+1
34 , a.id, a.x1, a.y1, a.x2, a.y2
35 , CASE WHEN a.Y1=a.Y2 THEN 0 WHEN a.X1=a.X2 THEN PI()/2 ELSE ABS( ATAN((a.Y2-a.Y1)/(a.X2-a.X1))) END

36 , CASE WHEN a.X1<a.X2 THEN 1 WHEN a.X1>a.X2 THEN -1 ELSE 0 END


37 , CASE WHEN a.Y1<a.Y2 THEN 1 WHEN a.Y1>a.Y2 THEN -1 ELSE 0 END
38 , ROUND( SQRT( POWER( a.Y2-a.Y1, 2) + POWER( a.X2-a.X1, 2)), 6)
39 , c.inicio + c.drecta
40 , c.fin + ROUND( SQRT( POWER( a.Y2-a.Y1, 2) + POWER( a.X2-a.X1, 2)), 6)
41 , CASE WHEN a.Y1=a.Y2 THEN PI()/2 WHEN a.X1=a.X2 THEN 0 ELSE ABS( ATAN(-(a.X2-a.X1)/(a.Y2-a.Y1)))
END
42 , CASE WHEN a.Y1<a.Y2 THEN -1 WHEN a.Y1>a.Y2 THEN 1 ELSE 0 END
43 , CASE WHEN a.X1<a.X2 THEN 1 WHEN a.X1>a.X2 THEN -1 ELSE 0 END
44 FROM rectas a
45 INNER JOIN puntosruta c ON a.id = c.idrec+1
46 WHERE a.y2 IS NOT NULL
47 )
48 ,
49
50
51
52
53 distancias (id,DistanciaOrigen, DistanciaOrigenFin) AS (
54 SELECT
55 MAX(ID)
56 , ROUND( t.DistanciaOrigen * 1000 * 0.000011, 6)
57 , LEAD(t.DistanciaOrigen * 1000 * 0.000011
58 , 1
59 , IIF( @longrutam > t.DistanciaOrigen * 1000 * 0.000011, @longrutam, t.DistanciaOrigen * 1000 *
0.000011))
60 OVER (ORDER BY t.DistanciaOrigen) AS x
61 FROM Normalizacion..Vialidad_RNTramos t
F:\DCIM\AABE\20171109-CTE.sql 2
62 WHERE t.Ruta = '0011'
63 AND ID<40890 --AND 41102<ID AND ID<41202 --40889
64 GROUP BY t.DistanciaOrigen
65 )
66 ,
67 tramos (PuntoN,idvial,x1,y1,X2,Y2,radianeso,sho,svo,
radianes,inicio,fin,id,sh,sv,iniok,finok,DistPost,DistAnte,sw) AS (
68 SELECT p.PuntoN
69 , (ROW_NUMBER() OVER(PARTITION BY p.PuntoN ORDER BY p.PuntoN, d.DistanciaOrigen))
70 , p.x1 , p.y1 , p.x2 , p.y2 , ROUND( p.radianeso, 6)
71 , ROUND( p.radianes, 6)
72 , p.signoxo
73 , p.signoyo
74 , ROUND( p.inicio, 6)
75 , ROUND( p.fin, 6)
76 , d.ID
77 , p.signox
78 , p.signoy
79 , LAG( d.Distanciaorigen, 1, p.inicio) OVER (PARTITION BY p.PuntoN ORDER BY p.PuntoN)
80 , ISNULL( d.DistanciaOrigen, fin)
81 , LEAD( d.Distanciaorigen, 1) OVER (PARTITION BY p.PuntoN ORDER BY p.PuntoN)
82 , LAG( d.Distanciaorigen, 1) OVER (PARTITION BY p.PuntoN ORDER BY p.PuntoN)
83 , 1
84 FROM puntosruta p --Normalizacion..Vialidad_RNPuntos p
85 LEFT JOIN distancias d ON
86 p.inicio < d.DistanciaOrigen AND d.DistanciaOrigen <= p.fin
87 --WHERE p.idruta = @idruta --- p.idruta = 2 para el descendente
88 UNION ALL
89 SELECT PuntoN,idvial+1,x1,y1,X2,Y2,radianeso,sho,svo,
radianes,inicio,fin,id,sh,sv,finok,fin,DistPost,DistAnte,0
90 FROM tramos
91 WHERE sw=1
92 AND DistPost IS NULL
93 AND finok IS NOT NULL
94 AND id IS NOT NULL
95 )
96 ,
97 Filas
(idFila,PuntoN,idvial,x1,y1,X2,Y2,radianes,sh,sv,inicio,fin,id,iniok,finok,DistPost,DistAnte,sw,SumDespX
,SumDespY) AS (
98 SELECT idFila=ROW_NUMBER() OVER(ORDER BY PuntoN,idvial)
99 , PuntoN,idvial,x1,y1,X2,Y2,radianes,sh,sv,inicio,fin,id,iniok,finok,DistPost,DistAnte,sw
100 , SUM(ROUND( (finok-iniok)*COS(radianeso)*sho, 6)) OVER (PARTITION BY PuntoN ORDER BY PuntoN,
idvial)
101 , SUM(ROUND( (finok-iniok)*SIN(radianeso)*svo, 6)) OVER (PARTITION BY PuntoN ORDER BY PuntoN,
idvial)
102 FROM tramos
103 )
104 ,
105 ruta (idfila,PuntoN,idvial,iniok,finok,x1,y1,x2,y2,radianes,signox,signoy
106 ,xx1,yy1,xx2,yy2
107 ) AS (
108 SELECT idfila, PuntoN, idvial
109 , iniok, finok
110 , x1 + LAG( SumDespX,1,0) OVER(PARTITION BY PuntoN ORDER BY PuntoN, idvial) --AS nuevox1
111 , y1 + LAG( SumDespY,1,0) OVER(PARTITION BY PuntoN ORDER BY PuntoN, idvial) --AS nuevoy1
112 , CASE WHEN LEAD( x1,1) OVER(PARTITION BY PuntoN ORDER BY PuntoN, idvial) IS NULL THEN x2 ELSE x1 +
SumDespX END --AS nuevox2
113 , CASE WHEN LEAD( y1,1) OVER(PARTITION BY PuntoN ORDER BY PuntoN, idvial) IS NULL THEN y2 ELSE y1 +
SumDespY END --AS nuevoy2
114 , radianes
115 , sh
116 , sv
117 , x1+0.001,y1,x2+0.001,y2
118 FROM Filas a
119 )
120 ,
121 constructor AS (
F:\DCIM\AABE\20171109-CTE.sql 3
122 SELECT
123 r.idfila
124 , d.id
125 , ROW_NUMBER() OVER(PARTITION BY d.id ORDER BY d.id, r.idfila) AS idSubtramo
126 , r.x1, r.y1, r.x2, r.y2
127 , LAG(r.x1,1) OVER(PARTITION BY d.id ORDER BY r.idfila, d.id, r.idvial) As x1Ant
128 , LAG(r.y1,1) OVER(PARTITION BY d.id ORDER BY r.idfila, d.id, r.idvial) As y1Ant
129 , LAG(r.x2,1) OVER(PARTITION BY d.id ORDER BY r.idfila, d.id, r.idvial) As x2Ant
130 , LAG(r.y2,1) OVER(PARTITION BY d.id ORDER BY r.idfila, d.id, r.idvial) As y2Ant
131
132 , radianes
133 , signox
134 , signoy
135
136 , ISNULL( ROUND( t.AlambradoIzqDistancia * 0.000011,6),0.00) AS alhIzd
137 , ISNULL( ROUND( t.CalzadaDescendenteBanquinaExteriorAncho * 0.000011,6), 0.00) AS dbqext
138 , ISNULL( ROUND( t.CalzadaDescendentePavimentoAncho * 0.000011,6),0.00) AS dpavi
139 , ISNULL( ROUND( t.CalzadaDescendenteBanquinaInteriorAncho * 0.000011,6), 0.00) AS dbqint
140 , ISNULL( ROUND( t.CanteroCentralAncho * 0.000011,6), 0.00) AS centro
141 , ISNULL( ROUND( t.CalzadaAscendenteBanquinaInteriorAncho * 0.000011,6),0.00) AS abqint
142 , ISNULL( ROUND( t.CalzadaAscendentePavimentoAncho * 0.000011,6), 0.00) AS apavi
143 , ISNULL( ROUND( t.CalzadaAscendenteBanquinaExteriorAncho * 0.000011,6), 0.00) AS abqext
144 , ISNULL( ROUND( t.AlambradoDerDistancia * 0.000011,6), 0.00) AS alhder
145 , r.xx1, r.yy1, r.xx2, r.yy2
146 , r.x1 + ROUND( signox * COS( radianes) * (0.3), 6) AS x3
147 , r.y1 + ROUND( signoy * SIN( radianes) * (0.3), 6) AS y3
148 , r.x2 + ROUND( signox * COS( radianes) * (0.3), 6) AS x4
149 , r.y2 + ROUND( signoy * SIN( radianes) * (0.3), 6) AS y4
150 , r.x2 - ROUND( -signox * COS( radianes) * (0.3), 6) AS x5
151 , r.y2 - ROUND( -signoy * SIN( radianes) * (0.3), 6) AS y5
152 , r.x1 - ROUND( -signox * COS( radianes) * (0.3), 6) AS x6
153 , r.y1 - ROUND( -signoy * SIN( radianes) * (0.3), 6) AS y6
154 FROM distancias d
155 INNER JOIN Normalizacion..Vialidad_RNTramos t ON
156 d.id = t.ID
157 INNER JOIN ruta r ON
158 ROUND( r.iniok, 6) >= ROUND( d.DistanciaOrigen, 6) AND
159 ROUND( d.DistanciaOrigenFin, 6) >= ROUND( r.finok, 6)
160 )
161 SELECT top 1
162 idfila, x1, y1, x2, y2
163 , x3, y3, x4, y4, x5, y5, x6, y6
164 , geometry::STPolyFromText( 'POLYGON (('+ STR( x3,12,6) +' '+ STR( y3,12,6)
165 +', '+ STR( x4,12,6) +' '+ STR( y4,12,6)
166 +', '+ STR( x5,12,6) +' '+ STR( y5,12,6)
167 +', '+ STR( x6,12,6) +' '+ STR( y6,12,6)
168 +', '+ STR( x3,12,6) +' '+ STR( y3,12,6)
169 +'))', 4326)--.MakeValid()--.STBoundary().STUnion( linestring)
170 , geometry::STGeomFromText( 'LINESTRING ('+ STR( x1,12,6) +' '+ STR( y1,12,6)
171 +', '+ STR( x2,12,6) +' '+ STR( y2,12,6)
172 +')', 4326)
173 FROM constructor
174 UNION ALL
175 SELECT idfila, xx1, yy1, xx2, yy2
176 , NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
177 , NULL
178 , geometry::STGeomFromText( 'LINESTRING ('+ STR( xx1,12,6) +' '+ STR( yy1,12,6)
179 +', '+ STR( xx2,12,6) +' '+ STR( yy2,12,6)
180 +')', 4326)
181 FROM constructor
182
183 ORDER BY idfila --d.DistanciaOrigen
184 OPTION (MAXRECURSION 0)
185

Você também pode gostar