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;
        }
    }
}

 

posted @ 2017-03-06 21:28  依尔根觉罗天赫  阅读(528)  评论(0)    收藏  举报