⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 labellayer.cs

📁 Sharp Map 用于制作GIS系统S harp Map 用于制作GIS系统S harp Map 用于制作GIS系统
💻 CS
📖 第 1 页 / 共 2 页
字号:
			
				SharpMap.Data.FeatureDataSet ds = new SharpMap.Data.FeatureDataSet();
				this.DataSource.Open();
				this.DataSource.ExecuteIntersectionQuery(envelope, ds);
				this.DataSource.Close();
				if (ds.Tables.Count == 0)
				{
					base.Render(g,map);
					return;
				}
				SharpMap.Data.FeatureDataTable features = (SharpMap.Data.FeatureDataTable)ds.Tables[0];

				//Initialize label collection
				List<Rendering.Label> labels = new List<SharpMap.Rendering.Label>();
			
				//List<System.Drawing.Rectangle> LabelBoxes; //Used for collision detection
				//Render labels
				for (int i = 0; i < features.Count; i++)
				{
					SharpMap.Data.FeatureDataRow feature = features[i];
					if (this.CoordinateTransformation != null)
							features[i].Geometry = SharpMap.CoordinateSystems.Transformations.GeometryTransform.TransformGeometry(features[i].Geometry, this.CoordinateTransformation.MathTransform);

					SharpMap.Styles.LabelStyle style = null;
					if (this.Theme != null) //If thematics is enabled, lets override the style
						 style = this.Theme.GetStyle(feature) as SharpMap.Styles.LabelStyle;
					else
						style = this.Style;

					float rotation = 0;
					if (this.RotationColumn != null && this.RotationColumn != "")
						float.TryParse(feature[this.RotationColumn].ToString(), System.Globalization.NumberStyles.Any,SharpMap.Map.numberFormat_EnUS, out rotation);

					string text;
					if (_getLabelMethod != null)
						text = _getLabelMethod(feature);
					else
						text = feature[this.LabelColumn].ToString();

					if (text != null && text != String.Empty)
					{
						if (feature.Geometry is SharpMap.Geometries.GeometryCollection)
						{
							if (this.MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.All)
							{
								foreach (SharpMap.Geometries.Geometry geom in (feature.Geometry as Geometries.GeometryCollection))
								{
									SharpMap.Rendering.Label lbl = CreateLabel(geom, text, rotation, style, map, g);
									if (lbl != null)
										labels.Add(lbl);
								}
							}
							else if (this.MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.CommonCenter)
							{
								SharpMap.Rendering.Label lbl = CreateLabel(feature.Geometry, text, rotation, style, map, g);
								if (lbl != null)
									labels.Add(lbl);
							}
							else if (this.MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.First)
							{
								if ((feature.Geometry as Geometries.GeometryCollection).Collection.Count > 0)
								{
									SharpMap.Rendering.Label lbl = CreateLabel((feature.Geometry as Geometries.GeometryCollection).Collection[0], text, rotation, style, map, g);
									if (lbl != null)
										labels.Add(lbl);
								}
							}
							else if (this.MultipartGeometryBehaviour == MultipartGeometryBehaviourEnum.Largest)
							{
								Geometries.GeometryCollection coll = (feature.Geometry as Geometries.GeometryCollection);
								if (coll.NumGeometries > 0)
								{
									double largestVal = 0;
									int idxOfLargest = 0;
									for (int j = 0; j < coll.NumGeometries; j++)
									{
										SharpMap.Geometries.Geometry geom = coll.Geometry(j);
										if (geom is Geometries.LineString && ((Geometries.LineString)geom).Length > largestVal)
										{
											largestVal = ((Geometries.LineString)geom).Length;
											idxOfLargest = j;
										}
										if (geom is Geometries.MultiLineString && ((Geometries.MultiLineString)geom).Length > largestVal)
										{
											largestVal = ((Geometries.LineString)geom).Length;
											idxOfLargest = j;
										}
										if (geom is Geometries.Polygon && ((Geometries.Polygon)geom).Area > largestVal)
										{
											largestVal = ((Geometries.Polygon)geom).Area;
											idxOfLargest = j;
										}
										if (geom is Geometries.MultiPolygon && ((Geometries.MultiPolygon)geom).Area > largestVal)
										{
											largestVal = ((Geometries.MultiPolygon)geom).Area;
											idxOfLargest = j;
										}
									}

									SharpMap.Rendering.Label lbl = CreateLabel(coll.Geometry(idxOfLargest), text, rotation, style, map, g);
									if (lbl != null)
										labels.Add(lbl);
								}
							}
						}
						else
						{
							SharpMap.Rendering.Label lbl = CreateLabel(feature.Geometry, text, rotation, style, map, g);
							if (lbl != null)
								labels.Add(lbl);
						}
					}
				}
				if (labels.Count > 0) //We have labels to render...
				{
					if (this.Style.CollisionDetection && this._LabelFilter!=null)
						this._LabelFilter(labels);
					for (int i = 0; i < labels.Count;i++ )
						SharpMap.Rendering.VectorRenderer.DrawLabel(g, labels[i].LabelPoint, labels[i].Style.Offset, labels[i].Style.Font, labels[i].Style.ForeColor, labels[i].Style.BackColor, Style.Halo, labels[i].Rotation, labels[i].Text, map);
				}
				labels = null;
			}
			base.Render(g, map);
		}
		
		private SharpMap.Rendering.Label CreateLabel(SharpMap.Geometries.Geometry feature,string text, float rotation, SharpMap.Styles.LabelStyle style, Map map, System.Drawing.Graphics g)
		{
			System.Drawing.SizeF size = g.MeasureString(text, style.Font);
			
			System.Drawing.PointF position = map.WorldToImage(feature.GetBoundingBox().GetCentroid());
			position.X = position.X - size.Width * (short)style.HorizontalAlignment * 0.5f;
			position.Y = position.Y - size.Height * (short)style.VerticalAlignment * 0.5f;
			if (position.X-size.Width > map.Size.Width || position.X+size.Width < 0 ||
				position.Y-size.Height > map.Size.Height || position.Y+size.Height < 0)
				return null;
			else
			{
				SharpMap.Rendering.Label lbl;
			
				if (!style.CollisionDetection)
					lbl = new SharpMap.Rendering.Label(text, position, rotation, this.Priority, null, style);
				else
				{
					//Collision detection is enabled so we need to measure the size of the string
					lbl = new SharpMap.Rendering.Label(text, position, rotation, this.Priority,
						new SharpMap.Rendering.LabelBox(position.X - size.Width * 0.5f - style.CollisionBuffer.Width, position.Y + size.Height * 0.5f + style.CollisionBuffer.Height,
						size.Width + 2f * style.CollisionBuffer.Width, size.Height + style.CollisionBuffer.Height * 2f), style);
				}
				if (feature.GetType() == typeof(SharpMap.Geometries.LineString))
				{
					SharpMap.Geometries.LineString line = feature as SharpMap.Geometries.LineString;
					if (line.Length / map.PixelSize > size.Width) //Only label feature if it is long enough
						CalculateLabelOnLinestring(line, ref lbl, map);
					else
						return null;
				}
			
				return lbl;
			}
		}

		private void CalculateLabelOnLinestring(SharpMap.Geometries.LineString line, ref SharpMap.Rendering.Label label, Map map)
		{
			double dx, dy;
			double tmpx, tmpy;
			double angle = 0.0;

			// first find the middle segment of the line
			int midPoint = (line.Vertices.Count - 1) / 2;
			if (line.Vertices.Count > 2)
			{
				dx = line.Vertices[midPoint + 1].X - line.Vertices[midPoint].X;
				dy = line.Vertices[midPoint + 1].Y - line.Vertices[midPoint].Y;
			}
			else
			{
				midPoint = 0;
				dx = line.Vertices[1].X - line.Vertices[0].X;
				dy = line.Vertices[1].Y - line.Vertices[0].Y;
			}
			if (dy == 0)
				label.Rotation = 0;
			else if (dx == 0)
				label.Rotation = 90;
			else
			{
				// calculate angle of line					
				angle = -Math.Atan(dy / dx) + Math.PI * 0.5;
				angle *= (180d / Math.PI); // convert radians to degrees
				label.Rotation = (float)angle - 90; // -90 text orientation
			}
			tmpx = line.Vertices[midPoint].X + (dx * 0.5);
			tmpy = line.Vertices[midPoint].Y + (dy * 0.5);
			label.LabelPoint = map.WorldToImage(new SharpMap.Geometries.Point(tmpx, tmpy));
		}
		
		/// <summary>
		/// Gets the boundingbox of the entire layer
		/// </summary>
		public override SharpMap.Geometries.BoundingBox Envelope
		{
			get {
				if (this.DataSource == null)
					throw (new ApplicationException("DataSource property not set on layer '" + this.LayerName + "'"));
				
				bool wasOpen = this.DataSource.IsOpen;
				if (!wasOpen)
					this.DataSource.Open();
				SharpMap.Geometries.BoundingBox box = this.DataSource.GetExtents();
				if (!wasOpen) //Restore state
					this.DataSource.Close();
				return box;
			}
		}

		/// <summary>
		/// Gets or sets the SRID of this VectorLayer's data source
		/// </summary>
		public override int SRID
		{
			get {
				if (this.DataSource == null)
					throw (new ApplicationException("DataSource property not set on layer '" + this.LayerName + "'"));
				return this.DataSource.SRID; }
			set { this.DataSource.SRID = value; }
		}

		/// <summary>
		/// Clones the object
		/// </summary>
		/// <returns></returns>
		public override object Clone()
		{
			throw new NotImplementedException();
		}

		#region IDisposable Members

		/// <summary>
		/// Disposes the object
		/// </summary>
		public void Dispose()
		{
			if (DataSource is IDisposable)
				((IDisposable)DataSource).Dispose();
		}

		#endregion
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -