/// <summary> /// Renders the layer /// </summary> /// <param name="g">Graphics object reference</param> /// <param name="map">Map which is rendered</param> public override void Render(Graphics g, Map map) { if (Style.Enabled && Style.MaxVisible >= map.Zoom && Style.MinVisible < map.Zoom) { if (DataSource == null) throw (new ApplicationException("DataSource property not set on layer '" + LayerName + "'")); g.TextRenderingHint = TextRenderingHint; g.SmoothingMode = SmoothingMode; BoundingBox envelope = map.Envelope; //View to render var lineClipping = new CohenSutherlandLineClipping(envelope.Min.X, envelope.Min.Y, envelope.Max.X, envelope.Max.Y); if (CoordinateTransformation != null) { #if !DotSpatialProjections CoordinateTransformation.MathTransform.Invert(); envelope = GeometryTransform.TransformBox(envelope, CoordinateTransformation.MathTransform); CoordinateTransformation.MathTransform.Invert(); #else envelope = GeometryTransform.TransformBox(envelope, CoordinateTransformation.Target, CoordinateTransformation.Source); #endif } FeatureDataSet ds = new FeatureDataSet(); DataSource.Open(); DataSource.ExecuteIntersectionQuery(envelope, ds); DataSource.Close(); if (ds.Tables.Count == 0) { base.Render(g, map); return; } FeatureDataTable features = ds.Tables[0]; //Initialize label collection List<BaseLabel> labels = new List<BaseLabel>(); //List<System.Drawing.Rectangle> LabelBoxes; //Used for collision detection //Render labels for (int i = 0; i < features.Count; i++) { FeatureDataRow feature = features[i]; if (CoordinateTransformation != null) #if !DotSpatialProjections features[i].Geometry = GeometryTransform.TransformGeometry(features[i].Geometry, CoordinateTransformation. MathTransform); #else features[i].Geometry = GeometryTransform.TransformGeometry(features[i].Geometry, CoordinateTransformation.Source, CoordinateTransformation.Target); #endif LabelStyle style; if (Theme != null) //If thematics is enabled, lets override the style style = Theme.GetStyle(feature) as LabelStyle; else style = Style; float rotationStyle = style != null ? style.Rotation : 0f; float rotationColumn = 0f; if (!String.IsNullOrEmpty(RotationColumn)) Single.TryParse(feature[RotationColumn].ToString(), NumberStyles.Any, Map.NumberFormatEnUs, out rotationColumn); float rotation = rotationStyle + rotationColumn; int priority = Priority; if (_getPriorityMethod != null) priority = _getPriorityMethod(feature); else if (!String.IsNullOrEmpty(PriorityColumn)) Int32.TryParse(feature[PriorityColumn].ToString(), NumberStyles.Any, Map.NumberFormatEnUs, out priority); string text; if (_getLabelMethod != null) text = _getLabelMethod(feature); else text = feature[LabelColumn].ToString(); if (!String.IsNullOrEmpty(text)) { // for lineal geometries, try clipping to ensure proper labeling if (feature.Geometry is ILineal) { if (feature.Geometry is LineString) feature.Geometry = lineClipping.ClipLineString(feature.Geometry as LineString); else if (feature.Geometry is MultiLineString) feature.Geometry = lineClipping.ClipLineString(feature.Geometry as MultiLineString); } if (feature.Geometry is GeometryCollection) { if (MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.All) { foreach (Geometry geom in (feature.Geometry as GeometryCollection)) { BaseLabel lbl = CreateLabel(geom, text, rotation, priority, style, map, g); if (lbl != null) labels.Add(lbl); } } else if (MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.CommonCenter) { BaseLabel lbl = CreateLabel(feature.Geometry, text, rotation, priority, style, map, g); if (lbl != null) labels.Add(lbl); } else if (MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.First) { if ((feature.Geometry as GeometryCollection).Collection.Count > 0) { BaseLabel lbl = CreateLabel((feature.Geometry as GeometryCollection).Collection[0], text, rotation, style, map, g); if (lbl != null) labels.Add(lbl); } } else if (MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.Largest) { GeometryCollection 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 = ((MultiLineString)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; } } BaseLabel lbl = CreateLabel(coll.Geometry(idxOfLargest), text, rotation, priority, style, map, g); if (lbl != null) labels.Add(lbl); } } } else { BaseLabel lbl = CreateLabel(feature.Geometry, text, rotation, priority, style, map, g); if (lbl != null) labels.Add(lbl); } } } if (labels.Count > 0) //We have labels to render... { if (Style.CollisionDetection && _labelFilter != null) _labelFilter(labels); for (int i = 0; i < labels.Count; i++) { // Don't show the label if not necessary if (!labels[i].Show) { continue; } if (labels[i] is Label) { var label = labels[i] as Label; VectorRenderer.DrawLabel(g, label.Location, label.Style.Offset, label.Style.Font, label.Style.ForeColor, label.Style.BackColor, Style.Halo, label.Rotation, label.Text, map); } else if (labels[i] is PathLabel) { var plbl = labels[i] as PathLabel; var lblStyle = plbl.Style; g.DrawString(lblStyle.Halo, new SolidBrush(lblStyle.ForeColor), plbl.Text, lblStyle.Font.FontFamily, (int) lblStyle.Font.Style, lblStyle.Font.Size, lblStyle.GetStringFormat(), lblStyle.IgnoreLength, plbl.Location); } } } } base.Render(g, map); }
/// <summary> /// Renders the layer /// </summary> /// <param name="g">Graphics object reference</param> /// <param name="map">Map which is rendered</param> public override void Render(Graphics g, Map map) { if (Style.Enabled && Style.MaxVisible >= map.Zoom && Style.MinVisible < map.Zoom) { if (DataSource == null) throw (new ApplicationException("DataSource property not set on layer '" + LayerName + "'")); g.TextRenderingHint = TextRenderingHint; g.SmoothingMode = SmoothingMode; var envelope = map.Envelope; //View to render var lineClipping = new CohenSutherlandLineClipping(envelope.MinX, envelope.MinY, envelope.MaxX, envelope.MaxY); if (CoordinateTransformation != null) { #if !DotSpatialProjections if (ReverseCoordinateTransformation != null) { envelope = GeometryTransform.TransformBox(envelope, ReverseCoordinateTransformation.MathTransform); } else { CoordinateTransformation.MathTransform.Invert(); envelope = GeometryTransform.TransformBox(envelope, CoordinateTransformation.MathTransform); CoordinateTransformation.MathTransform.Invert(); } #else envelope = GeometryTransform.TransformBox(envelope, CoordinateTransformation.Target, CoordinateTransformation.Source); #endif } var ds = new FeatureCollectionSet(); DataSource.Open(); DataSource.ExecuteIntersectionQuery(envelope, ds); DataSource.Close(); if (ds.Count == 0) { base.Render(g, map); return; } var features = ds[0]; //Initialize label collection List<BaseLabel> labels = new List<BaseLabel>(); //List<System.Drawing.Rectangle> LabelBoxes; //Used for collision detection //Render labels foreach(var feature in features) { var featureGeometry = (IGeometry)feature.Geometry.Clone(); if (CoordinateTransformation != null) #if !DotSpatialProjections featureGeometry = GeometryTransform.TransformGeometry( featureGeometry, CoordinateTransformation.MathTransform, GeometryServiceProvider.Instance.CreateGeometryFactory((int)CoordinateTransformation.TargetCS.AuthorityCode) ); #else featuresGeometry = GeometryTransform.TransformGeometry(features[i].Geometry, CoordinateTransformation.Source, CoordinateTransformation.Target, CoordinateTransformation.TargetFactory); #endif LabelStyle style; if (Theme != null) //If thematics is enabled, lets override the style style = Theme.GetStyle(feature) as LabelStyle; else style = Style; float rotationStyle = style != null ? style.Rotation : 0f; float rotationColumn = 0f; if (!String.IsNullOrEmpty(RotationColumn)) Single.TryParse(feature.Attributes[RotationColumn].ToString(), NumberStyles.Any, Map.NumberFormatEnUs, out rotationColumn); float rotation = rotationStyle + rotationColumn; int priority = Priority; if (_getPriorityMethod != null) priority = _getPriorityMethod(feature); else if (!String.IsNullOrEmpty(PriorityColumn)) Int32.TryParse(feature.Attributes[PriorityColumn].ToString(), NumberStyles.Any, Map.NumberFormatEnUs, out priority); string text; if (_getLabelMethod != null) text = _getLabelMethod(feature); else text = feature.Attributes[LabelColumn].ToString(); if (!String.IsNullOrEmpty(text)) { // for lineal geometries, try clipping to ensure proper labeling if (featureGeometry is ILineal) { if (featureGeometry is ILineString) featureGeometry = lineClipping.ClipLineString(featureGeometry as ILineString); else if (featureGeometry is IMultiLineString) featureGeometry = lineClipping.ClipLineString(featureGeometry as IMultiLineString); } if (featureGeometry is IGeometryCollection) { if (MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.All) { foreach (var geom in (featureGeometry as IGeometryCollection)) { BaseLabel lbl = CreateLabel(feature, geom, text, rotation, priority, style, map, g, _getLocationMethod); if (lbl != null) labels.Add(lbl); } } else if (MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.CommonCenter) { BaseLabel lbl = CreateLabel(feature, featureGeometry, text, rotation, priority, style, map, g, _getLocationMethod); if (lbl != null) labels.Add(lbl); } else if (MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.First) { if ((featureGeometry as IGeometryCollection).NumGeometries > 0) { BaseLabel lbl = CreateLabel(feature, (featureGeometry as IGeometryCollection).GetGeometryN(0), text, rotation, style, map, g); if (lbl != null) labels.Add(lbl); } } else if (MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.Largest) { var coll = (featureGeometry as IGeometryCollection); if (coll.NumGeometries > 0) { var largestVal = 0d; var idxOfLargest = 0; for (var j = 0; j < coll.NumGeometries; j++) { var geom = coll.GetGeometryN(j); if (geom is ILineString && ((ILineString) geom).Length > largestVal) { largestVal = ((ILineString) geom).Length; idxOfLargest = j; } if (geom is IMultiLineString && ((IMultiLineString) geom).Length > largestVal) { largestVal = ((IMultiLineString)geom).Length; idxOfLargest = j; } if (geom is IPolygon && ((IPolygon) geom).Area > largestVal) { largestVal = ((IPolygon) geom).Area; idxOfLargest = j; } if (geom is IMultiPolygon && ((IMultiPolygon) geom).Area > largestVal) { largestVal = ((IMultiPolygon) geom).Area; idxOfLargest = j; } } BaseLabel lbl = CreateLabel(feature, coll.GetGeometryN(idxOfLargest), text, rotation, priority, style, map, g, _getLocationMethod); if (lbl != null) labels.Add(lbl); } } } else { BaseLabel lbl = CreateLabel(feature, featureGeometry, text, rotation, priority, style, map, g, _getLocationMethod); if (lbl != null) labels.Add(lbl); } } } if (labels.Count > 0) //We have labels to render... { if (Style.CollisionDetection && _labelFilter != null) _labelFilter(labels); for (int i = 0; i < labels.Count; i++) { // Don't show the label if not necessary if (!labels[i].Show) { continue; } if (labels[i] is Label) { var label = labels[i] as Label; if (label.Style.IsTextOnPath == false || label.TextOnPathLabel==null) { VectorRenderer.DrawLabel(g, label.Location, label.Style.Offset, label.Style.Font, label.Style.ForeColor, label.Style.BackColor, label.Style.Halo, label.Rotation, label.Text, map, label.Style.HorizontalAlignment, label.LabelPoint); } else { if (label.Style.BackColor != null && label.Style.BackColor != System.Drawing.Brushes.Transparent) { //draw background if (label.TextOnPathLabel.RegionList.Count > 0) { g.FillRectangles(labels[i].Style.BackColor, labels[i].TextOnPathLabel.RegionList.ToArray()); //g.FillPolygon(labels[i].Style.BackColor, labels[i].TextOnPathLabel.PointsText.ToArray()); } } label.TextOnPathLabel.DrawTextOnPath(); } } else if (labels[i] is PathLabel) { var plbl = labels[i] as PathLabel; var lblStyle = plbl.Style; g.DrawString(lblStyle.Halo, new SolidBrush(lblStyle.ForeColor), plbl.Text, lblStyle.Font.FontFamily, (int) lblStyle.Font.Style, lblStyle.Font.Size, lblStyle.GetStringFormat(), lblStyle.IgnoreLength, plbl.Location); } } } } base.Render(g, map); }