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