Quantcast
Viewing all articles
Browse latest Browse all 18770

MidPoint of a LineString

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

Viewing all articles
Browse latest Browse all 18770

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>