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
PlanetMySQL Voting: Vote UP / Vote DOWN