public void Isoplete(IRasterDigitalElevationModel dem, double elevationStep, NewIsohypseCallback callback) { DigitalElevationModelStatistics statistics = dem.CalculateStatistics(); double minElevation = Math.Floor(statistics.MinElevation / elevationStep) * elevationStep; double maxElevation = Math.Floor(statistics.MaxElevation / elevationStep) * elevationStep; //if (visualizer != null) //{ // GeoPosition geoPosMin = dem.GetGeoPosition (0, 0, false); // GeoPosition geoPosMax = dem.GetGeoPosition (dem.LonLength, dem.LatLength, false); // visualizer.Initialize (geoPosMin.Longitude, geoPosMin.Latitude, // geoPosMax.Longitude, geoPosMax.Latitude); //} Array2 <byte> flags = new Array2 <byte> (dem.LonLength - 1, dem.LatLength - 1); Array2 <IsohypseMovement> movements = new Array2 <IsohypseMovement> (dem.LonLength - 1, dem.LatLength - 1); int[,] adjacentCells = new int[, ] { { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 } }; // foreach elevation step for (double isoElev = minElevation; isoElev <= maxElevation; isoElev += elevationStep) { activityLogger.Log(ActivityLogLevel.Normal, String.Format(System.Globalization.CultureInfo.InvariantCulture, "Analyzing elevation {0}", isoElev)); //if (visualizer != null) //{ // GeoPosition geoPosMin = dem.GetGeoPosition (0, 0, false); // GeoPosition geoPosMax = dem.GetGeoPosition (dem.LongLength, dem.LatLength, false); // visualizer.Initialize (geoPosMin.Longitude, geoPosMin.Latitude, // geoPosMax.Longitude, geoPosMax.Latitude); // for (int x = 0; x < dem.LongLength; x++) // { // for (int y = 0; y < dem.LatLength; y++) // { // int elevation = dem.GetElevation (x, y); // GeoPosition geoPos = dem.GetGeoPosition (x, y); // string color = elevation >= isoElev ? "orange" : "yellow"; // visualizer.DrawPoint (color, geoPos.Longitude, geoPos.Latitude); // visualizer.DrawText ("pink", geoPos.Longitude, geoPos.Latitude, elevation.ToString ()); // } // } //} Isohypse isohypse = new Isohypse(isoElev); flags.Initialize(0); movements.Initialize(0); for (int x = 0; x < dem.LonLength - 1; x++) { for (int y = 0; y < dem.LatLength - 1; y++) { byte cellCharacteristic = 0; for (int i = 0; i < adjacentCells.GetLength(0); i++) { double adjacentCellElev = dem.GetElevationForDataPoint(x + adjacentCells[i, 0], y + adjacentCells[i, 1]); if (adjacentCellElev >= isoElev) { cellCharacteristic++; flags.SetValue((byte)(flags.GetValue(x, y) | (byte)(1 << i)), x, y); } } // skip cells which are definitively not along the isohypse if (cellCharacteristic == 0 || cellCharacteristic == 4) { continue; } if (cellCharacteristic == 2) { int maskedFlags = flags.GetValue(x, y) & 0x9; if (maskedFlags == 0 || maskedFlags == 0x9) { movements.SetValue(IsohypseMovement.North | IsohypseMovement.South, x, y); } else { maskedFlags = flags.GetValue(x, y) & 0x3; if (maskedFlags == 0 || maskedFlags == 0x3) { movements.SetValue(IsohypseMovement.West | IsohypseMovement.East, x, y); } else { movements.SetValue( IsohypseMovement.West | IsohypseMovement.East | IsohypseMovement.North | IsohypseMovement.South, x, y); } } } else { int maskedFlags = flags.GetValue(x, y) & 0x3; if (maskedFlags != 0 && maskedFlags != 0x3) { movements.SetValue(movements.GetValue(x, y) | IsohypseMovement.North, x, y); } maskedFlags = flags.GetValue(x, y) & 0x6; if (maskedFlags != 0 && maskedFlags != 0x6) { movements.SetValue(movements.GetValue(x, y) | IsohypseMovement.East, x, y); } maskedFlags = flags.GetValue(x, y) & 0xc; if (maskedFlags != 0 && maskedFlags != 0xc) { movements.SetValue(movements.GetValue(x, y) | IsohypseMovement.South, x, y); } maskedFlags = flags.GetValue(x, y) & 0x9; if (maskedFlags != 0 && maskedFlags != 0x9) { movements.SetValue(movements.GetValue(x, y) | IsohypseMovement.West, x, y); } } //if (visualizer != null) //{ // if (cellCharacteristic > 0 && cellCharacteristic < 4) // { // GeoPosition geoPos = dem.GetGeoPosition (x + 0.5, y + 0.5); // if (movements.GetValue (x, y) // == (IsohypseMovement.West | IsohypseMovement.East | IsohypseMovement.North | IsohypseMovement.South)) // visualizer.DrawText ("blue", geoPos.Longitude, geoPos.Latitude, // "X"); // //visualizer.DrawText ("blue", geoPos.Longitude, geoPos.Latitude, // // cellCharacteristic == 2 ? "K" : "T"); // //List<Point2> points = new List<Point2> (); // //if ((movements[x, y] & IsohypseMovement.North) != 0) // // points.Add (new Point2 (0.5, 0)); // //if ((movements[x, y] & IsohypseMovement.East) != 0) // // points.Add (new Point2 (1, 0.5)); // //if ((movements[x, y] & IsohypseMovement.South) != 0) // // points.Add (new Point2 (0.5, 1)); // //if ((movements[x, y] & IsohypseMovement.West) != 0) // // points.Add (new Point2 (0, 0.5)); // //List<GeoPosition> geoPoints = new List<GeoPosition> (); // //foreach (Point2 point in points) // // geoPoints.Add (dem.GetGeoPosition (x + point.X, y + point.Y)); // //visualizer.DrawLine ("black", geoPoints[0].Longitude, geoPoints[0].Latitude, // // geoPoints[1].Longitude, geoPoints[1].Latitude); // //if (geoPoints.Count > 2) // // visualizer.DrawLine ("black", geoPoints[2].Longitude, geoPoints[2].Latitude, // // geoPoints[3].Longitude, geoPoints[3].Latitude); // } //} } } for (int x = 0; x < dem.LonLength - 1; x++) { for (int y = 0; y < dem.LatLength - 1; y++) { if (movements.GetValue(x, y) != IsohypseMovement.None) { IsohypseMovements isohypseMovements = ExtractIsohypseMovements(dem, isoElev, movements, flags, x, y); Polyline isohypseSegment = ConstructIsohypseSegment(dem, isohypseMovements); isohypseSegment.RemoveDuplicateVertices(); isohypse.AddSegment(isohypseSegment); activityLogger.Log(ActivityLogLevel.Verbose, String.Format(System.Globalization.CultureInfo.InvariantCulture, "Found segment with {0} vertices", isohypseSegment.VerticesCount)); } } } if (isohypse.Segments.Count > 0) { callback(isohypse); } //isoColl.AddIsohypse (isohypse); } }