public List <GeoPoint> GetLineGeometryElevation(IEnumerable <GeoPoint> lineGeoPoints, DEMDataSet dataSet, InterpolationMode interpolationMode = InterpolationMode.Bilinear) { if (lineGeoPoints == null) { throw new ArgumentNullException("lineGeoPoints", "Point list is null"); } SqlGeometry geometry = GeometryService.ParseGeoPointAsGeometryLine(lineGeoPoints); return(GetLineGeometryElevation(geometry, dataSet, interpolationMode)); }
public string GetDEMLocalPath(DEMDataSet dataSet) { return(_IGeoTiffService.GetLocalDEMPath(dataSet)); }
public List <GeoPoint> GetLineGeometryElevation(SqlGeometry lineStringGeometry, DEMDataSet dataSet, InterpolationMode interpolationMode = InterpolationMode.Bilinear) { if (lineStringGeometry == null || lineStringGeometry.IsNull) { return(null); } if (lineStringGeometry.STGeometryType().Value != "LineString") { throw new Exception("Geometry must be a linestring"); } if (lineStringGeometry.STSrid.Value != 4326) { throw new Exception("Geometry SRID must be set to 4326 (WGS 84)"); } BoundingBox bbox = lineStringGeometry.GetBoundingBox(); List <FileMetadata> tiles = this.GetCoveringFiles(bbox, dataSet); // Init interpolator IInterpolator interpolator = GetInterpolator(interpolationMode); int numPointsSql = lineStringGeometry.STNumPoints().Value; var sqlStart = lineStringGeometry.STPointN(1); var sqlEnd = lineStringGeometry.STPointN(numPointsSql); GeoPoint start = new GeoPoint(sqlStart.STY.Value, sqlStart.STX.Value); GeoPoint end = new GeoPoint(sqlEnd.STY.Value, sqlEnd.STX.Value); double lengthMeters = start.DistanceTo(end); int demResolution = dataSet.ResolutionMeters; int totalCapacity = 2 * (int)(lengthMeters / demResolution); List <GeoPoint> geoPoints = new List <GeoPoint>(totalCapacity); using (GeoTiffDictionary adjacentGeoTiffs = new GeoTiffDictionary()) { bool isFirstSegment = true; // used to return first point only for first segments, for all other segments last point will be returned foreach (SqlGeometry segment in lineStringGeometry.Segments()) { List <FileMetadata> segTiles = this.GetCoveringFiles(segment.GetBoundingBox(), dataSet, tiles); // Find all intersection with segment and DEM grid List <GeoPoint> intersections = this.FindSegmentIntersections(segment.STStartPoint().STX.Value , segment.STStartPoint().STY.Value , segment.STEndPoint().STX.Value , segment.STEndPoint().STY.Value , segTiles , isFirstSegment , true); // Get elevation for each point this.GetElevationData(ref intersections, adjacentGeoTiffs, segTiles, interpolator); // Add to output list geoPoints.AddRange(intersections); isFirstSegment = false; } //Debug.WriteLine(adjacentGeoTiffs.Count); } // Ensures all geotifs are properly closed return(geoPoints); }