Prechádzať zdrojové kódy

DEV SQL do białych plam

Mariusz Muszyński 9 rokov pred
rodič
commit
057aef05d4
1 zmenil súbory, kde vykonal 57 pridanie a 0 odobranie
  1. 57 0
      SE/sql-dev/biale_plamy.sql

+ 57 - 0
SE/sql-dev/biale_plamy.sql

@@ -0,0 +1,57 @@
+DROP FUNCTION `test_find_shortest_way`;
+CREATE DEFINER=`root`@`94.158.130.34` FUNCTION `test_find_shortest_way`(`pID` INT) RETURNS POINT NOT DETERMINISTIC READS SQL DATA SQL SECURITY DEFINER BEGIN
+
+    DECLARE A, B, P POINT;
+    DECLARE I, N INT;
+    
+    SET P = (SELECT `the_geom` FROM `Rozdzielcza_test_bzyk_punkty_adresowe` WHERE `ID` = pID);
+
+    SET @the_geom = (SELECT `the_geom` FROM `Rozdzielcza_test_bzyk_drogi` WHERE st_distance(`the_geom`, P) < 0.01 ORDER BY st_distance(`the_geom`, P) LIMIT 1);
+    IF @the_geom IS NULL THEN
+        SET @the_geom = (SELECT `the_geom` FROM `Rozdzielcza_test_bzyk_drogi` WHERE st_distance(`the_geom`, P) < 0.1 ORDER BY st_distance(`the_geom`, P) LIMIT 1);
+    END IF;
+
+    SET N = coalesce(numpoints(@the_geom), 0);
+    IF N < 2 THEN
+        RETURN NULL;
+    END IF;
+
+    IF N = 2 THEN
+        SET @line = @the_geom;
+    ELSE
+        SET @distance = NULL;
+        SET I = 1;
+        WHILE (I < N) DO
+            SET A = pointn(@the_geom, I);
+            SET B = pointn(@the_geom, I+1);
+            SET @line_cur = LineStringFromText(concat('LineString(',X(A),' ',Y(A),',',X(B),' ',Y(B),')'));
+            SET @distance_cur = st_distance(P, @line_cur);
+            IF @distance is NULL or @distance_cur < @distance THEN
+                SET @distance = @distance_cur;
+                SET @line = @line_cur;
+            END IF;
+            SET I = I + 1;
+        END WHILE;
+    END IF;
+
+    SET A = pointn(@line, 1);
+    SET B = pointn(@line, 2);
+
+    SET @A1 = (Y(A)-(Y(B)))/(X(A)-X(B));
+    SET @B1 = Y(A)-@A1*X(A);
+    SET @A2 = -1/@A1;
+    SET @B2 = Y(P)-@A2*X(P);
+    SET @X = (@B2-@B1)/(@A1-@A2);
+    SET @Y = @A1*@X+@B1;
+
+    SET @XPOINT = geomfromtext(concat('POINT(',@X,' ',@Y,')'));
+    SET @distance = st_distance(@XPOINT, @line);
+    IF @distance = st_distance(@XPOINT, A) THEN
+        SET @result = A;
+    ELSEIF @distance = st_distance(@XPOINT, B) THEN
+        SET @result = B;
+    ELSE
+        SET @result = @XPOINT;
+    END IF;
+    RETURN @result;
+END