📄 labellayer.cs
字号:
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 + -