MapWindow Gis 组件代码示例:

MapWindow Gis 组件代码示例:

官方网站: http://www.mapwindow.org/

该示例使用mapwindow 4 MapWinGIS.ocx X86,其它版本请参考官网相关代码示例。 

View Code
#region 地图相关

        //地图初始化

        private void InitMap()

        {

            axMap.CursorMode = MapWinGIS.tkCursorMode.cmPan;

            axMap.SendMouseMove = true;

            axMap.SendMouseDown = true;

            axMap.DisableWaitCursor = true;



            Shapefile sf_provence_area = new Shapefile();

            Shapefile sf_provence_city = new Shapefile();

            Shapefile sf_diqu_area = new Shapefile();

            Shapefile sf_diqu = new Shapefile();

            Shapefile sf_town = new Shapefile();



            sf_provence_area.Open(Application.StartupPath + "\\Map\\bou2_4p.shp", null);

            sf_provence_city.Open(Application.StartupPath + "\\Map\\res1_4m.shp", null);

            sf_diqu_area.Open(Application.StartupPath + "\\Map\\diquJie_polyline.shp", null);

            sf_diqu.Open(Application.StartupPath + "\\Map\\res2_4m.shp", null);

            //sf_town.Open(Application.StartupPath + "\\Map\\XianCh_point.shp", null);



            int idx1 = axMap.AddLayer(sf_provence_area, true);

            int idx2 = axMap.AddLayer(sf_provence_city, true);

            int idx3 = axMap.AddLayer(sf_diqu_area, true);

            int idx4 = axMap.AddLayer(sf_diqu, true);

            //int idx5 = axMap.AddLayer(sf_town, true);



            axMap.set_ShapeLayerFillColor(idx1, (uint)ColorTranslator.ToOle(Color.FromArgb(0xF2, 0xEF, 0xE9)));

            axMap.set_ShapeLayerLineWidth(idx3,0.3f);

            axMap.set_ShapeLayerPointSize(idx2, 5);

            axMap.set_ShapeLayerPointType(idx2, tkPointType.ptDiamond);

            axMap.set_ShapeLayerPointSize(idx4, 1);

            //axMap.set_ShapeLayerPointSize(idx5, 1);



            #region 设置地区标签

            int idx_diqu = axMap.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList);

            //axMap.set_DrawingLabelsScale(idx_diqu, true);

            axMap.DrawingFont(idx_diqu, "Tahoma", 7);

            axMap.set_UseDrawingLabelCollision(idx_diqu, true);

            axMap.set_DrawingLabelsShadow(idx_diqu, true);



            for (int i = 0; i < sf_diqu.NumShapes; i++)

            {

                string labtxt = sf_diqu.get_CellValue(5, i).ToString();

                double x, y;

                MapWinGIS.Shape sh = sf_diqu.get_Shape(i);

                x = sh.get_Point(0).x;

                y = sh.get_Point(0).y;

                axMap.AddDrawingLabel(idx_diqu, labtxt, 0, x, y, tkHJustification.hjNone);

            }

            #endregion



            #region 设置省会标签

            int idx = axMap.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList);

            axMap.DrawingFont(idx, "Tahoma", 8);

            axMap.set_UseDrawingLabelCollision(idx, true);

            axMap.set_DrawingLabelsShadow(idx, true);

            axMap.set_DrawingLabelsShadowColor(idx, (uint)(ColorTranslator.ToOle(Color.FromArgb(0xDD, 0xDD, 0xFF))));

            for (int i = 0; i < sf_provence_city.NumShapes; i++)

            {

                string labtxt = sf_provence_city.get_CellValue(5, i).ToString();

                double x, y;

                MapWinGIS.Shape sh = sf_provence_city.get_Shape(i);

                x = sh.get_Point(0).x;

                y = sh.get_Point(0).y;

                axMap.AddDrawingLabel(idx, labtxt, 0, x, y, tkHJustification.hjNone);

            }

            #endregion



            #region  设置省份标签

            string labelText1;

            int _idx = axMap.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList);

            axMap.DrawingFont(_idx, "Tahoma", 9);

            axMap.set_UseDrawingLabelCollision(_idx, true);

            axMap.set_DrawingLabelsShadow(_idx, true);

            axMap.set_DrawingLabelsShadowColor(_idx, (uint)(ColorTranslator.ToOle(Color.FromArgb(0xD6, 0xD6, 0xAD))));

            for (int i = 0; i < sf_provence_area.NumShapes; i++)

            {

                labelText1 = sf_provence_area.get_CellValue(6, i).ToString();

                double area = Convert.ToDouble(sf_provence_area.get_CellValue(0, i));

                if (area < 0.2)

                {

                    continue;

                }

                MapWinGIS.Shape sh = sf_provence_area.get_Shape(i);



                double x, y;

                CalcShXY(sh, out x, out y);

                if (!sf_provence_area.PointInShape(i, x, y))

                {

                    x = sh.get_Point(sh.numPoints * 3 / 4).x;

                    y = sh.get_Point(sh.numPoints * 3 / 4).y;

                }

                axMap.AddDrawingLabel(_idx, labelText1, (uint)(ColorTranslator.ToOle(Color.Green)), x, y, tkHJustification.hjNone);

            }

            #endregion



            axMap.set_UseLabelCollision(idx1, true);

            axMap.set_LayerLabelsShadow(idx1, true);

        }

        //计算地图中心点

        private void CalcShXY(MapWinGIS.Shape sh, out double x, out double y)

        {

            double minX = double.MaxValue;

            double minY = double.MaxValue;

            double maxX = 0.0;

            double maxY = 0.0;



            for (int m = 0; m < sh.numPoints; m++)

            {

                if (sh.get_Point(m).x < minX)

                {

                    minX = sh.get_Point(m).x;

                }

                if (sh.get_Point(m).y < minY)

                {

                    minY = sh.get_Point(m).y;

                }

                if (sh.get_Point(m).x > maxX)

                {

                    maxX = sh.get_Point(m).x;

                }

                if (sh.get_Point(m).y > maxY)

                {

                    maxY = sh.get_Point(m).y;

                }

            }

            x = (maxX + minX) / 2;

            y = (maxY + minY) / 2;

        }

        //地图鼠标移动

        private void axMap_MouseMoveEvent(object sender, AxMapWinGIS._DMapEvents_MouseMoveEvent e)

        {

            double x = 0;

            double y = 0;

            axMap.PixelToProj(e.x, e.y, ref x, ref y);

            tsLabTxt.Text = "东经:" + x.ToString("F5") + "北纬:" + y.ToString("F5");

        }

        //地图鼠标点击

        private void axMap_MouseDownEvent(object sender, AxMapWinGIS._DMapEvents_MouseDownEvent e)

        {

            double x = 0;

            double y = 0;



            if (2 == e.button)

            {

                axMap.ClearDrawing(_dictdrawHandels[DrawHandels.MeaSureHandel]);

                ClearMeasurePoints();

                tsOperateInfo.Caption = string.Empty;

                _cur = CurState.Arrow;

                axMap.MapCursor = tkCursor.crsrMapDefault;

                return;

            }

            axMap.PixelToProj(e.x, e.y, ref x, ref y);

            MPoint point = new MPoint()

            {

                x = x,

                y = y

            };

            switch (_cur)

            {

                case CurState.Cross:

                    tsTextPoint.Text = point.x.ToString("F5") + "," + point.y.ToString("F5");

                    break;

                case CurState.MeasurementLenth:

                    _measurePoints.Add(point);

                    axMap_AfterTrackingLayerDraw();

                    tsOperateInfo.Caption = "距离为:" + CalcLenght(_measurePoints).ToString("F2") + "";

                    break;

                case CurState.AddSwerve:

                    if ("FK_Swerve" == gc.DataMember)

                    {

                        if ("-1" == edLookRoad.EditValue.ToString())

                        {

                            return;

                        }

                        int newID;

                        object[] objArray = new object[] { 0, Convert.ToInt32(edLookRoad.EditValue), Convert.ToInt32(point.x * 100000), Convert.ToInt32(point.y * 100000), 0, 0 };

                        EsClass.NewTableRow(esdbDS.t_swerve, objArray, "SwerveID", out newID);

                        _ppt.x = point.x;

                        _ppt.y = point.y;

                        menuItemSwerve.Tag = true;

                        ShowInMap(false, false, false, true, false, false);

                        axMap_AfterTrackingLayerDraw();

                    }

                    break;

                case CurState.SetDepotGps:

                    if ("FK_Depots" == gc.DataMember)

                    {

                        ChgGVGps(gvDepots.DataSource, point);

                        menuItemDeport.Tag = true;

                        menuItemAng.Tag = true;

                        ShowInMap(false, true, true, false, false, false);

                        axMap_AfterTrackingLayerDraw();

                    }

                    break;

                case CurState.SetBroadcastGps:

                    BindingSource bsBroadcast = (BindingSource)gvBroadcast.DataSource;

                    if (null == bsBroadcast.Current)

                    {

                        return;

                    }

                    DataRowView drvBroadcast = (DataRowView)bsBroadcast.Current;

                    gvBroadcast.FocusedColumn = gvBroadcast.Columns[0];

                    if (string.Empty == drvBroadcast.Row["起始时间"].ToString() || string.Empty == drvBroadcast["结束时间"].ToString())

                    {

                        XtraMessageBox.Show("请先设置起止时间!");

                        return;

                    }

                    if ("FK_Broadcast" == gc.DataMember)

                    {

                        ChgGVGps(gvBroadcast.DataSource, point);

                        menuItemBroadcast.Tag = true;

                        ShowInMap(false, false, false, false, false, true);

                        axMap_AfterTrackingLayerDraw();

                    }

                    break;

                case CurState.SetSwerveGps:

                    if ("FK_Swerve" == gc.DataMember)

                    {

                        ChgGVGps(gvSwerve.DataSource, point);

                        menuItemSwerve.Tag = true;

                        menuItemDeport.Tag = true;

                        ShowInMap(false, false, false, true, false, false);

                        axMap_AfterTrackingLayerDraw();

                    }

                    break;

                case CurState.ExtendSpeedArea:

                    if ("FK_Speed" == gc.DataMember)

                    {

                        BindingSource bs = (BindingSource)gvSpeed.DataSource;

                        if (null == bs.Current)

                        {

                            return;

                        }

                        DataRowView drv = (DataRowView)bs.Current;

                        int pot = 0;

                        string currentid = drv["SpeedID"].ToString();

                        int currentspeed = (int)drv["限速"];

                        for (int b = 0; b < esdbDS.t_speed.Rows.Count; b++)

                        {

                            if (esdbDS.t_speed.Rows[b].RowState == DataRowState.Deleted)

                            {

                                continue;

                            }

                            if (esdbDS.t_speed.Rows[b].RowState == DataRowState.Detached)

                            {

                                continue;

                            }

                            if (currentid == esdbDS.t_speed.Rows[b]["SpeedID"].ToString())

                            {

                                pot = b;

                            }

                        }

                        DataTable dt = esdbDS.t_speed;

                        DataRow row = dt.NewRow();

                        row.ItemArray = new object[]{ row.ItemArray[0], Convert.ToInt32(edLookRoad.EditValue), 1, Convert.ToInt32(point.x * 100000),

                                                          Convert.ToInt32(point.y * 100000), currentspeed };

                        dt.Rows.InsertAt(row, pot + 1);

                        dt.Columns["SpeedID"].Unique = true;

                        dt.PrimaryKey = new DataColumn[] { dt.Columns["SpeedID"] };

                        _ppt.x = point.x;

                        _ppt.y = point.y;

                        menuItemSpeed.Tag = true;

                        ShowInMap(false, false, false, false, true, false);

                        axMap_AfterTrackingLayerDraw();

                        bs.MoveLast();

                        bs.EndEdit();

                        gc.MainView.CloseEditor();

                    }

                    break;

            }

        }

        //地图导航工具点击

        private void tool_track_axmap_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

        {

            _cur = (CurState)(Convert.ToInt32(e.ClickedItem.Tag));

            axMap.MapCursor = tkCursor.crsrMapDefault;

            axMap.MouseWheelSpeed = 0.8;

            switch (_cur)

            {

                case CurState.Arrow:

                    axMap.CursorMode = tkCursorMode.cmNone;

                    break;

                case CurState.Pan:

                    axMap.CursorMode = tkCursorMode.cmPan;

                    break;

                case CurState.ZoomIn:

                    axMap.CursorMode = tkCursorMode.cmZoomIn;

                    break;

                case CurState.ZoomOut:

                    axMap.CursorMode = tkCursorMode.cmZoomOut;

                    break;

                case CurState.Global:

                    axMap.CursorMode = tkCursorMode.cmNone;

                    ShowFullPath();

                    break;

                case CurState.Cross:

                    axMap.MapCursor = tkCursor.crsrCross;

                    break;

                case CurState.MeasurementLenth:

                    axMap.CursorMode = tkCursorMode.cmNone;

                    ClearMeasurePoints();

                    break;

                case CurState.ChgGpsDirection:

                    axMap.CursorMode = tkCursorMode.cmNone;

                    axMap.MouseWheelSpeed = 1;

                    break;

                default:

                    axMap.CursorMode = tkCursorMode.cmNone;

                    break;

            }

        }

        //显示地图 加载地图数据

        private void ShowInMap(bool istrack, bool isdepotsx, bool isdepotxx, bool isswerve, bool isspeed, bool isbroadcast)

        {

            if (null == edLookRoad.EditValue)

            {

                if (istrack)

                {

                    _arrTrack.Clear();

                }

                if (isdepotsx)

                {

                    _arrDepotsx.Clear();

                }

                if (isdepotxx)

                {

                    _arrDepotxx.Clear();

                }

                if (isswerve)

                {

                    _arrSwerve.Clear();

                }

                if (isspeed)

                {

                    _arrSpeed.Clear();

                }

                if (isbroadcast)

                {

                    _arrBroadCast.Clear();

                }

                return;

            }

            if (istrack)

            {

                DataRow[] drs = esdbDS.t_track.Select("RoadID=" + edLookRoad.EditValue.ToString());

                if (drs.Length > 0)

                {

                    ShowTrack(esdbDS.t_track);

                }

                else

                {

                    _arrTrack.Clear();

                    CreateDTTrack();

                    ShowTrack(dtTrack270);

                }

            }

            if (isdepotsx)

            {

                _arrDepotsx.Clear();

                string filter = string.Format("上下行={0}", 0);

                foreach (DataRow row in esdbDS.Tables["t_depots"].Select(filter))

                {

                    if (row.RowState == DataRowState.Deleted)

                    {

                        continue;

                    }

                    if (row["RoadID"].ToString() == edLookRoad.EditValue.ToString())

                    {

                        MPoint pt = new MPoint();

                        pt.x = Convert.ToDouble(row["经度"]) / 100000;

                        pt.y = Convert.ToDouble(row["纬度"]) / 100000;

                        DepotsSX dpts;

                        dpts._name = (string)row["站名"];

                        dpts._pt = pt;

                        dpts._ang = (int)row["角度"];

                        _arrDepotsx.Add(dpts);

                    }

                }

            }

            if (isdepotxx)

            {

                _arrDepotxx.Clear();

                string filter = string.Format("上下行={0}", 1);

                foreach (DataRow row in esdbDS.Tables["t_depots"].Select(filter))

                {

                    if (row.RowState == DataRowState.Deleted)

                    {

                        continue;

                    }

                    if (row["RoadID"].ToString() == edLookRoad.EditValue.ToString())

                    {

                        MPoint pt = new MPoint();

                        pt.x = Convert.ToDouble(row["经度"]) / 100000;

                        pt.y = Convert.ToDouble(row["纬度"]) / 100000;

                        DepotsXX dpts;

                        dpts._name = (string)row["站名"];

                        dpts._pt = pt;

                        dpts._ang = (int)row["角度"];

                        _arrDepotxx.Add(dpts);

                    }

                }

            }

            if (isswerve)

            {

                _arrSwerve.Clear();

                foreach (DataRow row in esdbDS.t_swerve)

                {

                    if (row.RowState == DataRowState.Deleted)

                    {

                        continue;

                    }

                    if (row["RoadID"].ToString() == edLookRoad.EditValue.ToString())

                    {

                        string state = row.RowState.ToString();

                        MPoint pt = new MPoint();

                        pt.x = Convert.ToDouble(row["经度"]) / 100000;

                        pt.y = Convert.ToDouble(row["纬度"]) / 100000;

                        Swerves swers;

                        swers._pt = pt;

                        swers._ang = (int)row["角度"];

                        _arrSwerve.Add(swers);

                    }

                }

            }

            if (isspeed)

            {

                _arrSpeed.Clear();

                string filter = string.Format("RoadID={0}", edLookRoad.EditValue.ToString());

                DataRow[] drc = esdbDS.Tables["t_speed"].Select(filter);

                for (int i = 0; i < drc.Length; )

                {

                    if (drc[i]["RoadID"].ToString() == edLookRoad.EditValue.ToString())

                    {

                        if (drc[i].RowState == DataRowState.Deleted)

                        {

                            continue;

                        }

                        if ("0" == drc[i]["经度"].ToString() || "0" == drc[i]["纬度"].ToString())

                        {

                            List<MPoint> points = new List<MPoint>();

                            Speed _speed = new Speed();

                            int speed = (int)drc[i]["限速"];

                            if (++i == drc.Length)

                                break;

                            while ("0" != drc[i]["经度"].ToString() || "0" != drc[i]["纬度"].ToString())

                            {

                                MPoint point = new MPoint();

                                point.x = Convert.ToDouble(drc[i]["经度"]) / 100000;

                                point.y = Convert.ToDouble(drc[i]["纬度"]) / 100000;

                                points.Add(point);

                                if (++i == drc.Length)

                                    break;

                            }

                            _speed._points = points;

                            _speed._speed = speed;

                            _arrSpeed.Add(_speed);

                        }

                    }

                }

            }

            if (isbroadcast)

            {

                _arrBroadCast.Clear();

                foreach (DataRow row in esdbDS.t_broadcast)

                {

                    if (row.RowState == DataRowState.Deleted)

                    {

                        continue;

                    }

                    if (row["RoadID"].ToString() == edLookRoad.EditValue.ToString())

                    {

                        MPoint pt = new MPoint();

                        pt.x = Convert.ToDouble(row["经度"]) / 100000;

                        pt.y = Convert.ToDouble(row["纬度"]) / 100000;

                        Broadcast bdct;

                        bdct._pt = pt;

                        bdct._type = row["类型"].ToString();

                        _arrBroadCast.Add(bdct);

                    }

                }

            }

            axMap_AfterTrackingLayerDraw();

        }

        //绘制地图

        private void axMap_AfterTrackingLayerDraw()

        {

            #region draw track

            if ((bool)menuItemTrack.Tag)

            {

                menuItemDeport.Tag = true;

                if (menuItemTrack.Checked)

                {

                    ClearspecificDrawing(_dictdrawHandels, DrawHandels.TrackDrawHandel, -1);



                    _dictdrawHandels[DrawHandels.TrackDrawHandel] = axMap.NewDrawing(MapWinGIS.tkDrawReferenceList.dlSpatiallyReferencedList);

                    for (int i = 0; i < _arrTrack.Count; i++)

                    {

                        Track tr = (Track)_arrTrack[i];



                        for (int k = 0; k < tr._points.Count; k++)

                        {

                            if (k + 1 < tr._points.Count)

                            {

                                axMap.DrawLineEx(_dictdrawHandels[DrawHandels.TrackDrawHandel], tr._points[k].x, tr._points[k].y, tr._points[k + 1].x,

                                    tr._points[k + 1].y, 1, (uint)(ColorTranslator.ToOle(Color.FromArgb(0, 0x72, 0xE3))));

                            }

                        }

                    }

                }

                else

                {

                    ClearspecificDrawing(_dictdrawHandels, DrawHandels.TrackDrawHandel, -1);

                }

                menuItemTrack.Tag = false;

            }

            #endregion

            #region draw depot

            if ((bool)menuItemDeport.Tag)

            {

                if (menuItemDeport.Checked)

                {

                    ClearspecificDrawing(_dictdrawHandels, DrawHandels.DepotDrawHandle, -1);



                    _dictdrawHandels[DrawHandels.DepotDrawHandle] = axMap.NewDrawing(MapWinGIS.tkDrawReferenceList.dlSpatiallyReferencedList);

                    axMap.DrawingFont(_dictdrawHandels[DrawHandels.DepotDrawHandle], "Tahoma", 8);

                    for (int i = 0; i < _arrDepotsx.Count; i++)

                    {

                        DepotsSX mpt = (DepotsSX)_arrDepotsx[i];

                        if (0 == mpt._pt.x && 0 == mpt._pt.y)

                        {

                            continue;

                        }

                        axMap.DrawCircleEx(_dictdrawHandels[DrawHandels.DepotDrawHandle], mpt._pt.x, mpt._pt.y, 2, (uint)(ColorTranslator.ToOle(Color.Black)), true);

                        AddDrawingLableDepot(_dictdrawHandels[DrawHandels.DepotDrawHandle], mpt._name, (uint)ColorTranslator.ToOle(Color.Green), mpt._pt.x, mpt._pt.y, tkHJustification.hjNone);

                    }

                    for (int i = 0; i < _arrDepotxx.Count; i++)

                    {

                        DepotsXX mpt = (DepotsXX)_arrDepotxx[i];

                        if (0 == mpt._pt.x && 0 == mpt._pt.y)

                        {

                            continue;

                        }

                        axMap.DrawCircleEx(_dictdrawHandels[DrawHandels.DepotDrawHandle], mpt._pt.x, mpt._pt.y, 2, (uint)(ColorTranslator.ToOle(Color.Purple)), true);

                        AddDrawingLableDepot(_dictdrawHandels[DrawHandels.DepotDrawHandle], mpt._name, (uint)ColorTranslator.ToOle(Color.FromArgb(0x6C, 0x6C, 0x6C)), mpt._pt.x, mpt._pt.y, tkHJustification.hjNone);

                    }

                    axMap.set_UseDrawingLabelCollision(_dictdrawHandels[DrawHandels.DepotDrawHandle], true);

                }

                else

                {

                    ClearspecificDrawing(_dictdrawHandels, DrawHandels.DepotDrawHandle, -1);

                }

                menuItemDeport.Tag = false;

            }

            #endregion

            #region draw swerve

            if ((bool)menuItemSwerve.Tag)

            {

                if (menuItemSwerve.Checked)

                {

                    Dictionary<int, int> fonts = new Dictionary<int, int>();

                    Removelayer(ref _idx_shafile_swerve);

                    Removelayer(ref _idx_shafile_swerve_ico);



                    Shapefile shapefile_swerve = CreateShapefile("shapefile_swerve", ShpfileType.SHP_POINT, out _idx_shafile_swerve);

                    Shapefile shapefile_swerve_ico = CreateShapefile("shapefile_swerve_ico", ShpfileType.SHP_POINT, out _idx_shafile_swerve_ico);



                    List<MapWinGIS.Point> points = new List<MapWinGIS.Point>();

                    for (int i = 0; i < _arrSwerve.Count; i++)

                    {

                        Swerves sw = (Swerves)_arrSwerve[i];

                        MapWinGIS.Point point = new MapWinGIS.Point

                        {

                            x = sw._pt.x,

                            y = sw._pt.y,

                            Z = sw._ang

                        };

                        points.Add(point);

                    }

                    ShapefileInsertPoints(shapefile_swerve, points);

                    ShapefileInsertPoints(shapefile_swerve_ico, points);



                    SetLayerEsFont(shapefile_swerve, _idx_shafile_swerve, "ES_Font", 14, fonts, 255, false);

                    SetLayerEsFont(shapefile_swerve_ico, _idx_shafile_swerve_ico, "ES_Font", 8, (uint)(ColorTranslator.ToOle(Color.FromArgb(0x70, 0x70, 0x38))), false, 0x32);

                }

                else

                {

                    Removelayer(ref _idx_shafile_swerve);

                    Removelayer(ref _idx_shafile_swerve_ico);

                }

                menuItemSwerve.Tag = false;

            }

            #endregion

            #region draw speed

            if ((bool)menuItemSpeed.Tag)

            {

                if (menuItemSpeed.Checked)

                {

                    ClearspecificDrawing(_dictdrawHandels, DrawHandels.SpeedHandel, -1);

                    Removelayer(ref _idx_shfile_speed);



                    _dictdrawHandels[DrawHandels.SpeedHandel] = axMap.NewDrawing(MapWinGIS.tkDrawReferenceList.dlSpatiallyReferencedList);

                    axMap.DrawingFont(_dictdrawHandels[DrawHandels.SpeedHandel], "Tahoma", 6);



                    Shapefile shapefile_speed = CreateShapefile("shapefile_broadcast", ShpfileType.SHP_POINT, out _idx_shfile_speed);

                    List<MapWinGIS.Point> points = new List<MapWinGIS.Point>();



                    axMap.set_UseDrawingLabelCollision(_dictdrawHandels[DrawHandels.SpeedHandel], true);

                    axMap.set_DrawingLabelsOffset(_dictdrawHandels[DrawHandels.SpeedHandel], 15);

                    for (int i = 0; i < _arrSpeed.Count; i++)

                    {

                        Speed sp = (Speed)_arrSpeed[i];

                        foreach (MPoint point in sp._points)

                        {

                            MapWinGIS.Point p = new MapWinGIS.Point

                            {

                                x = point.x,

                                y = point.y

                            };

                            points.Add(p);

                        }

                        for (int k = 0; k < sp._points.Count; k++)

                        {

                            axMap.AddDrawingLabel(_dictdrawHandels[DrawHandels.SpeedHandel], sp._speed.ToString(), (uint)ColorTranslator.ToOle(Color.OrangeRed), sp._points[k].x, sp._points[k].y, tkHJustification.hjNone);

                            if (k + 1 < sp._points.Count)

                            {

                                axMap.DrawLineEx(_dictdrawHandels[DrawHandels.SpeedHandel], sp._points[k].x, sp._points[k].y, sp._points[k + 1].x, sp._points[k + 1].y, 1,

                                    (uint)(ColorTranslator.ToOle(Color.FromArgb(0xFF, 0xC3, 0x45))));

                            }

                        }

                    }

                    ShapefileInsertPoints(shapefile_speed, points);

                    SetLayerEsFont(shapefile_speed, _idx_shfile_speed, "ES_Font", 7, (uint)(ColorTranslator.ToOle(Color.Purple)), false, 0x23);

                }

                else

                {

                    ClearspecificDrawing(_dictdrawHandels, DrawHandels.SpeedHandel, -1);

                    Removelayer(ref _idx_shfile_speed);

                }

                menuItemSpeed.Tag = false;

            }

            #endregion

            #region draw broadcast

            if ((bool)menuItemBroadcast.Tag)

            {

                if (menuItemBroadcast.Checked)

                {

                    ClearspecificDrawing(_dictdrawHandels, DrawHandels.BroadCastHandel, -1);

                    Removelayer(ref _idx_shfile_broadcast);



                    _dictdrawHandels[DrawHandels.BroadCastHandel] = axMap.NewDrawing(MapWinGIS.tkDrawReferenceList.dlSpatiallyReferencedList);

                    axMap.set_UseDrawingLabelCollision(_dictdrawHandels[DrawHandels.BroadCastHandel], true);

                    axMap.DrawingFont(_dictdrawHandels[DrawHandels.BroadCastHandel], "Tahoma", 8);

                    axMap.set_DrawingLabelsOffset(_dictdrawHandels[DrawHandels.BroadCastHandel], 15);



                    Shapefile shapefile_broadcast = CreateShapefile("shapefile_broadcast", ShpfileType.SHP_POINT, out _idx_shfile_broadcast);



                    List<MapWinGIS.Point> points = new List<MapWinGIS.Point>();

                    for (int i = 0; i < _arrBroadCast.Count; i++)

                    {

                        Broadcast bc = (Broadcast)_arrBroadCast[i];

                        MapWinGIS.Point point = new MapWinGIS.Point

                        {

                            x = bc._pt.x,

                            y = bc._pt.y,

                        };

                        points.Add(point);

                        string type = bc._type == "0" ? "安全信息" : "广告";

                        axMap.AddDrawingLabel(_dictdrawHandels[DrawHandels.BroadCastHandel], type, (uint)ColorTranslator.ToOle(Color.FromArgb(0xC4, 0xC4, 0)), bc._pt.x, bc._pt.y, tkHJustification.hjNone);

                    }

                    ShapefileInsertPoints(shapefile_broadcast, points);

                    SetLayerEsFont(shapefile_broadcast, _idx_shfile_broadcast, "ES_Font", 12, 255, false, 0x2F);

                }

                else

                {

                    ClearspecificDrawing(_dictdrawHandels, DrawHandels.BroadCastHandel, -1);

                    Removelayer(ref _idx_shfile_broadcast);

                }

                menuItemBroadcast.Tag = false;

            }

            #endregion

            #region draw measure line & point

            if (_measurePoints.Count > 0)

            {

                ClearspecificDrawing(_dictdrawHandels, DrawHandels.MeaSureHandel, -1);

                _dictdrawHandels[DrawHandels.MeaSureHandel] = axMap.NewDrawing(MapWinGIS.tkDrawReferenceList.dlSpatiallyReferencedList);

                for (int i = 0; i < _measurePoints.Count; i++)

                {

                    MPoint point = _measurePoints[i];

                    for (int k = 0; k < _measurePoints.Count; k++)

                    {

                        if (k + 1 < _measurePoints.Count)

                        {

                            axMap.DrawLineEx(_dictdrawHandels[DrawHandels.MeaSureHandel], _measurePoints[k].x, _measurePoints[k].y, _measurePoints[k + 1].x, _measurePoints[k + 1].y, 1,

                                (uint)(ColorTranslator.ToOle(Color.FromArgb(0x64, 0x21, 0))));

                        }

                        axMap.DrawCircleEx(_dictdrawHandels[DrawHandels.MeaSureHandel], _measurePoints[k].x, _measurePoints[k].y, 1.8, 255, true);

                    }

                }

            }

            #endregion

            #region draw ang

            if ((bool)menuItemAng.Tag)

            {

                if (menuItemAng.Checked)

                {

                    if (_idx_shpfile_ang > 1)

                    {

                        axMap.RemoveLayer(_idx_shpfile_ang);

                        _idx_shpfile_ang = -1;

                    }

                    Dictionary<int, int> fonts = new Dictionary<int, int>();

                    Shapefile shapefile_ang = CreateShapefile("shapefile_ang", ShpfileType.SHP_POINT, out _idx_shpfile_ang);



                    List<MapWinGIS.Point> points = new List<MapWinGIS.Point>();

                    for (int i = 0; i < _arrDepotsx.Count; i++)

                    {

                        DepotsSX mpt = (DepotsSX)_arrDepotsx[i];

                        if(0 == mpt._pt.x && 0 == mpt._pt.y)

                        {

                            continue;

                        }

                        MapWinGIS.Point point = new MapWinGIS.Point()

                        {

                            x = mpt._pt.x,

                            y = mpt._pt.y,

                            Z = mpt._ang,

                        };

                        points.Add(point);

                    }

                    for (int i = 0; i < _arrDepotxx.Count; i++)

                    {

                        DepotsXX mpt = (DepotsXX)_arrDepotxx[i];

                        if (0 == mpt._pt.x && 0 == mpt._pt.y)

                        {

                            continue;

                        }

                        MapWinGIS.Point point = new MapWinGIS.Point()

                        {

                            x = mpt._pt.x,

                            y = mpt._pt.y,

                            Z = mpt._ang,

                        };

                        points.Add(point);

                    }



                    ShapefileInsertPoints(shapefile_ang, points);

                    SetLayerEsFont(shapefile_ang, _idx_shpfile_ang, "ES_Font", 14, fonts, 255, false);

                }

                else

                {

                    if (_idx_shpfile_ang > 1)

                    {

                        axMap.RemoveLayer(_idx_shpfile_ang);

                        _idx_shpfile_ang = -1;

                    }

                }

                menuItemAng.Tag = false;

            }

            #endregion

            if (tsChBox.Checked && _ppt.x != 0.0 && _ppt.x != 0.0)

            {

                CenterAt(_ppt);

            }

        }

        //创建一个shapefile

        private Shapefile CreateShapefile(string shName, ShpfileType type, out int index)

        {

            Shapefile shapefile = new Shapefile();

            shapefile.CreateNew(shName, ShpfileType.SHP_POINT);

            index = axMap.AddLayer(shapefile, true);

            return shapefile;

        }

        //给Shapefile添加点

        private void ShapefileInsertPoints(Shapefile sh, List<MapWinGIS.Point> points)

        {

            foreach (MapWinGIS.Point point in points)

            {

                Shape shape = new Shape();

                shape.Create(ShpfileType.SHP_POINT);

                int idxshape_ang_SX = 0;

                int pointidx = 0;

                shape.InsertPoint(point, ref pointidx);

                sh.EditInsertShape(shape, ref idxshape_ang_SX);

            }

        }

        //地图以某点为中心

        private void CenterAt(MPoint _ppt)

        {

            MapWinGIS.Extents myExtents = (Extents)axMap.Extents;

            MPoint center = new MPoint

            {

                x = (myExtents.xMax + myExtents.xMin) / 2,

                y = (myExtents.yMax + myExtents.yMin) / 2

            };

            double _x = center.x - _ppt.x;

            double _y = center.y - _ppt.y;



            double minX = myExtents.xMin - _x;

            double maxX = myExtents.xMax - _x;

            double minY = myExtents.yMin - _y;

            double maxY = myExtents.yMax - _y;



            myExtents.SetBounds(minX, minY, 0, maxX, maxY, 0);

            axMap.Extents = myExtents;

        }

        //显示全局

        private void ShowFullPath()

        {

            if (_minx == 360.0)

            {

                _minx = 53.0;

            }

            if (_maxx == 0.0)

            {

                _maxx = 135.0;

            }

            if (_miny == 360.0)

            {

                _miny = 18.0;

            }

            if (_maxy == 0)

            {

                _maxy = 53.0;

            }

            MapWinGIS.Extents myExtents = (Extents)axMap.Extents;

            myExtents.SetBounds(_minx - 0.003, _miny - 0.003, 0, _maxx + 0.003, _maxy + 0.003, 0);

            axMap.Extents = myExtents;

        }

        //ToolStripMenuItem反选

        private void menuItem_Click(object sender, EventArgs e)

        {

            ToolStripMenuItem ts = sender as ToolStripMenuItem;

            ts.Checked = !ts.Checked;

            ts.Tag = true;

            axMap_AfterTrackingLayerDraw();

        }

        //显示地图

        private void btnShowMap_ItemClick(object sender, ItemClickEventArgs e)

        {

            dockPanelMap.Show();

            gvDepots.OptionsView.ColumnAutoWidth = false;

        }

        //关闭地图

        private void btnClosMap_ItemClick(object sender, ItemClickEventArgs e)

        {

            dockPanelMap.Close();

            gvDepots.OptionsView.ColumnAutoWidth = true;

        }

        //定位

        private void tsBtnPointTo_Click(object sender, EventArgs e)

        {

            Pointo(tsTextPoint.Text.Trim());

        }

        //定位某个点

        private void Pointo(string gpspt)

        {

            if (0 == gpspt.Length)

            {

                return;

            }

            try

            {

                string delimStr = ",";

                char[] sp = delimStr.ToCharArray();

                List<string> ss = new List<string>();

                string[] ssn = null;

                ssn = gpspt.Split(sp);

                for (int i = 0; i < ssn.Length; i++)

                {

                    string s = ssn[i].Trim();

                    if (s == "," || s == ":" || s.Length <= 0)

                    {

                        continue;

                    }

                    ss.Add(s);

                }

                if (ss.Count != 2)

                {

                    XtraMessageBox.Show("请输入一对经纬度值!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    return;

                }

                if (Convert.ToDouble(ss[0]) > 135.0 || Convert.ToDouble(ss[0]) < 74.0 || Convert.ToDouble(ss[1]) > 53.0 || Convert.ToDouble(ss[1]) < 18.0)

                {

                    XtraMessageBox.Show("请输入一个有效的中国范围内的经纬度值!", "经纬度超出范围", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                    return;

                }

                double x = Convert.ToDouble(ss[0]);

                double y = Convert.ToDouble(ss[1]);

                MapWinGIS.Point pt = new MapWinGIS.Point();

                pt.x = x;

                pt.y = y;

                MapWinGIS.Extents myExtents = (Extents)axMap.Extents;

                myExtents.SetBounds(pt.x - 0.03, pt.y - 0.03, 0, pt.x + 0.03, pt.y + 0.03, 0);

                axMap.Extents = myExtents;

                ClearspecificDrawing(_dictdrawHandels, DrawHandels.PointToHandel, -1);

                _dictdrawHandels[DrawHandels.PointToHandel] = axMap.NewDrawing(MapWinGIS.tkDrawReferenceList.dlSpatiallyReferencedList);

                axMap.AddDrawingLabel(_dictdrawHandels[DrawHandels.PointToHandel], "", 255, pt.x, pt.y, tkHJustification.hjNone);

                new System.Threading.Thread(new System.Threading.ThreadStart(ClearPoint)).Start();

            }

            catch (Exception ex)

            {

                XtraMessageBox.Show(ex.Message);

                return;

            }

        }

        //清除定位点

        private void ClearPoint()

        {

            System.Threading.Thread.Sleep(3000);

            axMap.ClearDrawing(_dictdrawHandels[DrawHandels.PointToHandel]);

        }

        //站点选择改变

        private void gvDepots_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)

        {

            object datasouse;

            if ("FK_Depots" == gc.DataMember)

            {

                datasouse = (sender as DevExpress.XtraGrid.Views.BandedGrid.BandedGridView).DataSource;

            }

            else

            {

                datasouse = (sender as DevExpress.XtraGrid.Views.Grid.GridView).DataSource;

            }

            BindingSource bs = (BindingSource)datasouse;

            if (null != bs)

            {

                if (null != bs.Current)

                {

                    DataRowView drv = (DataRowView)bs.Current;

                    _ppt.x = Convert.ToDouble(drv.Row["经度"]) / 100000;

                    _ppt.y = Convert.ToDouble(drv.Row["纬度"]) / 100000;

                    SetAllMenuItmeTags();

                    axMap_AfterTrackingLayerDraw();

                }

            }

        }

        //自动定位勾选

        private void tsChBox_CheckedChanged(object sender, EventArgs e)

        {

            if (tsChBox.Checked)

            {

                SetAllMenuItmeTags();

                axMap_AfterTrackingLayerDraw();

            }

        }

        //鼠标滚珠滚动

        private void dockPanelMap_MouseWheel(object sender, MouseEventArgs e)

        {

            if (CurState.ChgGpsDirection == _cur)

            {

                if ("FK_Depots" == gc.DataMember)

                {

                    if (!(menuItemAng.Checked))

                    {

                        return;

                    }

                    ChgDirection(gvDepots.DataSource, e, false);

                    ShowInMap(false, true, true, false, false, false);

                }

                else if ("FK_Swerve" == gc.DataMember)

                {

                    ChgDirection(gvSwerve.DataSource, e, true);

                    ShowInMap(false, false, false, true, false, false);

                }

                axMap_AfterTrackingLayerDraw();

            }

        }

        //改变GPS方位

        private void ChgDirection(object dataSource, MouseEventArgs e, bool swerve)

        {

            BindingSource bs = (BindingSource)dataSource;

            if (null != bs)

            {

                if (null != bs.Current)

                {

                    DataRowView drv = (DataRowView)bs.Current;

                    int value = (int)drv.Row["角度"];

                    if (e.Delta > 0)

                    {

                        value = value + 5 >= 360 ? 0 : value + 5;

                    }

                    else if (e.Delta < 0)

                    {

                        value = value - 5 < 0 ? 359 : value - 5;

                    }

                    drv.Row["角度"] = value;

                    menuItemAng.Tag = true;

                    if (swerve)

                    {

                        menuItemSwerve.Tag = true;

                    }

                }

            }



        }

        //清除测距点

        private void ClearMeasurePoints()

        {

            int count = _measurePoints.Count;

            for (int i = 0; i < count; i++)

            {

                _measurePoints.RemoveAt(0);

            }

            axMap.Refresh();

        }

        //导航条按钮点击

        private void gc_EmbeddedNavigator_ButtonClick(object sender, NavigatorButtonClickEventArgs e)

        {

            if (null != e.Button.Tag)

            {

                if (0 == (int)e.Button.Tag)

                {

                    axMap.MapCursor = tkCursor.crsrCross;

                    if ("FK_Swerve" == gc.DataMember)

                    {

                        _cur = CurState.AddSwerve;

                    }

                    else if ("FK_Depots" == gc.DataMember)

                    {

                        _cur = CurState.SetDepotGps;

                    }

                    else if ("FK_Speed" == gc.DataMember)

                    {

                        AddSpeedControlCustomerBtnClick();

                        axMap.CursorMode = tkCursorMode.cmNone;

                    }

                    else if ("FK_Broadcast" == gc.DataMember)

                    {

                        _cur = CurState.SetBroadcastGps;

                    }

                }

                else if (1 == (int)e.Button.Tag)

                {

                    axMap.MapCursor = tkCursor.crsrCross;

                    if ("FK_Swerve" == gc.DataMember)

                    {

                        _cur = CurState.SetSwerveGps;

                    }

                    else if ("FK_Speed" == gc.DataMember)

                    {

                        _cur = CurState.ExtendSpeedArea;

                    }

                }

                else if (2 == (int)e.Button.Tag)

                {

                    axMap.CursorMode = tkCursorMode.cmNone;

                    if ("FK_Swerve" == gc.DataMember)

                    {

                        DelSwerveControlCustomerBtnClick();

                    }

                    else if ("FK_Speed" == gc.DataMember)

                    {

                        DelSpeedControlCustomerBtnClick();

                    }

                    else if ("FK_Broadcast" == gc.DataMember)

                    {

                        DelBroadCastControlCustomerBtnClick();

                    }

                }

                else if (3 == (int)e.Button.Tag)

                {

                    if ("FK_Depots" == gc.DataMember)

                    {

                        UpDepotControlCustomerBtnClick();

                    }

                }

                else if (4 == (int)e.Button.Tag)

                {

                    if ("FK_Depots" == gc.DataMember)

                    {

                        DownDepotControlCumtomerBtnClick();

                    }

                }

                else if (5 == (int)e.Button.Tag)

                {

                    gvDepots.OptionsView.ColumnAutoWidth = !gvDepots.OptionsView.ColumnAutoWidth;

                }

            }

        }

        //改变GPS方位

        private void ChgGVGps(object datasource, MPoint pt)

        {

            BindingSource bs = (BindingSource)datasource;

            if (null == bs.Current)

            {

                return;

            }

            DataRowView drv = (DataRowView)bs.Current;

            drv.Row["经度"] = Convert.ToInt32(pt.x * 100000);

            drv.Row["纬度"] = Convert.ToInt32(pt.y * 100000);

            _ppt.x = pt.x;

            _ppt.y = pt.y;

        }

        //设置某图层的字体为ES_Font

        private void SetLayerEsFont(Shapefile sp, int spIdx, string fontName, int fontsize, Dictionary<int, int> fonts, uint color, bool isBold)

        {

            axMap.set_ShapeLayerPointType(spIdx, MapWinGIS.tkPointType.ptFontChar);

            axMap.set_UDPointFontCharFont(spIdx, fontName, fontsize, isBold, false, false);

            for (int i = 0x7B; i > 0x32; i--)

            {

                int idx = axMap.set_UDPointFontCharListAdd(spIdx, i, color);

                fonts.Add((0x7B - i) * 5, idx);

            }

            int numShapes = sp.NumShapes;

            for (int i = 0; i < numShapes; i++)

            {

                MapWinGIS.Shape sh = sp.get_Shape(i);

                MapWinGIS.Point point = sh.get_Point(0);



                int ang = ((int)point.Z / 5) * 5;

                int idx = fonts[ang];

                axMap.set_ShapePointType(spIdx, i, MapWinGIS.tkPointType.ptFontChar);

                axMap.set_ShapePointFontCharListID(spIdx, i, idx);

            }

        }

        //SetLayerEsFont重载

        private void SetLayerEsFont(Shapefile sp, int spIdx, string fontName, int fontsize, uint color, bool isBold, int val)

        {

            axMap.set_ShapeLayerPointType(spIdx, MapWinGIS.tkPointType.ptFontChar);

            axMap.set_UDPointFontCharFont(spIdx, fontName, fontsize, isBold, false, false);

            int idx = axMap.set_UDPointFontCharListAdd(spIdx, val, color);



            int numShapes = sp.NumShapes;

            for (int i = 0; i < numShapes; i++)

            {

                axMap.set_ShapePointType(spIdx, i, MapWinGIS.tkPointType.ptFontChar);

                axMap.set_ShapePointFontCharListID(spIdx, i, idx);

            }

        }

        //移除指定Layer

        private void Removelayer(ref int idx)

        {

            if (idx > 1)

            {

                axMap.RemoveLayer(idx);

                idx = -1;

            }

        }

        //ShapeFile添加标签

        private void ShapeFileAddLabel(int hndl, int field, UInt32 col)

        {

            MapWinGIS.Shapefile sf;

            MapWinGIS.Shape sh = new MapWinGIS.Shape();

            double x, y;

            string text;



            sf = (MapWinGIS.Shapefile)axMap.get_GetObject(hndl);



            for (int i = 0; i < sf.NumShapes; i++)

            {

                sh = sf.get_Shape(i);

                text = sf.get_CellValue(field, i).ToString();

                MapWinGIS.Extents ext = sf.QuickExtents(i);

                x = (ext.xMax + ext.xMin) / 2;

                y = (ext.yMax + ext.yMin) / 2;

                axMap.AddLabel(hndl, text, col, x, y, MapWinGIS.tkHJustification.hjCenter);

            }

        }

        //Depot添加一个标签

        private void AddDrawingLableDepot(int handle, string drawTxt, uint color, double x, double y, tkHJustification fication)

        {

            axMap.AddDrawingLabel(handle, drawTxt, color, x, y, fication);

            axMap.set_DrawingLabelsShadow(handle, true);

            axMap.set_DrawingLabelsShadowColor(handle, (uint)(ColorTranslator.ToOle(Color.FromArgb(0xEC, 0xF5, 0xFF))));

            axMap.set_DrawingLabelsOffset(handle, 20);

        }

        //清除指定图层的绘制

        private void ClearspecificDrawing(Dictionary<DrawHandels, int> dict, DrawHandels handel, int val)

        {

            axMap.ClearDrawing(dict[handel]);

            dict[handel] = val;

        }

        #endregion

 

你可能感兴趣的:(window)