View difference between Paste ID: vn2teRh1 and
SHOW:
|
|
- or go back to the newest paste.
1 | - | |
1 | + | DELIMITER $$ |
2 | CREATE FUNCTION trueWithin(p POINT, poly POLYGON) | |
3 | RETURNS INT(1) DETERMINISTIC | |
4 | BEGIN | |
5 | DECLARE n INT DEFAULT 0; | |
6 | DECLARE nr INT DEFAULT 0; | |
7 | DECLARE pX DECIMAL(9,6); | |
8 | DECLARE pY DECIMAL(9,6); | |
9 | DECLARE ls LINESTRING; | |
10 | DECLARE poly1 POINT; | |
11 | DECLARE poly1X DECIMAL(9,6); | |
12 | DECLARE poly1Y DECIMAL(9,6); | |
13 | DECLARE poly2 POINT; | |
14 | DECLARE poly2X DECIMAL(9,6); | |
15 | DECLARE poly2Y DECIMAL(9,6); | |
16 | DECLARE i INT DEFAULT 0; | |
17 | DECLARE j INT DEFAULT 1; | |
18 | DECLARE result INT(1) DEFAULT 0; | |
19 | SET pX = X(p); | |
20 | SET pY = Y(p); | |
21 | SET ls = ExteriorRing(poly); | |
22 | SET poly2 = EndPoint(ls); | |
23 | SET poly2X = X(poly2); | |
24 | SET poly2Y = Y(poly2); | |
25 | SET n = NumPoints(ls); | |
26 | WHILE i<n DO | |
27 | SET poly1 = PointN(ls, (i+1)); | |
28 | SET poly1X = X(poly1); | |
29 | SET poly1Y = Y(poly1); | |
30 | IF ( ( ( (poly1X <= pX) && (pX < poly2X) ) || ( (poly2X <= pX) && (pX < poly1X) ) ) && ( pY > (poly2Y - poly1Y) * (pX - poly1X) / (poly2X - poly1X) + poly1Y ) ) THEN | |
31 | SET result = !result; | |
32 | END IF; | |
33 | SET poly2X = poly1X; | |
34 | SET poly2Y = poly1Y; | |
35 | SET i = i + 1; | |
36 | END WHILE; | |
37 | SET nr = NumInteriorRings(poly); | |
38 | WHILE j<=nr DO | |
39 | SET ls = InteriorRingN(poly, j); | |
40 | SET poly2 = EndPoint(ls); | |
41 | SET poly2X = X(poly2); | |
42 | SET poly2Y = Y(poly2); | |
43 | SET n = NumPoints(ls); | |
44 | SET i = 0; | |
45 | WHILE i<n DO | |
46 | SET poly1 = PointN(ls, (i+1)); | |
47 | SET poly1X = X(poly1); | |
48 | SET poly1Y = Y(poly1); | |
49 | IF ( ( ((poly1X <= pX) && (pX < poly2X)) || ((poly2X <= pX) && (pX < poly1X)) ) && ( pY > (poly2Y - poly1Y) * (pX - poly1X) / (poly2X - poly1X) + poly1Y ) ) THEN | |
50 | SET result = !result; | |
51 | END IF; | |
52 | SET poly2X = poly1X; | |
53 | SET poly2Y = poly1Y; | |
54 | SET i = i + 1; | |
55 | END WHILE; | |
56 | SET j = j + 1; | |
57 | END WHILE; | |
58 | RETURN result; | |
59 | End$$ | |
60 | DELIMITER ; | |
61 | ||
62 | /* usage: */ | |
63 | SELECT trueWithin(PointFromText('POINT(-94.584799 39.100973)'), (SELECT `shape` FROM `table` WHERE `id` = 'constraint')) AS result; |