//********************************************************** 
//******主窗口程序 
//******************************************************** 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
namespace IRND_DPT 
{ 
    public partial class frmMain : Form 
    { 
        IRND_DPT.layerVariable pubLayerVariable = new layerVariable (); 
        public frmMain() 
        { 
            InitializeComponent(); 
        } 
        //添加图层 
        private void tlbAddLayer_Click(object sender, EventArgs e) 
        { 
            IRND_DPT.OpenFile AddFile = new OpenFile(); 
            AddFile.OpenShapeFiles(CD1,axMap1 ); 
            object refMap = (object)this.axMap1; 
            bool refTrue = true; 
            short refShort = 0; 
            axlegend1.setMapSource(ref refMap); 
            axlegend1.ShowAllLegend(); 
            axlegend1.LoadLegend(ref refTrue); 
            axlegend1.set_Active(ref refShort, true); 
            axMap1.Refresh(); 
            axlegend1.Refresh(); 
            //AddFile(CD1, axMap1); 
        } 
        //删除图层 
        private void toolStripButton4_Click(object sender, EventArgs e) 
        { 
            if (pubLayerVariable.MapLayerIndex >= 0) 
            { 
                for (int i = 0; i <= axMap1.Layers.Count - 1; i++) 
                { 
                    axMap1.Layers.Remove(pubLayerVariable.MapLayerIndex); 
                    break; 
                } 
                bool refTrue = true; 
                axMap1.Refresh(); 
                axlegend1.LoadLegend(ref refTrue); 
            } 
        } 
        private void axlegend1_AfterSetLayerVisible(object sender,AxSampleLegendControl.__legend_AfterSetLayerVisibleEvent e) 
        { 
            axMap1.Refresh();             
        } 
        private void axlegend1_LayerDblClick(object sender, AxSampleLegendControl.__legend_LayerDblClickEvent e) 
        { 
        } 
        private void axlegend1_MouseDownEvent(object sender, AxSampleLegendControl.__legend_MouseDownEvent e) 
        { 
            if (e.index >= 0) 
            { 
                MapObjects2.MapLayer layer= (MapObjects2.MapLayer )axMap1.Layers.Item(e.index ); 
                pubLayerVariable.MapLayerName = layer.Name; 
                pubLayerVariable.MapLayerIndex = e.index;                 
            } 
            axMap1.TrackingLayer.Refresh(true, axMap1.Extent); 
        } 
        //放大 
        private void tlb_ZoomIn_Click(object sender, EventArgs e) 
        { 
            axMap1.MousePointer = MapObjects2.MousePointerConstants.moZoomIn; 
        } 
        //缩小 
        private void tlb_ZoomOut_Click(object sender, EventArgs e) 
        { 
            axMap1.MousePointer = MapObjects2.MousePointerConstants.moZoomOut; 
        } 
        //漫游 
        private void tlb_Pan_Click(object sender, EventArgs e) 
        { 
            axMap1.MousePointer = MapObjects2.MousePointerConstants.moPan; 
        } 
        //全图 
        private void tbl_Full_Click(object sender, EventArgs e) 
        { 
            axMap1.Extent = axMap1.FullExtent; 
            axMap1.MousePointer = MapObjects2.MousePointerConstants.moArrow; 
        } 
        //逐渐放大 
        private void tbl_SmallIn_Click(object sender, EventArgs e) 
        { 
            MapObjects2.Rectangle r = axMap1.Extent; 
            r.ScaleRectangle(0.9); 
            axMap1.Extent = r; 
        } 
        //逐渐缩小 
        private void tbl_SmallOut_Click(object sender, EventArgs e) 
        { 
            MapObjects2.Rectangle r = axMap1.Extent; 
            r.ScaleRectangle(1.1); 
            axMap1.Extent = r; 
        } 
        //选择查询 
        private void tbl_Identify_Click(object sender, EventArgs e) 
        { 
            axMap1.MousePointer = MapObjects2.MousePointerConstants.moIdentify; 
        } 
        //属性浏览 
        private void toolStripButton2_Click(object sender, EventArgs e) 
        { 
            if (pubLayerVariable.MapLayerIndex >= 0 & pubLayerVariable.MapLayerName != null) 
            { 
                MapObjects2.MapLayer lyr = (MapObjects2.MapLayer )axMap1.Layers.Item(pubLayerVariable.MapLayerName); 
                IRND_DPT.frmBrowseAttr frmBrowset = new frmBrowseAttr();                 
                frmBrowset.IniListview(lyr); 
                frmBrowset.ShowDialog(this);  
            } 
        } 
        //地图响应事件 
        private void axMap1_MouseDownEvent(object sends, AxMapObjects2._DMapEvents_MouseDownEvent e) 
        { 
            MapObjects2.Rectangle rect; 
            MapObjects2.Point curp; 
            MapObjects2.MapLayer lyr; 
            MapObjects2.Recordset rest; 
            switch (axMap1.MousePointer) 
            { 
                //放大                     
                case MapObjects2.MousePointerConstants.moZoomIn: 
                {                     
                    rect = axMap1.TrackRectangle(); 
                    if (rect.Width == 0 || rect.Height == 0) 
                    { 
                        rect = axMap1.Extent; 
                        rect.ScaleRectangle(0.5); 
                    } 
                    axMap1.Extent = rect; 
                    break; 
                } 
                //缩小 
                case MapObjects2.MousePointerConstants.moZoomOut: 
                { 
                    MapObjects2.Rectangle Tempr; 
                    Tempr = axMap1.Extent; 
                    rect = axMap1.TrackRectangle(); 
                    double NewSR; 
                    if (rect.Width != 0 || rect.Height != 0) 
                    { 
                        if (axMap1.Extent.Width / rect.Width  > axMap1.Extent.Height / rect.Height) 
                        { 
                            NewSR = axMap1.Extent.Height / rect.Height; 
                        } 
                        else 
                        { 
                            NewSR = axMap1.Extent.Width / rect.Width; 
                        } 
                        Tempr.ScaleRectangle(NewSR); 
                    } 
                    else  
                    { 
                        Tempr.ScaleRectangle(2.0); 
                    } 
                    axMap1.Extent = Tempr; 
                    break; 
                } 
                //漫游 
                case MapObjects2.MousePointerConstants.moPan: 
                { 
                    axMap1.Pan(); 
                    break; 
                } 
                //选择查询 
            case MapObjects2.MousePointerConstants.moIdentify: 
                { 
                    if (pubLayerVariable.MapLayerIndex >= 0 && pubLayerVariable.MapLayerName != "") 
                    { 
                        rect = axMap1.TrackRectangle(); 
                        lyr = (MapObjects2.MapLayer)axMap1.Layers.Item(pubLayerVariable.MapLayerIndex); 
                        if (rect.Width == 0) 
                        { 
                            curp = axMap1.ToMapPoint(e.x, e.y); 
                            rest = lyr.SearchByDistance(curp, (double)axMap1.ToMapDistance((float)Screen.PrimaryScreen.WorkingArea.X * 5), ""); 
                        } 
                        else 
                        { 
                            rest = lyr.SearchShape(rect, MapObjects2.SearchMethodConstants.moAreaIntersect, ""); 
                        } 
                        if (rest.EOF!=true) 
                        { 
                            axMap1.FlashShape(rest.Fields.Item("shape").Value, 2); 
                            IRND_DPT.frmIdentify FunctionClass = new frmIdentify(); 
                            ////FunctionClass.Close();   
                            FunctionClass.CurRecordSet(rest); 
                            FunctionClass.IniTvFeat(rest, lyr.Name); 
                            FunctionClass.IniLvwAttr(rest); 
                            FunctionClass.Show(this); 
                        } 
                    } 
                    break; 
                } 
            } 
        } 
        //////// 
        /////////////////////////////////////////////////////////////////////////////////////////////// 
    } 
} 
//************************************************* 
//********属性查询 
//************************************************ 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
namespace IRND_DPT 
{ 
    public partial class frmIdentify : Form 
    { 
        MapObjects2.Recordset mrs;         
        public frmIdentify() 
        { 
            InitializeComponent(); 
        } 
        private void frmIdentify_Load(object sender, System.EventArgs e) 
        { 
            lvwAttr.View = View.Details;  
            lvwAttr.Columns.Add("字段",50,HorizontalAlignment.Left ); 
            lvwAttr.Columns.Add ("值",50,HorizontalAlignment.Center ); 
        } 
        // 
        private void tvFeat_NodeMouseClick(object sender, System.Windows.Forms.TreeNodeMouseClickEventArgs e) 
        { 
            string ID; 
            ListViewItem Item; 
            //if (e.Node.Parent == null) { return; } 
            lvwAttr.Items.Clear(); 
            ID = e.Node.Text; 
            mrs.MoveFirst(); 
            while (mrs.EOF != true) 
            { 
                if (ID == mrs.Fields.Item("FeatureID").ValueAsString) 
                { 
                    for (short fld = 1; fld < mrs.TableDesc.FieldCount; fld++) 
                    {                         
                        Item = lvwAttr.Items.Add(mrs.TableDesc.get_FieldName(fld)); 
                        Item.SubItems.Add(mrs.Fields.Item(Item.Text).ValueAsString); 
                    } 
                    lvwAttr.Refresh();    
                    break; 
                } 
                mrs.MoveNext(); 
            }      
        } 
        public void CurRecordSet(MapObjects2.Recordset vNewValue) 
        { 
            mrs = vNewValue; 
        } 
        public void IniLvwAttr(MapObjects2.Recordset rst) 
        { 
            TreeNode n=null ; 
            ListViewItem Item; 
            string ID; 
            lvwAttr.Items.Clear(); 
            if (tvFeat.Nodes.Count >= 2) 
            { 
                int i = 0; 
                foreach (TreeNode tn in tvFeat.Nodes) 
                {                     
                    i=i+1; 
                    if (i == 2)  
                    {  
                        n = tn; 
                        break; 
                    } 
                }               
                if (n.Text != null) 
                { 
                    rst.MoveFirst();                     
                    ID = rst.Fields.Item("FeatureID").ValueAsString;                     
                    while (rst.EOF != true) 
                    { 
                        if (ID == n.Text) 
                        { 
                            for (short fld = 1; fld < rst.TableDesc.FieldCount; fld++) 
                            { 
                                Item = lvwAttr.Items.Add(rst.TableDesc.get_FieldName(fld)); 
                                Item.SubItems.Add(rst.Fields.Item(Item.Text).ValueAsString); 
                            } 
                            lvwAttr.Refresh(); 
                            break; 
                        } 
                    } 
                } 
            } 
        } 
        //将选择的记录集加入到树型控件中进行显示 
        public void IniTvFeat(MapObjects2.Recordset moRs_in, string lyrName_in) 
        { 
            TreeNode n;             
            string ID; 
            if (moRs_in.EOF != true) 
            { 
                moRs_in.MoveFirst(); 
                tvFeat.Nodes.Clear(); 
                n = tvFeat.Nodes.Add(lyrName_in); 
                n=n.Parent; 
                while (moRs_in.EOF != true) 
                {              
                    ID = moRs_in.Fields.Item("FeatureID").ValueAsString;                     
                    n= tvFeat.Nodes.Add(ID); 
                    moRs_in.MoveNext();  
                }                   
            } 
        } 
        ///////zuihou//////////////////////////////////////////////////////////////////////////// 
    } 
} 
//************************************************************* 
//************加载图层函数 
//************************************************************* 
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 
namespace IRND_DPT 
{ 
    class OpenFile 
    {    
        //功能说明: 
        //    从公共对话框中提取文件名,然后调用不同的子模块处理不同的文件加入图层的问题(支持打开多个文件) 
        public void  OpenShapeFiles(OpenFileDialog comopenfile,AxMapObjects2.AxMap map) 
        { 
            try 
            { 
                string strShape, strCov, strCAD, strVPF, strImage, strMilImage; 
                //将过滤器设置为可支持的文件 
                strShape = "ESRI ShapeFiles(*.shp)|*.shp"; 
                strCov = "ESRI Coverages(*.adf,*.tat,*.pat,*.rat)|aat.adf;pat.adf;nat.adf;txt.adf;*.tat;*.pat;*.rat"; 
                strCAD = "AutoCAD File (*.dwg,*.dxf)|*.dwg;*.dxf"; 
                strImage ="All Image(*.bmp,*.dib,*.tif,*.jpg,*.jff,*.bil,*.bip,*.bsq,*.gis,*.lan,*.rlc,*.sid,*.sun,*.rs,*.ras,*.svf,*.img,*.gif)|*.bmp,*.dib,*.tif,*.jpg,*.jff,*.bil,*.bip,*.bsq,*.gis,*.lan,*.rlc,*.sid,*.sun,*.rs,*.ras,*.svf,*.img,*.gif"; 
                comopenfile.CheckFileExists = true; 
                //设置过滤 
                comopenfile.Filter = strShape + "|" + strCov + "|" + strCAD + "|" + strImage ; 
                comopenfile.Title = "添加图层"; 
                //允许选择多个文件,并允许长文件名 
                comopenfile.Multiselect = true; 
                if (comopenfile.ShowDialog() == DialogResult.OK) 
                { 
                    foreach (string strFilename in comopenfile.FileNames) 
                    { 
                        string sPath = strFilename.Substring(0, strFilename.LastIndexOf("//") + 1); 
                        string sFile = strFilename.Substring(strFilename.LastIndexOf("//") + 1, strFilename.Length - strFilename.LastIndexOf("//") - 1); 
                        string nametype = sFile.Substring(sFile.LastIndexOf(".") + 1, sFile.Length - sFile.LastIndexOf(".") - 1); 
                        open_file(sPath, sFile, nametype, map); 
                    } 
                } 
            } 
            catch 
            { 
                MessageBox.Show("图层添加有错!"); 
            }          
        } 
        //功能说明: 
        //    测试文件类型,一便调用不同的子模块.处理不同图层加入的问题 
        private void open_file(string Path,string filename,string filetype,AxMapObjects2.AxMap mapobject) 
        { 
            string LayerName = filename.Substring(0, filename.LastIndexOf(".")); 
            switch (filetype) 
            { 
                case "shp": 
                    shpAdd(Path, filename, mapobject, LayerName, true); 
                    break; 
            } 
        } 
        //功能说明: 
        //添加shape格式的文件 
        public void   shpAdd(string databasepath, string filename,AxMapObjects2.AxMap mapobject, string LayerName, bool Hide) 
        {  
            MapObjects2.DataConnection dCon=new MapObjects2.DataConnection() ; 
           // MapObjects2.GeoDataset gSet=new MapObjects2.GeoDataset (); 
            MapObjects2.MapLayer newLayer = new MapObjects2.MapLayer();      
            long i=0; 
            try 
            { 
                dCon.Database = databasepath; 
                if (dCon.Connect()) 
                { 
                    MapObjects2.GeoDataset gSet = dCon.FindGeoDataset(filename); 
                    if (gSet == null) 
                    { 
                        return ; 
                    } 
                    else 
                    {  
                        //查看当前是否有重复的图层名,以确保所有的图层名都是唯一的 
                        if (FindMapLayerName(mapobject,LayerName)==true ) 
                        { 
                            string tempstr = LayerName; 
                            while (FindMapLayerName(mapobject, tempstr + "-" + i)==true ) 
                            { 
                                i++; 
                            } 
                            LayerName = LayerName + "-" + i; 
                        } 
                        newLayer.GeoDataset = gSet; 
                        if (Hide) 
                        { 
                            newLayer.Visible = true; 
                        } 
                        else 
                        { 
                            newLayer.Visible = false;  
                        } 
                        //使用默认颜色和样式设置图层 
                        switch (newLayer.shapeType) 
                        {  
                            case MapObjects2.ShapeTypeConstants.moShapeTypePoint : 
                                newLayer.Symbol.Color=11513775; 
                                newLayer.Symbol.Size=5; 
                                break; 
                            case MapObjects2.ShapeTypeConstants .moShapeTypeLine : 
                                newLayer.Symbol.Color = 11513775; 
                                newLayer.Symbol.Size = 1; 
                                break; 
                            case MapObjects2.ShapeTypeConstants.moShapeTypePolygon : 
                                newLayer.Symbol.SymbolType = 0; 
                                newLayer.Symbol.Style = 8; 
                                newLayer.Symbol.Color = 12566463; 
                                newLayer.Symbol.Outline = true; 
                                newLayer.Symbol.OutlineColor = (int)MapObjects2.ColorConstants.moBlack; 
                                break; 
                        } 
                        mapobject.Layers.Add (newLayer); 
                        newLayer.Name = LayerName; 
                        newLayer.Tag=databasepath + filename ;                         
                    } 
                } 
            } 
            catch 
            {  
               // MessageBox("加载图层出错!"); 
            } 
        } 
        //功能说明: 
        //    查找map中的图层AxMapObjects2.AxMap mapobject,string LayerName  
        public bool FindMapLayerName(AxMapObjects2.AxMap mapobject, string LayerName) 
        {     
            for (int i=0;i<mapobject.Layers.Count ;i++) 
            { 
                if (mapobject.Layers.Item(i).ToString() ==LayerName ) 
                { 
                    return true; 
                } 
            }      
           return false ; 
        } 
    } 
}