/// <summary> /// Allows for new behavior during deactivation. /// </summary> protected override void OnDeactivate() { if (_standBy) return; // Don't completely deactivate, but rather go into standby mode // where we draw only the content that we have actually locked in. _standBy = true; // base.OnDeactivate(); if(_coordinateDialog != null)_coordinateDialog.Hide(); if (_coordinates != null && _coordinates.Count > 1) { LineString ls = new LineString(_coordinates); FeatureSet fs = new FeatureSet(FeatureTypes.Line); fs.Features.Add(new Feature(ls)); MapLineLayer gll = new MapLineLayer(fs); //gll.Symbolizer.FillColor = Color.Blue; gll.Symbolizer.ScaleMode = ScaleModes.Symbolic; gll.Symbolizer.Smoothing = true; gll.MapFrame = Map.MapFrame; _tempLayer = gll; Map.MapFrame.DrawingLayers.Add(gll); // Map.MapFrame.Initialize(_tempLayer); Map.MapFrame.Invalidate(); Map.Invalidate(); } }
/// <summary> /// This is the strong typed version of the same process that is specific to geo point layers. /// </summary> /// <param name="result">The new GeoPointLayer to be created</param> /// <returns>Boolean, true if there were any values in the selection</returns> public virtual bool CreateLayerFromSelectedFeatures(out MapLineLayer result) { result = null; if (Selection == null || Selection.Count == 0) return false; FeatureSet fs = Selection.ToFeatureSet(); result = new MapLineLayer(fs); return true; }
/// <summary> /// Creates a new raster with the specified cell size. If the cell size /// is zero, this will default to the shorter of the width or height /// divided by 256. If the cell size produces a raster that is greater /// than 8,000 pixels in either dimension, it will be re-sized to /// create an 8,000 length or width raster. /// </summary> /// <param name="fs">The featureset to convert to a raster</param> /// <param name="cellSize">The double extent of the cell.</param> /// <param name="fieldName">The integer field index of the file.</param> /// <param name="destFilename">The filename of the raster to create</param> /// <param name="driverCode">The optional GDAL driver code to use if using GDAL /// for a format that is not discernable from the file extension. An empty string /// is usually perfectly acceptable here.</param> /// <param name="options">For GDAL rasters, they can be created with optional parameters /// passed in as a string array. In most cases an empty string is perfectly acceptable.</param> /// <param name="progressHandler">An interface for handling the progress messages.</param> /// <returns>Generates a raster from the vectors.</returns> public static IRaster ToRaster(IFeatureSet fs, ref double cellSize, string fieldName, string destFilename, string driverCode, string[] options, IProgressHandler progressHandler) { IEnvelope env = fs.Envelope; if(cellSize == 0) { if(fs.Envelope.Width < fs.Envelope.Height) { cellSize = env.Width/256; } else { cellSize = env.Height/256; } } int w = (int)Math.Ceiling(env.Width/cellSize); if (w > 8000) { w = 8000; cellSize = env.Width/8000; } int h = (int) Math.Ceiling(env.Height/cellSize); if (h > 8000) { cellSize = env.Height/8000; h = 8000; } Bitmap bmp = new Bitmap(w, h); Graphics g = Graphics.FromImage(bmp); g.Clear(Color.Transparent); g.SmoothingMode = SmoothingMode.None; g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel; g.InterpolationMode = InterpolationMode.NearestNeighbor; Hashtable colorTable; MapArgs args = new MapArgs(new Rectangle(0, 0, w, h), env, g); switch (fs.FeatureType) { case FeatureTypes.Polygon: { MapPolygonLayer mpl = new MapPolygonLayer(fs); PolygonScheme ps = new PolygonScheme(); colorTable = ps.GenerateUniqueColors(fs, fieldName); mpl.Symbology = ps; mpl.DrawRegions(args, new List<IEnvelope> {env}); } break; case FeatureTypes.Line: { MapLineLayer mpl = new MapLineLayer(fs); LineScheme ps = new LineScheme(); colorTable = ps.GenerateUniqueColors(fs, fieldName); mpl.Symbology = ps; mpl.DrawRegions(args, new List<IEnvelope> { env }); } break; default: { MapPointLayer mpl = new MapPointLayer(fs); PointScheme ps = new PointScheme(); colorTable = ps.GenerateUniqueColors(fs, fieldName); mpl.Symbology = ps; mpl.DrawRegions(args, new List<IEnvelope> { env }); } break; } Type tp = fieldName == "FID" ? typeof(int) : fs.DataTable.Columns[fieldName].DataType; if (tp == typeof(string)) tp = typeof (double); // We will try to convert to double if it is a string Raster output = new Raster(); MWImageData image = new MWImageData(bmp, env); ProgressMeter pm = new ProgressMeter(progressHandler, "Converting To Raster Cells", h); output.CreateNew(destFilename, driverCode, w, h, 1, tp, options); output.Bounds = new RasterBounds(h, w, env); List<RcIndex> locations = new List<RcIndex>(); List<string> failureList = new List<string>(); for (int row = 0; row < h; row++) { for (int col = 0; col < w; col++) { Color c = image.GetColor(row, col); if (c.A == 0) { output.Value[row, col] = output.NoDataValue; } else { if (colorTable.ContainsKey(c) == false) { if (c.A < 125) { output.Value[row, col] = output.NoDataValue; continue; } // Use a color matching distance to pick the closest member object val = GetCellValue(w, h, row, col, image, c, colorTable, locations); output.Value[row, col] = GetDouble(val, failureList); } else { output.Value[row, col] = GetDouble(colorTable[c], failureList); } } } pm.CurrentValue = row; } const int maxIterations = 5; int iteration = 0; while(locations.Count > 0) { List<RcIndex> newLocations = new List<RcIndex>(); foreach (RcIndex location in locations) { object val = GetCellValue(w, h, location.Row, location.Column, image, image.GetColor(location.Row, location.Column), colorTable, newLocations); output.Value[location.Row, location.Column] = GetDouble(val, failureList); } locations = newLocations; iteration++; if(iteration > maxIterations) break; } pm.Reset(); return output; }
/// <summary> /// This overload automatically constructs a new MapLayer from the specified /// feature layer with the default drawing characteristics and returns a valid /// IMapLayer which can be further cast into a PointLayer, MapLineLayer or /// a PolygonLayer, depending on the data that is passed in. /// </summary> /// <param name="featureSet">Any valid IFeatureSet that does not yet have drawing characteristics</param> /// <returns>A newly created valid implementation of FeatureLayer which at least gives a few more common /// drawing related methods and can also be cast into the appropriate Point, Line or Polygon layer.</returns> public virtual IMapFeatureLayer Add(IFeatureSet featureSet) { if (featureSet == null) return null; if (featureSet.FeatureType == FeatureTypes.Point || featureSet.FeatureType == FeatureTypes.MultiPoint) { IMapPointLayer pl = new MapPointLayer(featureSet); base.Add(pl); return pl; } if (featureSet.FeatureType == FeatureTypes.Line) { IMapLineLayer ll = new MapLineLayer(featureSet); base.Add(ll); return ll; } if (featureSet.FeatureType == FeatureTypes.Polygon) { IMapPolygonLayer pl = new MapPolygonLayer(featureSet); base.Add(pl); return pl; } return null; //throw new NotImplementedException("Right now only point types are supported."); }