|
|
@@ -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
|