using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using GeoScene.Data; using GeoScene.Globe; namespace Cyberpipe { public enum EnumMarkLayer { Mark_Altitude = 0, //标高标注 Mark_Diameter = 1, //管径标注 Mark_Depth = 2, //埋深标注 Mark_Location = 3,//坐标标注 Mark_Slope = 4,//坡度标注 Mark_Property = 5,//属性标注 Mark_Custom = 6, //自定义标注 Mark_Distance = 7, //距离标注 Mark_Redline = 8, //红线工具 Mark_Flag = 9 //扯旗标注 } public class MarkInfo { private String desc; private GSOGeoPoint3D point; public string Desc { get { return desc; } set { desc = value; } } public GSOGeoPoint3D Point { get { return point; } set { point = value; } } } public class MarkTools { public static MarkTools markTools; public static MarkTools getInstance() { if(markTools!=null) { return markTools; } markTools = new MarkTools(); return markTools; } public void removeMarkerByMarkerLayer(EnumMarkLayer e,GSOGlobeControl globalControl) { String markerLayerName = ""; switch (e) { case EnumMarkLayer.Mark_Altitude: markerLayerName = "标高标注"; break; case EnumMarkLayer.Mark_Diameter: markerLayerName = "管径标注"; break; case EnumMarkLayer.Mark_Depth: markerLayerName = "埋深标注"; break; case EnumMarkLayer.Mark_Location: markerLayerName = "坐标标注"; break; case EnumMarkLayer.Mark_Slope: markerLayerName = "坡度标注"; break; case EnumMarkLayer.Mark_Property: markerLayerName = "属性标注"; break; case EnumMarkLayer.Mark_Custom: markerLayerName = "自定义标注"; break; case EnumMarkLayer.Mark_Distance: markerLayerName = "距离标注"; break; case EnumMarkLayer.Mark_Redline: markerLayerName = "红线工具"; break; case EnumMarkLayer.Mark_Flag: markerLayerName = "扯旗标注"; break; } if (markerLayerName != "") { GSOLayer markerLayer = globalControl.Globe.Layers.GetLayerByCaption(markerLayerName); markerLayer.RemoveAllFeature(); } } public static void removeAllMarker(GSOGlobeControl globalControl) { GSOLayer altitudeLayer = globalControl.Globe.Layers.GetLayerByCaption("标高标注"); if (altitudeLayer != null) altitudeLayer.RemoveAllFeature(); GSOLayer diameterLayer = globalControl.Globe.Layers.GetLayerByCaption("管径标注"); if (diameterLayer != null) diameterLayer.RemoveAllFeature(); GSOLayer depthLayer = globalControl.Globe.Layers.GetLayerByCaption("埋深标注"); if (depthLayer != null) depthLayer.RemoveAllFeature(); GSOLayer locationLayer = globalControl.Globe.Layers.GetLayerByCaption("坐标标注"); if (locationLayer != null) locationLayer.RemoveAllFeature(); GSOLayer slopeLayer = globalControl.Globe.Layers.GetLayerByCaption("坡度标注"); if (slopeLayer != null) slopeLayer.RemoveAllFeature(); GSOLayer propertyLayer = globalControl.Globe.Layers.GetLayerByCaption("属性标注"); if (propertyLayer != null) propertyLayer.RemoveAllFeature(); GSOLayer customLayer = globalControl.Globe.Layers.GetLayerByCaption("自定义标注"); if (customLayer != null) customLayer.RemoveAllFeature(); GSOLayer disLayer = globalControl.Globe.Layers.GetLayerByCaption("距离标注"); if (disLayer != null) disLayer.RemoveAllFeature(); GSOLayer redLineLayer = globalControl.Globe.Layers.GetLayerByCaption("红线工具"); if(redLineLayer!=null) redLineLayer.RemoveAllFeature(); GSOLayer flagLayer = globalControl.Globe.Layers.GetLayerByCaption("扯旗标注"); if (flagLayer != null) flagLayer.RemoveAllFeature(); } public void showMarker(GSOFeature feature, GSOGlobeControl globalControl, EnumMarkLayer e,String labelTxt) { String markerLayerName = ""; List<MarkInfo> marks = new List<MarkInfo>(); switch (e) { case EnumMarkLayer.Mark_Altitude: markerLayerName = "标高标注"; marks = createAltitudeMarks(feature); break; case EnumMarkLayer.Mark_Diameter: markerLayerName = "管径标注"; marks = createDiameterMarks(feature); break; case EnumMarkLayer.Mark_Depth: markerLayerName = "埋深标注"; marks = createDepthMarks(feature); break; case EnumMarkLayer.Mark_Location: markerLayerName = "坐标标注"; marks = createLocationMarks(feature); break; case EnumMarkLayer.Mark_Slope: markerLayerName = "坡度标注"; marks = createSlopeMarks(feature); break; case EnumMarkLayer.Mark_Property: markerLayerName = "属性标注"; marks = createCustomeMiddleMarks(feature, labelTxt); break; case EnumMarkLayer.Mark_Custom: markerLayerName = "自定义标注"; marks = createCustomeMiddleMarks(feature, labelTxt); break; case EnumMarkLayer.Mark_Distance: markerLayerName = "距离标注"; marks = createDistanceMarks(feature); break; case EnumMarkLayer.Mark_Redline: markerLayerName = "红线工具"; break; case EnumMarkLayer.Mark_Flag: markerLayerName = "扯旗标注"; marks = createCustomeMiddleMarks(feature, labelTxt); break; } showMarker(marks, globalControl.Globe.Layers.GetLayerByCaption(markerLayerName)); } public void showMarker(List<MarkInfo> marks, GSOLayer layer) { layer.Visible = true; //MessageBox.Show(layer.GetAllFeatures().Length + ""); foreach(MarkInfo mark in marks) { addLabel(mark,layer); } } //创建标高MarkInfo private List<MarkInfo> createAltitudeMarks(GSOFeature resFeature) { GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D; GSOGeoPoint3D startPoint = new GSOGeoPoint3D(); startPoint.X = selLine[0][0].X; startPoint.Y = selLine[0][0].Y; startPoint.Z = selLine[0][0].Z; string desc0 = "起点标高:" + resFeature.GetFieldAsString("起始地面高") + "米"; MarkInfo markInfo0 = new MarkInfo(); markInfo0.Desc = desc0; markInfo0.Point = startPoint; GSOGeoPoint3D endPoint = new GSOGeoPoint3D(); endPoint.X = selLine[0][selLine[0].Count - 1].X; endPoint.Y = selLine[0][selLine[0].Count - 1].Y; endPoint.Z = selLine[0][selLine[0].Count - 1].Z; string desc1 = "终点标高:" + resFeature.GetFieldAsString("终止地面高") + "米"; MarkInfo markInfo1 = new MarkInfo(); markInfo1.Desc = desc1; markInfo1.Point = endPoint; List<MarkInfo> marks = new List<MarkInfo>(); marks.Add(markInfo0); marks.Add(markInfo1); return marks; } //创建管径MarkInfo private List<MarkInfo> createDiameterMarks(GSOFeature resFeature) { GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D; GSOGeoPoint3D centerPoint = new GSOGeoPoint3D(); GSOPoint3d point3d = selLine.GeoCenterPoint; centerPoint.X = point3d.X; centerPoint.Y = point3d.Y; centerPoint.Z = point3d.Z; String desc0 = "管径:" + resFeature.GetFieldAsFloat("管径") + "毫米"; MarkInfo markInfo0 = new MarkInfo(); markInfo0.Desc = desc0; markInfo0.Point = centerPoint; List<MarkInfo> marks = new List<MarkInfo>(); marks.Add(markInfo0); return marks; } //创建埋深MarkInfo private List<MarkInfo> createDepthMarks(GSOFeature resFeature) { GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D; GSOGeoPoint3D startPoint = new GSOGeoPoint3D(); startPoint.X = selLine[0][0].X; startPoint.Y = selLine[0][0].Y; startPoint.Z = selLine[0][0].Z; String desc0 = "起点埋深:" + resFeature.GetFieldAsString("起始埋深") + "米"; MarkInfo markInfo0 = new MarkInfo(); markInfo0.Desc = desc0; markInfo0.Point = startPoint; GSOGeoPoint3D endPoint = new GSOGeoPoint3D(); endPoint.X = selLine[0][selLine[0].Count - 1].X; endPoint.Y = selLine[0][selLine[0].Count - 1].Y; endPoint.Z = selLine[0][selLine[0].Count - 1].Z; String desc1 = "终点埋深:" + resFeature.GetFieldAsString("终止埋深") + "米"; MarkInfo markInfo1 = new MarkInfo(); markInfo1.Desc = desc1; markInfo1.Point = endPoint; List<MarkInfo> marks = new List<MarkInfo>(); marks.Add(markInfo0); marks.Add(markInfo1); return marks; } //创建坐标MarkInfo private List<MarkInfo> createLocationMarks(GSOFeature resFeature) { GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D; GSOGeoPoint3D startPoint = new GSOGeoPoint3D(); startPoint.X = selLine[0][0].X; startPoint.Y = selLine[0][0].Y; startPoint.Z = selLine[0][0].Z; string desc0 = "起点坐标:(" + selLine[0][0].X.ToString("0.00") + "," + selLine[0][0].Y.ToString("0.00") + "," + selLine[0][0].Z.ToString("0.00") + ")"; MarkInfo markInfo0 = new MarkInfo(); markInfo0.Desc = desc0; markInfo0.Point = startPoint; GSOGeoPoint3D endPoint = new GSOGeoPoint3D(); endPoint.X = selLine[0][selLine[0].Count - 1].X; endPoint.Y = selLine[0][selLine[0].Count - 1].Y; endPoint.Z = selLine[0][selLine[0].Count - 1].Z; string desc1 = "终点坐标:(" + selLine[0][selLine[0].Count - 1].X.ToString("0.00") + "," + selLine[0][selLine[0].Count - 1].Y.ToString("0.00") + "," + selLine[0][selLine[0].Count - 1].Z.ToString("0.00") + ")"; MarkInfo markInfo1 = new MarkInfo(); markInfo1.Desc = desc1; markInfo1.Point = endPoint; List<MarkInfo> marks = new List<MarkInfo>(); marks.Add(markInfo0); marks.Add(markInfo1); return marks; } //创建坡度MarkInfo private List<MarkInfo> createSlopeMarks(GSOFeature resFeature) { GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D; GSOGeoPoint3D centerPoint = new GSOGeoPoint3D(); GSOPoint3d point3d = selLine.GeoCenterPoint; centerPoint.X = point3d.X; centerPoint.Y = point3d.Y; centerPoint.Z = point3d.Z; GSOPoint3ds pts = new GSOPoint3ds(); pts.Add(selLine[0][0]); pts.Add(selLine[0][1]); GSOGeoPolyline3D newLine = new GSOGeoPolyline3D(); newLine.AddPart(pts); double newFeatLen = newLine.GetSpaceLength(true, 6378137.0); double z = selLine[0][1].Z - selLine[0][0].Z; double i = Convert.ToDouble(z / newFeatLen); double a = Math.Atan(i) * 180 / Math.PI; string desc0 = "坡度:" + i.ToString("0.0000") + "度 坡角:" + a.ToString("0.0000") + "度"; MarkInfo markInfo0 = new MarkInfo(); markInfo0.Desc = desc0; markInfo0.Point = centerPoint; List<MarkInfo> marks = new List<MarkInfo>(); marks.Add(markInfo0); return marks; } //创建属性、自定义标注 private List<MarkInfo> createCustomeMiddleMarks(GSOFeature resFeature, String text) { GSOGeoPoint3D centerPoint=null; if (resFeature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D; centerPoint = new GSOGeoPoint3D(); GSOPoint3d point3d = selLine.GeoCenterPoint; centerPoint.X = point3d.X; centerPoint.Y = point3d.Y; centerPoint.Z = point3d.Z; } else if (resFeature.Geometry.Type == EnumGeometryType.GeoModel) { GSOGeoModel selLine = resFeature.Geometry as GSOGeoModel; centerPoint = new GSOGeoPoint3D(); GSOPoint3d point3d = selLine.GeoCenterPoint; centerPoint.X = point3d.X; centerPoint.Y = point3d.Y; centerPoint.Z = point3d.Z; } string desc0 = text; MarkInfo markInfo0 = new MarkInfo(); markInfo0.Desc = desc0; markInfo0.Point = centerPoint; List<MarkInfo> marks = new List<MarkInfo>(); marks.Add(markInfo0); return marks; } //创建距离标注 private List<MarkInfo> createDistanceMarks(GSOFeature resFeature) { GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D; GSOGeoPoint3D centerPoint = new GSOGeoPoint3D(); GSOPoint3d point3d = selLine.GeoCenterPoint; centerPoint.X = point3d.X; centerPoint.Y = point3d.Y; centerPoint.Z = point3d.Z; String desc0 = "距离:" + selLine.GetSpaceLength(false, 6378137); MarkInfo markInfo0 = new MarkInfo(); markInfo0.Desc = desc0; markInfo0.Point = centerPoint; List<MarkInfo> marks = new List<MarkInfo>(); marks.Add(markInfo0); return marks; } // private List<GSOFeature> getFeaturesAtSamePos(MarkInfo mark, GSOLayer markLayer) { List<GSOFeature> temps = new List<GSOFeature>(); for (int i = 0; i < markLayer.GetAllFeatures().Length; i++) { GSOFeature gfeat = markLayer.GetAt(i); if (gfeat != null && gfeat.Geometry != null && gfeat.Geometry.Type == EnumGeometryType.GeoPoint3D) { GSOGeoPoint3D pointItem = gfeat.Geometry as GSOGeoPoint3D; if (pointItem.X == mark.Point.X && pointItem.Y == mark.Point.Y && pointItem.Z == mark.Point.Z) { temps.Add(gfeat); } } } return temps; } private void addLabel(MarkInfo mark, GSOLayer markLayer) { List<GSOFeature> oldFeats = getFeaturesAtSamePos(mark,markLayer); foreach (GSOFeature oldFeat in oldFeats) { markLayer.RemoveFeatureByID(oldFeat.ID); } GSOFeature feature = new GSOFeature(); mark.Point.AltitudeMode = EnumAltitudeMode.RelativeToGround; feature.Geometry = mark.Point; feature.Name = Guid.NewGuid().ToString(); GSOLabel newLabel = new GSOLabel(); newLabel.Text = mark.Desc; newLabel.Style = new GSOLabelStyle(); newLabel.Style.Opaque = 0.8; newLabel.Style.OutlineColor = Color.Gray; newLabel.Style.TractionLineEndPos = new GSOPoint2d(0, 60); newLabel.Style.OutlineWidth = 1; newLabel.Style.TracktionLineWidth = 1; newLabel.Style.TractionLineColor = Color.Green; Color color1 = Color.FromArgb(60, 187, 206, 230); Color color2 = Color.FromArgb(150, 187, 200, 250); newLabel.Style.BackBeginColor = color1; newLabel.Style.BackEndColor = color2; feature.Label = newLabel; markLayer.AddFeature(feature); } private MarkTools() { } } }