Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DELIMITER $$
- CREATE FUNCTION trueWithin(p POINT, poly POLYGON)
- RETURNS INT(1) DETERMINISTIC
- BEGIN
- DECLARE n INT DEFAULT 0;
- DECLARE nr INT DEFAULT 0;
- DECLARE pX DECIMAL(9,6);
- DECLARE pY DECIMAL(9,6);
- DECLARE ls LINESTRING;
- DECLARE poly1 POINT;
- DECLARE poly1X DECIMAL(9,6);
- DECLARE poly1Y DECIMAL(9,6);
- DECLARE poly2 POINT;
- DECLARE poly2X DECIMAL(9,6);
- DECLARE poly2Y DECIMAL(9,6);
- DECLARE i INT DEFAULT 0;
- DECLARE j INT DEFAULT 1;
- DECLARE result INT(1) DEFAULT 0;
- SET pX = X(p);
- SET pY = Y(p);
- SET ls = ExteriorRing(poly);
- SET poly2 = EndPoint(ls);
- SET poly2X = X(poly2);
- SET poly2Y = Y(poly2);
- SET n = NumPoints(ls);
- WHILE i<n DO
- SET poly1 = PointN(ls, (i+1));
- SET poly1X = X(poly1);
- SET poly1Y = Y(poly1);
- IF ( ( ( (poly1X <= pX) && (pX < poly2X) ) || ( (poly2X <= pX) && (pX < poly1X) ) ) && ( pY > (poly2Y - poly1Y) * (pX - poly1X) / (poly2X - poly1X) + poly1Y ) ) THEN
- SET result = !result;
- END IF;
- SET poly2X = poly1X;
- SET poly2Y = poly1Y;
- SET i = i + 1;
- END WHILE;
- SET nr = NumInteriorRings(poly);
- WHILE j<=nr DO
- SET ls = InteriorRingN(poly, j);
- SET poly2 = EndPoint(ls);
- SET poly2X = X(poly2);
- SET poly2Y = Y(poly2);
- SET n = NumPoints(ls);
- SET i = 0;
- WHILE i<n DO
- SET poly1 = PointN(ls, (i+1));
- SET poly1X = X(poly1);
- SET poly1Y = Y(poly1);
- IF ( ( ((poly1X <= pX) && (pX < poly2X)) || ((poly2X <= pX) && (pX < poly1X)) ) && ( pY > (poly2Y - poly1Y) * (pX - poly1X) / (poly2X - poly1X) + poly1Y ) ) THEN
- SET result = !result;
- END IF;
- SET poly2X = poly1X;
- SET poly2Y = poly1Y;
- SET i = i + 1;
- END WHILE;
- SET j = j + 1;
- END WHILE;
- RETURN result;
- End$$
- DELIMITER ;
- /* usage: */
- SELECT trueWithin(PointFromText('POINT(-94.584799 39.100973)'), (SELECT `shape` FROM `table` WHERE `id` = 'constraint')) AS result;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement