public static double GetLength(string lineWKT) { return(GeometryService.ParseWKTAsGeography(lineWKT).STLength().Value); }
/// <summary> /// Finds all intersections between given segment and DEM grid /// </summary> /// <param name="startLon">Segment start longitude</param> /// <param name="startLat">Segment start latitude</param> /// <param name="endLon">Segment end longitude</param> /// <param name="endLat">Segment end latitude</param> /// <param name="segTiles">Metadata files <see cref="GeoTiffService.GetCoveringFiles"/> to see how to get them relative to segment geometry</param> /// <param name="returnStartPoint">If true, the segment starting point will be returned. Useful when processing a line segment by segment.</param> /// <param name="returnEndPoind">If true, the segment end point will be returned. Useful when processing a line segment by segment.</param> /// <returns></returns> public List <GeoPoint> FindSegmentIntersections(double startLon, double startLat, double endLon, double endLat, List <FileMetadata> segTiles, bool returnStartPoint, bool returnEndPoind) { List <GeoPoint> segmentPointsWithDEMPoints; // Find intersections with north/south lines, // starting form segment western point to easternmost point GeoPoint westernSegPoint = startLon < endLon ? new GeoPoint(startLat, startLon) : new GeoPoint(endLat, endLon); GeoPoint easternSegPoint = startLon > endLon ? new GeoPoint(startLat, startLon) : new GeoPoint(endLat, endLon); GeoSegment inputSegment = new GeoSegment(westernSegPoint, easternSegPoint); if (segTiles.Any()) { int estimatedCapacity = (segTiles.Select(t => t.OriginLongitude).Distinct().Count() // num horizontal tiles * width * segTiles.First().Width) + (segTiles.Select(t => t.OriginLatitude).Distinct().Count() // num vertical tiles * height * segTiles.First().Height); segmentPointsWithDEMPoints = new List <GeoPoint>(estimatedCapacity); bool yAxisDown = segTiles.First().pixelSizeY < 0; if (yAxisDown == false) { throw new NotImplementedException("DEM with y axis upwards not supported."); } foreach (GeoSegment demSegment in this.GetDEMNorthSouthLines(segTiles, westernSegPoint, easternSegPoint)) { GeoPoint intersectionPoint = null; if (GeometryService.LineLineIntersection(out intersectionPoint, inputSegment, demSegment)) { segmentPointsWithDEMPoints.Add(intersectionPoint); } } // Find intersections with west/east lines, // starting form segment northernmost point to southernmost point GeoPoint northernSegPoint = startLat > endLat ? new GeoPoint(startLat, startLon) : new GeoPoint(endLat, endLon); GeoPoint southernSegPoint = startLat < endLat ? new GeoPoint(startLat, startLon) : new GeoPoint(endLat, endLon); inputSegment = new GeoSegment(northernSegPoint, southernSegPoint); foreach (GeoSegment demSegment in this.GetDEMWestEastLines(segTiles, northernSegPoint, southernSegPoint)) { GeoPoint intersectionPoint = null; if (GeometryService.LineLineIntersection(out intersectionPoint, inputSegment, demSegment)) { segmentPointsWithDEMPoints.Add(intersectionPoint); } } } else { // No DEM coverage segmentPointsWithDEMPoints = new List <GeoPoint>(2); } // add start and/or end point if (returnStartPoint) { segmentPointsWithDEMPoints.Add(inputSegment.Start); } if (returnEndPoind) { segmentPointsWithDEMPoints.Add(inputSegment.End); } // sort points in segment order // segmentPointsWithDEMPoints.Sort(new DistanceFromPointComparer(new GeoPoint(startLat, startLon))); return(segmentPointsWithDEMPoints); }