private static void RenderGeometry(Graphics graphics, IViewport viewport, IGeometry feature, VectorStyle style) { if (feature is Point) { GdiGeometryRenderer.DrawPoint(graphics, (Point)feature, style, viewport); } else if (feature is MultiPoint) { GdiGeometryRenderer.DrawMultiPoint(graphics, (MultiPoint)feature, style, viewport); } else if (feature is LineString) { GdiGeometryRenderer.DrawLineString(graphics, (LineString)feature, style.Line.Convert(), viewport); } else if (feature is MultiLineString) { GdiGeometryRenderer.DrawMultiLineString(graphics, (MultiLineString)feature, style.Line.Convert(), viewport); } else if (feature is Polygon) { GdiGeometryRenderer.DrawPolygon(graphics, (Polygon)feature, style.Fill.Convert(), style.Outline.Convert(), viewport); } else if (feature is MultiPolygon) { GdiGeometryRenderer.DrawMultiPolygon(graphics, (MultiPolygon)feature, style.Fill.Convert(), style.Outline.Convert(), viewport); } else if (feature is IRaster) { GdiGeometryRenderer.DrawRaster(graphics, feature as IRaster, viewport); } }
private static void RenderLayer(Graphics graphics, IViewport viewport, ILayer layer, AbortRenderDelegate abortRender) { int counter = 0; const int step = 100; graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; foreach (var layerStyle in layer.Styles) { var style = layerStyle; var features = layer.GetFeaturesInView(viewport.Extent, viewport.Resolution); //Linestring outlines is drawn by drawing the layer once with a thicker line //before drawing the "inline" on top. var enumerable = features as IList <IFeature> ?? features.ToList(); foreach (var feature in enumerable) { if ((counter++ % step == 0) && abortRender != null && abortRender()) { return; } if (layerStyle is IThemeStyle) { style = (layerStyle as IThemeStyle).GetStyle(feature); } if ((style is VectorStyle) && ((style as VectorStyle).Outline != null)) { GdiGeometryRenderer.RenderGeometryOutline(graphics, viewport, feature.Geometry, style as VectorStyle); } } foreach (var feature in enumerable) { if ((counter++ % step == 0) && abortRender != null && abortRender()) { return; } if (layerStyle is IThemeStyle) { style = (layerStyle as IThemeStyle).GetStyle(feature); } RenderGeometry(graphics, viewport, feature.Geometry, style as VectorStyle); } } }
public static void Render(Graphics g, IViewport viewport, LabelLayer labelLayer) { foreach (var layerStyle in labelLayer.Styles) { if (layerStyle.Enabled && labelLayer.MaxVisible >= viewport.Resolution && labelLayer.MinVisible < viewport.Resolution) { if (labelLayer.DataSource == null) { throw (new ApplicationException("DataSource property not set")); } #if !PocketPC g.SmoothingMode = SmoothingMode.AntiAlias; #endif //!!!BoundingBox envelope = map.Envelope; //View to render //!!!if (CoordinateTransformation != null) //!!! envelope = GeometryTransform.TransformBox(envelope, CoordinateTransformation.MathTransform.Inverse()); labelLayer.DataSource.Open(); var features = labelLayer.DataSource.GetFeaturesInView(viewport.Extent, viewport.Resolution); labelLayer.DataSource.Close(); //Initialize label collection var labels = new List <Label>(); var style = layerStyle as LabelStyle; //List<System.Drawing.Rectangle> LabelBoxes; //Used for collision detection //Render labels foreach (IFeature feature in features) { //!!!if (CoordinateTransformation != null) //!!! features[i].Geometry = GeometryTransform.TransformGeometry( //!!! features[i].Geometry, CoordinateTransformation. MathTransform); if (layerStyle is IThemeStyle) { style = (layerStyle as ThemeStyle).GetStyle(feature) as LabelStyle; } float rotation = 0; if (!String.IsNullOrEmpty(labelLayer.RotationColumn)) { rotation = float.Parse(feature[labelLayer.RotationColumn].ToString(), NumberStyles.Any, CultureInfo.InvariantCulture); } int priority = labelLayer.Priority; if (labelLayer.PriorityDelegate != null) { priority = labelLayer.PriorityDelegate(feature); } else if (!String.IsNullOrEmpty(labelLayer.PriorityColumn)) { priority = int.Parse(feature[labelLayer.PriorityColumn].ToString(), NumberStyles.Any, CultureInfo.InvariantCulture); } string text; if (labelLayer.LabelStringDelegate != null) { text = labelLayer.LabelStringDelegate(feature); } else { text = feature[labelLayer.LabelColumn].ToString(); } if (text != null && text != String.Empty) { if (feature.Geometry is GeometryCollection) { if (labelLayer.MultipartGeometryBehaviour == LabelLayer.MultipartGeometryBehaviourEnum.All) { foreach (Geometry geom in (feature.Geometry as GeometryCollection)) { Label lbl = CreateLabel(geom, text, rotation, priority, style, viewport, g, labelLayer); if (lbl != null) { labels.Add(lbl); } } } else if (labelLayer.MultipartGeometryBehaviour == LabelLayer.MultipartGeometryBehaviourEnum.CommonCenter) { Label lbl = CreateLabel(feature.Geometry, text, rotation, priority, style, viewport, g, labelLayer); if (lbl != null) { labels.Add(lbl); } } else if (labelLayer.MultipartGeometryBehaviour == LabelLayer.MultipartGeometryBehaviourEnum.First) { //!!! //if ((feature.Geometry as GeometryCollection).Collection.Count > 0) //{ // Label lbl = CreateLabel((feature.Geometry as GeometryCollection).Collection[0], text, // rotation, style, map, g, labelTheme); // if (lbl != null) // labels.Add(lbl); //} } else if (labelLayer.MultipartGeometryBehaviour == LabelLayer.MultipartGeometryBehaviourEnum.Largest) { var coll = (feature.Geometry as GeometryCollection); if (coll.NumGeometries > 0) { double largestVal = 0; int idxOfLargest = 0; for (int j = 0; j < coll.NumGeometries; j++) { Geometry geom = coll.Geometry(j); if (geom is LineString && ((LineString)geom).Length > largestVal) { largestVal = ((LineString)geom).Length; idxOfLargest = j; } if (geom is MultiLineString && ((MultiLineString)geom).Length > largestVal) { largestVal = ((LineString)geom).Length; idxOfLargest = j; } if (geom is Polygon && ((Polygon)geom).Area > largestVal) { largestVal = ((Polygon)geom).Area; idxOfLargest = j; } if (geom is MultiPolygon && ((MultiPolygon)geom).Area > largestVal) { largestVal = ((MultiPolygon)geom).Area; idxOfLargest = j; } } Label lbl = CreateLabel(coll.Geometry(idxOfLargest), text, rotation, priority, style, viewport, g, labelLayer); if (lbl != null) { labels.Add(lbl); } } } } else { Label lbl = CreateLabel(feature.Geometry, text, rotation, priority, style, viewport, g, labelLayer); if (lbl != null) { labels.Add(lbl); } } } } if (labels.Count > 0) //We have labels to render... { if ((layerStyle as LabelStyle).CollisionDetection && labelLayer.LabelFilter != null) { labelLayer.LabelFilter(labels); } for (int i = 0; i < labels.Count; i++) { if (labels[i].Show) { GdiGeometryRenderer.DrawLabel(g, labels[i].LabelPoint, labels[i].Style.Offset, labels[i].Style.Font, labels[i].Style.ForeColor, labels[i].Style.BackColor, (layerStyle as LabelStyle).Halo, labels[i].Rotation, labels[i].Text, viewport); } } } labels = null; } } }