注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

快乐小屋

 
 
 

日志

 
 

利用C#+Mapx合并多个Tab格式数据到一个Tab  

2012-04-25 09:58:25|  分类: MAPGIS |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
前两天的时候,老给给了一个homework。说是拿到了一批供地的数据,每一块供地都是一个MapInfo的tab数据。而我需要完成的作业就是想一个办法去把这所有的tab图层中的数据都合并到一个图层中去。
  对于几乎没有用过MapInfo的我来说,起初对于这个问题稍微有些不知所措。不过细下心来一想,也大致有了解决的思路。无非就是新建一个Tab图层,然后循环遍历所有的供地数据,取出所有的地块,添加到新的图层中去,然后完善其相应属性即可。
  问题思考到现在,眼前就有了两种解决的办法。第一种办法,将MapInfo的Tab利用ArcToolbox中的工具转成ArcGIS的shp格式, 然后编程实现合并shp文件。由于ArcGIS用的比较多,比较熟悉,这种方法想来可以比较快速的实现。第二种方法,就是利用MapInfo提供的 Mapx二次开发组件来进行。相比较而言,第一种方法比第二种方法来的会简单一些。但是,本着锻炼自己的目的,还是选择了第二种方法。
  昨天的时候休息了一天,完全没有顾得上继续思考。从今天早上开始到现在,边查资料边编码试验,大致已经写出了可以运行的代码。老规矩,贴出来,共享之。欢迎指导交流,高手勿喷。
  开发环境是Visual Studio 2008 sp1+Mapx 5,开发语言为C#。

namespace MapXConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Map map = new Map();
            LayerInfo lyrInfo = new LayerInfoClass();
            lyrInfo.Type = LayerInfoTypeConstants.miLayerInfoTypeTab;
            lyrInfo.AddParameter("FileSpec",@"D:\all.tab");
            lyrInfo.AddParameter("NAME","all");
            lyrInfo.AddParameter("AutoCreateDataset",true);
            lyrInfo.AddParameter("datasetname","all");
            map.Layers.Add(lyrInfo, 0);
            Layer lyr = map.Layers._Item("all");
            Dataset ds = map.DataSets._Item("all");
            List<string> names = new List<string>();
            names = GetMapInfo(@"D:\03", "*.tab");
            RowValues rowValues=new RowValuesClass();
            int index = 0;
            foreach (string name in names)
            {
                LayerInfo layerInfo = new LayerInfo();
                layerInfo.Type = LayerInfoTypeConstants.miLayerInfoTypeTab;
                layerInfo.AddParameter("FileSpec", name);
                layerInfo.AddParameter("NAME", "lyr");
                //layerInfo.AddParameter("AutoCreateDataset", true);
                //layerInfo.AddParameter("datasetname", "lyr");
                map.Layers.Add(layerInfo, 1);
                Layer layer = map.Layers._Item("lyr");
                Features features = layer.AllFeatures;
                string text = "";
                foreach (Feature feature in features)
                {
                    if(feature.Type.ToString()=="miFeatureTypeText")
                        text=feature.Caption;
                }
                foreach (Feature feature in features)
                {
                    if (feature.Type.ToString() == "miFeatureTypeRegion")
                    {
                        index++;
                        Feature ftr = lyr.AddFeature(feature, rowValues);
                        lyr.KeyField = "ID";
                        ftr.KeyValue = index.ToString();
                        ftr.Update(true, rowValues);
                        lyr.KeyField = "Info";
                        ftr.KeyValue = text;
                        ftr.Update(true, rowValues);
                    }
                }
                map.Layers.Remove(1);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(layerInfo);
            }
            System.Runtime.InteropServices.Marshal.ReleaseComObject(lyrInfo);
            Console.WriteLine("OK");
            Console.ReadKey();
        }

        static List<string> GetMapInfo(string path, string pattern)
        {
            List<string> names = new List<string>();
            DirectoryInfo dInfo = new DirectoryInfo(path);
            FileInfo[] files = dInfo.GetFiles(pattern);
            foreach (FileInfo fInfo in files)
                names.Add(fInfo.FullName);
            return names;
        }
    }
}
  评论这张
 
阅读(561)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018