Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DROP FUNCTION IF EXISTS MidPoint;
- DELIMITER //
- CREATE FUNCTION MidPoint(ls LINESTRING)
- RETURNS POINT
- DETERMINISTIC
- BEGIN
- DECLARE len double;
- DECLARE workLength double DEFAULT 0;
- DECLARE workPoint int DEFAULT 1;
- DECLARE point0 POINT;
- DECLARE point1 POINT;
- DECLARE distanceOver double;
- DECLARE segmentLength double;
- IF (NumPoints(ls) = 1) THEN return PointN(ls, 1); END IF;
- -- find half the length of the linestring
- SET len := GLength(ls) / 2;
- -- walk the linestring until we exceed the distance
- WHILE (workLength < len) DO
- SET point0 = PointN(ls, workPoint);
- SET workPoint := workPoint + 1;
- SET point1 = PointN(ls, workPoint);
- SET segmentLength = GLength(LineString(point0, point1));
- SET workLength := workLength + segmentLength;
- END WHILE;
- -- distance to backup
- SET distanceOver = workLength - len;
- -- midpoint is distanceOver back down the last segement
- RETURN POINT(
- X(point1) - distanceOver / segmentLength * (X(point1) - X(point0)),
- Y(point1) - distanceOver / segmentLength * (Y(point1) - Y(point0))
- );
- END//
- DELIMITER ;
Add Comment
Please, Sign In to add comment