biale_plamy.sql 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. DROP FUNCTION `test_find_shortest_way`;
  2. 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
  3. DECLARE A, B, P POINT;
  4. DECLARE I, N INT;
  5. SET P = (SELECT `the_geom` FROM `Rozdzielcza_test_bzyk_punkty_adresowe` WHERE `ID` = pID);
  6. 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);
  7. IF @the_geom IS NULL THEN
  8. 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);
  9. END IF;
  10. SET N = coalesce(numpoints(@the_geom), 0);
  11. IF N < 2 THEN
  12. RETURN NULL;
  13. END IF;
  14. IF N = 2 THEN
  15. SET @line = @the_geom;
  16. ELSE
  17. SET @distance = NULL;
  18. SET I = 1;
  19. WHILE (I < N) DO
  20. SET A = pointn(@the_geom, I);
  21. SET B = pointn(@the_geom, I+1);
  22. SET @line_cur = LineStringFromText(concat('LineString(',X(A),' ',Y(A),',',X(B),' ',Y(B),')'));
  23. SET @distance_cur = st_distance(P, @line_cur);
  24. IF @distance is NULL or @distance_cur < @distance THEN
  25. SET @distance = @distance_cur;
  26. SET @line = @line_cur;
  27. END IF;
  28. SET I = I + 1;
  29. END WHILE;
  30. END IF;
  31. SET A = pointn(@line, 1);
  32. SET B = pointn(@line, 2);
  33. SET @A1 = (Y(A)-(Y(B)))/(X(A)-X(B));
  34. SET @B1 = Y(A)-@A1*X(A);
  35. SET @A2 = -1/@A1;
  36. SET @B2 = Y(P)-@A2*X(P);
  37. SET @X = (@B2-@B1)/(@A1-@A2);
  38. SET @Y = @A1*@X+@B1;
  39. SET @XPOINT = geomfromtext(concat('POINT(',@X,' ',@Y,')'));
  40. SET @distance = st_distance(@XPOINT, @line);
  41. IF @distance = st_distance(@XPOINT, A) THEN
  42. SET @result = A;
  43. ELSEIF @distance = st_distance(@XPOINT, B) THEN
  44. SET @result = B;
  45. ELSE
  46. SET @result = @XPOINT;
  47. END IF;
  48. RETURN @result;
  49. END