Example #1
0
 //初始化符号
 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];
                    }
                }
            }
        }
Example #3
0
 //绘制点
 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);
         }
     }
 }
Example #4
0
        /// <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);
        }
Example #5
0
 //绘制点集合(多点)
 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);
             }
         }
     }
 }
Example #6
0
        //采用简单点符号绘制点
        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);
        }
Example #7
0
        //要素的符号是否可见
        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!");
            }
        }
Example #8
0
 //绘制简单点符号
 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();
     }
 }
Example #9
0
        /// <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!");
                }
            }
        }