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