• TerraGate SFS 4.5 版本 发布矢量数据使用的Cache数据如何再返回成shapefile文件


    TerraGate SFS 4.5 版本 发布矢量数据使用的Cache数据如何再返回成shapefile文件?

    两年前帮一个朋友解决过这个问题:

    如果原来用4.5版本的时候,在网络环境下,为了提升调用服务器上发布的矢量数据的效率,对一些矢量shapefile格式的数据做了矢量切片,

    而后来又弄丢了切片前的原始shapefile数据,当再需要那些原始的shapefile数据的时候,这该怎么办呢?

    前几天整理电脑里的资料,刚好看到了这个,就把代码贴出来,分享给大家吧,也许对一些老朋友有用。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Xml;
    using TerraExplorerX;
    
    namespace CacheToSHP
    {
        public partial class FrmMain : Form
        {
            public SGWorld65 sgworld = null;
            IFeatureLayer65 pIFeatureLayer65 = null;
            int ixmlc = 0;
    
            public FrmMain()
            {
                InitializeComponent();
    
                sgworld = new SGWorld65();
            }
    
            private void btnSelectPath_Click(object sender, EventArgs e)
            {
                this.folderBrowserDialog1.ShowDialog();
                this.txtCachePath.Text = this.folderBrowserDialog1.SelectedPath;
                this.txtLayerName.Text = "";
                this.txtOutPath.Text = "";
                this.lblTips.Text = "";
                ixmlc = 0;
                //清楚dataGridView1项
                if (this.dataGridView1.Rows.Count > 0)
                {
                    this.dataGridView1.DataSource = null;
                }
            }
    
            private void btnOK_Click(object sender, EventArgs e)
            {                            
                    //清除dataGridView1项
                    if (this.dataGridView1.Rows.Count > 0)
                    {
                        this.dataGridView1.DataSource = null;
                    }
                    ixmlc = 0;
                    this.txtOutPath.Text = "";
                    this.lblTips.Text = "";
                    this.txtLayerName.Text = GetLayerName(this.txtCachePath.Text);
                    this.txtCacheType.Text = GetLayerType(this.txtCachePath.Text + "\" + this.txtLayerName.Text + ".layer");
                    FindFile(GetFSubPath(this.txtCachePath.Text));
                    MessageBox.Show("Cache读取完成!");
            }
    
            // 获取Cache图层类型 赵贺 2015.02.14.
            private String GetLayerType(string dirPathName)
            {
                string sLayerType = null;
                FileStream fs = File.Open(dirPathName, FileMode.Open);
                StreamReader sr = new StreamReader(fs);
                string res = sr.ReadToEnd();
                
                XmlDocument xml = new XmlDocument();
                xml.LoadXml(res);
                XmlElement root = xml.DocumentElement;
                XmlNodeList childlist = root.ChildNodes;
                sLayerType = childlist[1].ChildNodes[13].InnerText;
                return sLayerType;
            }
    
            // 获取Cache图层名称 赵贺 2015.02.14.
            private String GetLayerName(string dirPath)
            {
                string sLayerName = null;
                DirectoryInfo Dir = new DirectoryInfo(dirPath);
                foreach (FileInfo f in Dir.GetFiles("*.layer")) //查找文件
                {
                    sLayerName = f.ToString().Substring(0,f.ToString().IndexOf('.'));
                }
                return sLayerName;
            }
    
            // 获取当前文件夹的第一个子文件夹
            private String GetFSubPath(string dirPath)
            {
                DirectoryInfo Dir = new DirectoryInfo(dirPath);
                DirectoryInfo[] d = Dir.GetDirectories();
                return dirPath + "\" + d[0].ToString();
            }
    
            //解析XML内容,获取属性字段信息 赵贺 2015.02.14.
            private void GetXMLData(string xmlpath)
            {
                try
                {
                    FileStream fs = File.Open(xmlpath, FileMode.Open);
                    StreamReader sr = new StreamReader(fs);
                    string res = sr.ReadToEnd();
                    res = res.Substring(res.IndexOf("<wfs"), res.Length - res.IndexOf("<wfs"));//去除XML的无效内容
    
                    XmlDocument xml = new XmlDocument();
                    xml.LoadXml(res);
                    XmlElement root = xml.DocumentElement;
                    XmlNodeList childlist = root.ChildNodes;
                    if (ixmlc == 0)// 根据第一个xml的内容读取shp属性字段名称
                    {
                        if (this.dataGridView1.Columns.Count > 0)
                        {
                            this.dataGridView1.Columns.Clear();
                        }
                        this.dataGridView1.Columns.Add(childlist[0].Attributes[0].Name, childlist[0].Attributes[0].Name);
                        for (int j = 0; j < childlist[0].ChildNodes[0].ChildNodes.Count; j++)
                        {
                            this.dataGridView1.Columns.Add(childlist[0].ChildNodes[0].ChildNodes[j].Name, childlist[0].ChildNodes[0].ChildNodes[j].Name);
                        }
                        ixmlc = ixmlc + 1;
                    }
    
                    for (int i = 0; i < childlist.Count; i++)
                    {
                        XmlNode node = childlist[i];
                        string[] rowtext = new string[node.ChildNodes[0].ChildNodes.Count + 1];
                        rowtext[0] = childlist[i].Attributes[0].Value;//取第一项FID
                        for (int j = 0; j < node.ChildNodes[0].ChildNodes.Count; j++)
                        {
                            rowtext[j + 1] = node.ChildNodes[0].ChildNodes[j].InnerText;
                        }
                        //this.dataGridView1.Rows.Add(rowtext);
                        //去除FID重复项
                        if (dataGridView1.DataSource == null)
                        {
                            DataGridViewRow row = dataGridView1.Rows.Cast<DataGridViewRow>()
                                .FirstOrDefault(r => r.Cells[0].EditedFormattedValue.Equals(rowtext[0]));
                            if (row != null) dataGridView1.Rows.Remove(row);
                            this.dataGridView1.Rows.Add(rowtext);
                        }
                        else
                        {
                            DataTable dt = (DataTable)dataGridView1.DataSource;
                            DataRow row = dt.Rows.Cast<DataRow>()
                                .FirstOrDefault(r => r[0].Equals(rowtext[0]));
                            if (row != null) dt.Rows.Remove(row);
                            this.dataGridView1.Rows.Add(rowtext);
                        }
                    }
    
                    xml = null;
                }
                catch (Exception ex)
                { 
                    
                }
            }
    
            //遍历指定目录下的XML文件
            public void FindFile(string dirPath) //参数dirPath为指定的目录
            { 
                //在指定目录及子目录下查找文件,在listBox1中列出子目录及文件
                DirectoryInfo Dir=new DirectoryInfo(dirPath);
                try
                {
                    foreach(DirectoryInfo d in Dir.GetDirectories())//查找子目录 
                    {
                        FindFile(Dir + "\" + d.ToString());                    
                    }
                    foreach(FileInfo f in Dir.GetFiles("*.xml")) //查找文件
                    {                    
                        GetXMLData(Dir + "\"+f.ToString());
                    }                
                }
                catch(Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
    
            private void btnExportSHP_Click(object sender, EventArgs e)
            {
                try
                {
                    this.lblTips.Text = "正在输出....";
                    if (this.dataGridView1.Rows.Count > 0)
                    {
                        if (this.txtCacheType.Text == "Point")
                        {
                            pIFeatureLayer65 = sgworld.Creator.CreateNewFeatureLayer(this.txtLayerName.Text, LayerGeometryType.LGT_POINT, "FileName=" + this.txtLayerName.Text + ".shp;TEPlugName=OGR;", "");
                        }
                        else if (this.txtCacheType.Text == "Line")
                        {
                            pIFeatureLayer65 = sgworld.Creator.CreateNewFeatureLayer(this.txtLayerName.Text, LayerGeometryType.LGT_POLYLINE, "FileName=" + this.txtLayerName.Text + ".shp;TEPlugName=OGR;", "");
                        }
                        else if (this.txtCacheType.Text == "Polygon")
                        {
                            pIFeatureLayer65 = sgworld.Creator.CreateNewFeatureLayer(this.txtLayerName.Text, LayerGeometryType.LGT_POLYGON, "FileName=" + this.txtLayerName.Text + ".shp;TEPlugName=OGR;", "");
                        }
                        //pIFeatureLayer65.DataSourceInfo.Attributes.CreateAttribute("Yaw", AttributeTypeCode.AT_DOUBLE, 0, 20);
                        //pIFeatureLayer65.DataSourceInfo.Attributes.CreateAttribute("Pitch", AttributeTypeCode.AT_DOUBLE, 0, 20);
                        //pIFeatureLayer65.DataSourceInfo.Attributes.CreateAttribute("Roll", AttributeTypeCode.AT_DOUBLE, 0, 20);
                        //pIFeatureLayer65.DataSourceInfo.Attributes.CreateAttribute("Texture", AttributeTypeCode.AT_TEXT, 1024, 20);
                        //pIFeatureLayer65.DataSourceInfo.Attributes.CreateAttribute("Radius", AttributeTypeCode.AT_DOUBLE, 0, 20);
                        //pIFeatureLayer65.DataSourceInfo.Attributes.CreateAttribute("Length", AttributeTypeCode.AT_DOUBLE, 0, 20);
                        for (int i = 1; i < this.dataGridView1.Columns.Count - 1; i++)
                        {
                            pIFeatureLayer65.DataSourceInfo.Attributes.CreateAttribute(this.dataGridView1.Columns[i].Name, AttributeTypeCode.AT_TEXT, 1024, 20);
                        }
    
                        for (int i = 0; i < this.dataGridView1.Rows.Count - 1; i++)
                        {
                            string rowtext = "";
                            for (int j = 1; j < this.dataGridView1.Columns.Count - 2; j++)
                            {
                                rowtext = rowtext + this.dataGridView1.Rows[i].Cells[j].Value.ToString() + ";";
                            }
                            rowtext = rowtext + this.dataGridView1.Rows[i].Cells[this.dataGridView1.Columns.Count - 2].Value.ToString();
                            if (this.txtCacheType.Text == "Point")
                            {
                                string x = this.dataGridView1.Rows[i].Cells[this.dataGridView1.Columns.Count - 1].Value.ToString().Split(',')[0];
                                string y = this.dataGridView1.Rows[i].Cells[this.dataGridView1.Columns.Count - 1].Value.ToString().Split(',')[1];
                                IGeometry pIGeometry = sgworld.Creator.GeometryCreator.CreatePointGeometry("Point(" + x + " " + y + ")");
                                pIFeatureLayer65.FeatureGroups.Point.CreateFeature(pIGeometry, rowtext);
                            }
                            else if (this.txtCacheType.Text == "Line")
                            {
                                IGeometry pIGeometry = sgworld.Creator.GeometryCreator.CreateGeometryFromWKT("LineString (" + this.dataGridView1.Rows[i].Cells[this.dataGridView1.Columns.Count - 1].Value.ToString().Replace(" ", ";").Replace(",", " ").Replace(";", ",") + ")");
                                pIFeatureLayer65.FeatureGroups.Polyline.CreateFeature(pIGeometry, rowtext);
                            }
                            else if (this.txtCacheType.Text == "Polygon")
                            {
                                string p1 = this.dataGridView1.Rows[i].Cells[this.dataGridView1.Columns.Count - 1].Value.ToString().Replace(" ", ";").Replace(",", " ").Replace(";", ",").Substring(0,this.dataGridView1.Rows[i].Cells[this.dataGridView1.Columns.Count - 1].Value.ToString().Replace(" ", ";").Replace(",", " ").Replace(";", ",").IndexOf(","));
                                string s = this.dataGridView1.Rows[i].Cells[this.dataGridView1.Columns.Count - 1].Value.ToString().Replace(" ", ";").Replace(",", " ").Replace(";", ",")+","+p1;
                                IGeometry pIGeometry = sgworld.Creator.GeometryCreator.CreateGeometryFromWKT("Polygon((" + this.dataGridView1.Rows[i].Cells[this.dataGridView1.Columns.Count - 1].Value.ToString().Replace(" ", ";").Replace(",", " ").Replace(";", ",") + "," + p1 + "))");
                                pIFeatureLayer65.FeatureGroups.Polygon.CreateFeature(pIGeometry, rowtext);
                            }
                            else
                            { }
                        }
                    }
                    if (pIFeatureLayer65 != null)
                    {
                        pIFeatureLayer65.Save();
                        
                        pIFeatureLayer65.Reproject = false;// 是否重投影 赵贺 2015.02.14
                        pIFeatureLayer65.CoordinateSystem.WellKnownText = "PROJCS["Beijing 1954 / 3-degree Gauss-Kruger Zone 37N",GEOGCS["Beijing 1954",DATUM["Beijing_1954",SPHEROID["Krassowsky 1940",6378245,298.3,AUTHORITY["EPSG","7024"]],TOWGS84[15.8,-154.4,-82.3,0,0,0,0],AUTHORITY["EPSG","6214"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4214"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",111],PARAMETER["scale_factor",1],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",NORTH],AXIS["Y",EAST],AUTHORITY["EPSG","2434"]]";
                        pIFeatureLayer65.Load();
                        pIFeatureLayer65 = null;
                    }
                    this.txtOutPath.Text = "" + sgworld.Application.DataPath + "\FeatureLayers";
                    this.lblTips.Text = "完成.";
                                    
                    pIFeatureLayer65 = null;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
    
            private void btnSOutPath_Click(object sender, EventArgs e)
            {
                this.folderBrowserDialog1.ShowDialog();
                this.txtOutPath.Text = this.folderBrowserDialog1.SelectedPath;
            }
        }
    }
  • 相关阅读:
    hash算法
    TCP/IP四层与OSI七层模型
    di
    VSCode安装程序——java开发
    java中的多线程
    C#ThreadPool类—多线程
    学习-思考
    DataTable通过Select进行过滤
    javascript遍历对象属性
    WebClient 与HttpClient 的区别
  • 原文地址:https://www.cnblogs.com/yitianhe/p/6512074.html
Copyright © 2020-2023  润新知