//初始化符号 private void InitializeSymbols() { //选择点符号 mSelectedPointSymbol = new moSimpleMarkerSymbol(); mSelectedPointSymbol.Color = _SelectionColor; mSelectedPointSymbol.Size = 3; //选择线符号 mSelectedLineSymbol = new moSimpleLineSymbol(); mSelectedLineSymbol.Color = _SelectionColor; mSelectedLineSymbol.Size = 3000 / mMapDrawingReference.dpm; //选择面符号 mSelectedFillSymbol = new moSimpleFillSymbol(); mSelectedFillSymbol.Color = Color.Transparent; mSelectedFillSymbol.Outline.Color = _SelectionColor; mSelectedFillSymbol.Outline.Size = 3000 / mMapDrawingReference.dpm; //闪烁点符号 mFlashPointSymbol = new moSimpleMarkerSymbol(); mFlashPointSymbol.Color = _FlashColor; mFlashPointSymbol.Style = moSimpleMarkerSymbolStyleConstant.SolidCircle; mFlashPointSymbol.Size = 3; //闪烁线符号 mFlashLineSymbol = new moSimpleLineSymbol(); mFlashLineSymbol.Color = _FlashColor; mFlashLineSymbol.Size = 1.5; //闪烁面符号 mFlashFillSymbol = new moSimpleFillSymbol(); mFlashFillSymbol.Color = _FlashColor; mFlashFillSymbol.Outline.Color = Color.Black; mFlashFillSymbol.Outline.Size = 0.35; }
/// <summary> /// 为所有符号生成渐变色 /// </summary> /// <param name="startColor"></param> /// <param name="endColor"></param> public void RampColor(Color startColor, Color endColor) { Int32 sBreakCount = _BreakValues.Count; if (sBreakCount <= 0) { return; } Int32 A1 = startColor.A, R1 = startColor.R, G1 = startColor.G, B1 = startColor.B; Int32 A2 = endColor.A, R2 = endColor.R, G2 = endColor.G, B2 = endColor.B; Int32 A, R, G, B; double H, S, V; Color[] sColors = new Color[sBreakCount]; if (sBreakCount == 1) { sColors[0] = startColor; } else { //将起始和终止颜色转换为HSV double[] sStartHSV = RGBToHSV(startColor.R, startColor.G, startColor.B); double[] sEndHSV = RGBToHSV(endColor.R, endColor.G, endColor.B); sColors[0] = startColor; sColors[sBreakCount - 1] = endColor; for (Int32 i = 1; i <= sBreakCount - 2; i++) { H = sStartHSV[0] + i * (sEndHSV[0] - sStartHSV[0]) / sBreakCount; S = sStartHSV[1] + i * (sEndHSV[1] - sStartHSV[1]) / sBreakCount; V = sStartHSV[2] + i * (sEndHSV[2] - sStartHSV[2]) / sBreakCount; byte[] sRGB = HSVToRGB(H, S, V); A = A1 + i * (A2 - A1) / sBreakCount; R = sRGB[0]; G = sRGB[1]; B = sRGB[2]; sColors[i] = Color.FromArgb(A, R, G, B); } } for (Int32 i = 0; i <= sBreakCount - 1; i++) { if (_Symbols[i] != null) { if (_Symbols[i].SymbolType == moSymbolTypeConstant.SimpleMarkerSymbol) { moSimpleMarkerSymbol sSymbol = (moSimpleMarkerSymbol)_Symbols[i]; sSymbol.Color = sColors[i]; } else if (_Symbols[i].SymbolType == moSymbolTypeConstant.SimpleLineSymbol) { moSimpleLineSymbol sSymbol = (moSimpleLineSymbol)_Symbols[i]; sSymbol.Color = sColors[i]; } else if (_Symbols[i].SymbolType == moSymbolTypeConstant.SimpleFillSymbol) { moSimpleFillSymbol sSymbol = (moSimpleFillSymbol)_Symbols[i]; sSymbol.Color = sColors[i]; } } } }
//绘制点 internal static void DrawPoint(Graphics g, moRectangle extent, double mapScale, double dpm, double mpu, moPoint point, moSymbol symbol) { if (symbol.SymbolType == moSymbolTypeConstant.SimpleMarkerSymbol) { moSimpleMarkerSymbol sSymbol = (moSimpleMarkerSymbol)symbol; if (sSymbol.Visible == true) { DrawPointBySimpleMarker(g, extent, mapScale, dpm, mpu, point, sSymbol); } } }
/// <summary> /// 复制 /// </summary> /// <returns></returns> public override moSymbol Clone() { moSimpleMarkerSymbol sSymbol = new moSimpleMarkerSymbol(); sSymbol._Label = _Label; sSymbol._Visible = _Visible; sSymbol._Style = _Style; sSymbol._Color = _Color; sSymbol._Size = _Size; return(sSymbol); }
//绘制点集合(多点) internal static void DrawPoints(Graphics g, moRectangle extent, double mapScale, double dpm, double mpu, moPoints points, moSymbol symbol) { if (symbol.SymbolType == moSymbolTypeConstant.SimpleMarkerSymbol) { moSimpleMarkerSymbol sSymbol = (moSimpleMarkerSymbol)symbol; if (sSymbol.Visible == true) { Int32 sPointCount = points.Count; for (Int32 i = 0; i <= sPointCount - 1; i++) { moPoint sPoint = points.GetItem(i); DrawPointBySimpleMarker(g, extent, mapScale, dpm, mpu, sPoint, sSymbol); } } } }
//采用简单点符号绘制点 private static void DrawPointBySimpleMarker(Graphics g, moRectangle extent, double mapScale, double dpm, double mpu, moPoint point, moSimpleMarkerSymbol symbol) { double sOffsetX = extent.MinX, sOffsetY = extent.MaxY; //获取投影坐标系相对屏幕坐标系的平移量 //(1)转换为屏幕坐标 PointF sScreenPoint = new PointF(); sScreenPoint.X = (float)((point.X - sOffsetX) * mpu / mapScale * dpm); sScreenPoint.Y = (float)((sOffsetY - point.Y) * mpu / mapScale * dpm); //(2)计算符号大小 float sSize = (float)(symbol.Size / 1000 * dpm); //符号大小,像素 if (sSize < 1) { sSize = 1; } //(3)定义绘制区域并绘制 Rectangle sDrawingArea = new Rectangle((Int32)(sScreenPoint.X - sSize / 2), (Int32)(sScreenPoint.Y - sSize / 2), (Int32)sSize, (Int32)sSize); DrawSimpleMarker(g, sDrawingArea, dpm, symbol); }
//要素的符号是否可见 private bool IsFeatureSymbolVisible(moFeature feature) { moSymbol sSymbol = feature.Symbol; if (sSymbol.SymbolType == moSymbolTypeConstant.SimpleMarkerSymbol) { moSimpleMarkerSymbol sMarkerSymbol = (moSimpleMarkerSymbol)sSymbol; return(sMarkerSymbol.Visible); } else if (sSymbol.SymbolType == moSymbolTypeConstant.SimpleLineSymbol) { moSimpleLineSymbol sLineSymbol = (moSimpleLineSymbol)sSymbol; return(sLineSymbol.Visible); } else if (sSymbol.SymbolType == moSymbolTypeConstant.SimpleFillSymbol) { moSimpleFillSymbol sFillSymbol = (moSimpleFillSymbol)sSymbol; return(sFillSymbol.Visible); } else { throw new Exception("Invalid symbol type!"); } }
//绘制简单点符号 private static void DrawSimpleMarker(Graphics g, Rectangle drawingArea, double dpm, moSimpleMarkerSymbol symbol) { if (symbol.Style == moSimpleMarkerSymbolStyleConstant.Circle) { throw new NotImplementedException(); } else if (symbol.Style == moSimpleMarkerSymbolStyleConstant.SolidCircle) { SolidBrush sBrush = new SolidBrush(symbol.Color); g.FillEllipse(sBrush, drawingArea); sBrush.Dispose(); } else if (symbol.Style == moSimpleMarkerSymbolStyleConstant.Triangle) { throw new NotImplementedException(); } else if (symbol.Style == moSimpleMarkerSymbolStyleConstant.SolidTriangle) { throw new NotImplementedException(); } else if (symbol.Style == moSimpleMarkerSymbolStyleConstant.Square) { throw new NotImplementedException(); } else if (symbol.Style == moSimpleMarkerSymbolStyleConstant.SolidSquare) { SolidBrush sBrush = new SolidBrush(symbol.Color); g.FillRectangle(sBrush, drawingArea); sBrush.Dispose(); } else if (symbol.Style == moSimpleMarkerSymbolStyleConstant.CircleDot) { throw new NotImplementedException(); } else if (symbol.Style == moSimpleMarkerSymbolStyleConstant.CircleCircle) { throw new NotImplementedException(); } }
/// <summary> /// 绘制所有注记 /// </summary> /// <param name="g"></param> /// <param name="extent"></param> /// <param name="mapScale"></param> /// <param name="dpm"></param> /// <param name="mpu"></param> /// <param name="placedLabelExtents"></param> internal void DrawLabels(Graphics g, moRectangle extent, double mapScale, double dpm, double mpu, List <RectangleF> placedLabelExtents) { if (_LabelRenderer == null) { return; } if (_LabelRenderer.LabelFeatures == false) { return; } Int32 sFieldIndex = _AttributeFields.FindField(_LabelRenderer.Field); if (sFieldIndex < 0) { return; } Int32 sFeatureCount = _Features.Count; for (Int32 i = 0; i <= sFeatureCount - 1; i++) { moFeature sFeature = _Features.GetItem(i); if (IsFeatureInExtent(sFeature, extent) == false) { //要素不位于显示范围内,不显示注记 continue; } if (sFeature.Symbol == null) { //要素没有配置符号,不显示注记 continue; } if (IsFeatureSymbolVisible(sFeature) == false) { //要素符号不可见,自然就不显示注记 continue; } string sLabelText = GetValueString(sFeature.Attributes.GetItem(sFieldIndex)); if (sLabelText == string.Empty) { //注记文本为空,不显示注记 continue; } //根据要素几何类型采用相应的配置方案 if (sFeature.ShapeType == moGeometryTypeConstant.Point) { //点要素,取点的右上为定位点,但要考虑点符号的大小 //(1)复制符号 moTextSymbol sTextSymbol; //最终绘制注记所采用的符号 sTextSymbol = _LabelRenderer.TextSymbol.Clone(); //复制符号 //(2)计算定位点并设置符号 PointF sSrcLabelPoint; //定位点的屏幕坐标 moPoint sPoint = (moPoint)sFeature.Geometry; PointF sSrcPoint = FromMapPoint(extent, mapScale, dpm, mpu, sPoint); //点要素的屏幕坐标 moSimpleMarkerSymbol sMarkerSymbol = (moSimpleMarkerSymbol)sFeature.Symbol; float sSymbolSize = (float)(sMarkerSymbol.Size / 1000 * dpm); //符号的屏幕尺寸 //右上方并设置符号 sSrcLabelPoint = new PointF(sSrcPoint.X + sSymbolSize / 2, sSrcPoint.Y - sSymbolSize / 2); sTextSymbol.Alignment = moTextSymbolAlignmentConstant.BottomLeft; //(3)计算注记的屏幕范围矩形 RectangleF sLabelExtent = GetLabelExtent(g, dpm, sSrcLabelPoint, sLabelText, sTextSymbol); //(4)冲突检测 if (HasConflict(sLabelExtent, placedLabelExtents) == false) { //没有冲突,则绘制并将当前注记范围矩形加入placedLabelExtents moMapDrawingTools.DrawLabel(g, dpm, sLabelExtent.Location, sLabelText, sTextSymbol); placedLabelExtents.Add(sLabelExtent); } } else if (sFeature.ShapeType == moGeometryTypeConstant.MultiPolyline) { //线要素,为每个部分的中点配置一个注记 //(1)获取符号,线要素无需复制符号 moTextSymbol sTextSymbol = _LabelRenderer.TextSymbol; //(2)对每个部分进行配置 moMultiPolyline sMultiPolyline = (moMultiPolyline)sFeature.Geometry; Int32 sPartCount = sMultiPolyline.Parts.Count; for (Int32 j = 0; j <= sPartCount - 1; j++) { //获取注记 moPoint sMapLabelPoint = moMapTools.GetMidPointOfPolyline(sMultiPolyline.Parts.GetItem(j)); PointF sSrcLabelPoint = FromMapPoint(extent, mapScale, dpm, mpu, sMapLabelPoint); //计算注记的屏幕范围矩形 RectangleF sLabelExtent = GetLabelExtent(g, dpm, sSrcLabelPoint, sLabelText, _LabelRenderer.TextSymbol); //冲突检测 if (HasConflict(sLabelExtent, placedLabelExtents) == false) { //没有冲突,则绘制并将当前注记范围矩形加入placedLabelExtents moMapDrawingTools.DrawLabel(g, dpm, sLabelExtent.Location, sLabelText, sTextSymbol); placedLabelExtents.Add(sLabelExtent); } } } else if (sFeature.ShapeType == moGeometryTypeConstant.MultiPolygon) { //面要素,为面积最大的外环及其内环所构成的多边形配置一个注记 //(1)获取符号,面要素无需复制符号 moTextSymbol sTextSymbol = _LabelRenderer.TextSymbol; //(2)获取注记点 moMultiPolygon sMultiPolygon = (moMultiPolygon)sFeature.Geometry; moPoint sMapLabelPoint = moMapTools.GetLabelPointOfMultiPolygon(sMultiPolygon); PointF sSrcLabelPoint = FromMapPoint(extent, mapScale, dpm, mpu, sMapLabelPoint); //(3)计算注记的屏幕范围矩形 RectangleF sLabelExtent = GetLabelExtent(g, dpm, sSrcLabelPoint, sLabelText, _LabelRenderer.TextSymbol); //(4)冲突检测 if (HasConflict(sLabelExtent, placedLabelExtents) == false) { //没有冲突,则绘制并将当前注记范围矩形加入placedLabelExtents moMapDrawingTools.DrawLabel(g, dpm, sLabelExtent.Location, sLabelText, sTextSymbol); placedLabelExtents.Add(sLabelExtent); } } else { throw new Exception("Invalid shape type!"); } } }