FeatureDataSet.cs
上传用户:sex100000
上传日期:2013-11-09
资源大小:1377k
文件大小:14k
源码类别:

GIS编程

开发平台:

C#

  1. // Copyright 2005, 2006 - Morten Nielsen (www.iter.dk)
  2. //
  3. // This file is part of SharpMap.
  4. // SharpMap is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. // 
  9. // SharpMap is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU Lesser General Public License for more details.
  13. // You should have received a copy of the GNU Lesser General Public License
  14. // along with SharpMap; if not, write to the Free Software
  15. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  16. using System;
  17. using System.Data;
  18. using System.Xml;
  19. using System.Runtime.Serialization;
  20. namespace SharpMap.Data
  21. {
  22. /// <summary>
  23. /// Represents an in-memory cache of spatial data. The FeatureDataSet is an extension of System.Data.DataSet
  24. /// </summary>
  25. [Serializable()]
  26. public class FeatureDataSet : DataSet
  27. {
  28. /// <summary>
  29. /// Initializes a new instance of the FeatureDataSet class.
  30. /// </summary>
  31. public FeatureDataSet()
  32. {
  33. this.InitClass();
  34. System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
  35. //this.Tables.CollectionChanged += schemaChangedHandler;
  36. this.Relations.CollectionChanged += schemaChangedHandler;
  37. this.InitClass();
  38. }
  39. /// <summary>
  40. /// nitializes a new instance of the FeatureDataSet class.
  41. /// </summary>
  42. /// <param name="info">serialization info</param>
  43. /// <param name="context">streaming context</param>
  44. protected FeatureDataSet(SerializationInfo info, StreamingContext context)
  45. {
  46. string strSchema = ((string)(info.GetValue("XmlSchema", typeof(string))));
  47. if ((strSchema != null))
  48. {
  49. DataSet ds = new DataSet();
  50. ds.ReadXmlSchema(new XmlTextReader(new System.IO.StringReader(strSchema)));
  51. if ((ds.Tables["FeatureTable"] != null))
  52. {
  53. this.Tables.Add(new FeatureDataTable(ds.Tables["FeatureTable"]));
  54. }
  55. this.DataSetName = ds.DataSetName;
  56. this.Prefix = ds.Prefix;
  57. this.Namespace = ds.Namespace;
  58. this.Locale = ds.Locale;
  59. this.CaseSensitive = ds.CaseSensitive;
  60. this.EnforceConstraints = ds.EnforceConstraints;
  61. this.Merge(ds, false, System.Data.MissingSchemaAction.Add);
  62. }
  63. else
  64. {
  65. this.InitClass();
  66. }
  67. this.GetSerializationData(info, context);
  68. System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
  69. //this.Tables.CollectionChanged += schemaChangedHandler;
  70. this.Relations.CollectionChanged += schemaChangedHandler;
  71. }
  72. private FeatureTableCollection _FeatureTables;
  73. /// <summary>
  74. /// Gets the collection of tables contained in the FeatureDataSet
  75. /// </summary>
  76. public new FeatureTableCollection Tables
  77. {
  78. get
  79. {
  80. return _FeatureTables;
  81. }
  82. }
  83. /// <summary>
  84. /// Copies the structure of the FeatureDataSet, including all FeatureDataTable schemas, relations, and constraints. Does not copy any data. 
  85. /// </summary>
  86. /// <returns></returns>
  87. public new FeatureDataSet Clone()
  88. {
  89. FeatureDataSet cln = ((FeatureDataSet)(base.Clone()));
  90. return cln;
  91. }
  92. /// <summary>
  93. /// Gets a value indicating whether Tables property should be persisted.
  94. /// </summary>
  95. /// <returns></returns>
  96. protected override bool ShouldSerializeTables()
  97. {
  98. return false;
  99. }
  100. /// <summary>
  101. /// Gets a value indicating whether Relations property should be persisted.
  102. /// </summary>
  103. /// <returns></returns>
  104. protected override bool ShouldSerializeRelations()
  105. {
  106. return false;
  107. }
  108. /// <summary>
  109. /// 
  110. /// </summary>
  111. /// <param name="reader"></param>
  112. protected override void ReadXmlSerializable(XmlReader reader)
  113. {
  114. this.Reset();
  115. DataSet ds = new DataSet();
  116. ds.ReadXml(reader);
  117. //if ((ds.Tables["FeatureTable"] != null))
  118. //{
  119. //    this.Tables.Add(new FeatureDataTable(ds.Tables["FeatureTable"]));
  120. //}
  121. this.DataSetName = ds.DataSetName;
  122. this.Prefix = ds.Prefix;
  123. this.Namespace = ds.Namespace;
  124. this.Locale = ds.Locale;
  125. this.CaseSensitive = ds.CaseSensitive;
  126. this.EnforceConstraints = ds.EnforceConstraints;
  127. this.Merge(ds, false, System.Data.MissingSchemaAction.Add);
  128. }
  129. /// <summary>
  130. /// 
  131. /// </summary>
  132. /// <returns></returns>
  133. protected override System.Xml.Schema.XmlSchema GetSchemaSerializable()
  134. {
  135. System.IO.MemoryStream stream = new System.IO.MemoryStream();
  136. this.WriteXmlSchema(new XmlTextWriter(stream, null));
  137. stream.Position = 0;
  138. return System.Xml.Schema.XmlSchema.Read(new XmlTextReader(stream), null);
  139. }
  140. private void InitClass()
  141. {
  142. _FeatureTables = new FeatureTableCollection();
  143. //this.DataSetName = "FeatureDataSet";
  144. this.Prefix = "";
  145. this.Namespace = "http://tempuri.org/FeatureDataSet.xsd";
  146. this.Locale = new System.Globalization.CultureInfo("en-US");
  147. this.CaseSensitive = false;
  148. this.EnforceConstraints = true;
  149. }
  150. private bool ShouldSerializeFeatureTable()
  151. {
  152. return false;
  153. }
  154. private void SchemaChanged(object sender, System.ComponentModel.CollectionChangeEventArgs e)
  155. {
  156. if ((e.Action == System.ComponentModel.CollectionChangeAction.Remove))
  157. {
  158. //this.InitVars();
  159. }
  160. }
  161. }
  162. /// <summary>
  163. /// Represents the method that will handle the RowChanging, RowChanged, RowDeleting, and RowDeleted events of a FeatureDataTable. 
  164. /// </summary>
  165. /// <param name="sender"></param>
  166. /// <param name="e"></param>
  167. public delegate void FeatureDataRowChangeEventHandler(object sender, FeatureDataRowChangeEventArgs e);
  168. /// <summary>
  169. /// Represents one feature table of in-memory spatial data. 
  170. /// </summary>
  171. [System.Diagnostics.DebuggerStepThrough()]
  172. [Serializable()]
  173. public class FeatureDataTable : DataTable, System.Collections.IEnumerable
  174. {
  175. /// <summary>
  176. /// Initializes a new instance of the FeatureDataTable class with no arguments.
  177. /// </summary>
  178. public FeatureDataTable() : base()
  179. {
  180. this.InitClass();
  181. }
  182. /// <summary>
  183. /// Intitalizes a new instance of the FeatureDataTable class with the specified table name.
  184. /// </summary>
  185. /// <param name="table"></param>
  186. public FeatureDataTable(DataTable table)
  187. : base(table.TableName)
  188. {
  189. if ((table.CaseSensitive != table.DataSet.CaseSensitive))
  190. {
  191. this.CaseSensitive = table.CaseSensitive;
  192. }
  193. if ((table.Locale.ToString() != table.DataSet.Locale.ToString()))
  194. {
  195. this.Locale = table.Locale;
  196. }
  197. if ((table.Namespace != table.DataSet.Namespace))
  198. {
  199. this.Namespace = table.Namespace;
  200. }
  201. this.Prefix = table.Prefix;
  202. this.MinimumCapacity = table.MinimumCapacity;
  203. this.DisplayExpression = table.DisplayExpression;
  204. }
  205. /// <summary>
  206. /// Gets the number of rows in the table
  207. /// </summary>
  208. [System.ComponentModel.Browsable(false)]
  209. public int Count
  210. {
  211. get
  212. {
  213. return base.Rows.Count;
  214. }
  215. }
  216. /// <summary>
  217. /// Gets the feature data row at the specified index
  218. /// </summary>
  219. /// <param name="index">row index</param>
  220. /// <returns>FeatureDataRow</returns>
  221. public FeatureDataRow this[int index]
  222. {
  223. get
  224. {
  225. return (FeatureDataRow)base.Rows[index];
  226. }
  227. }
  228. /// <summary>
  229. /// Occurs after a FeatureDataRow has been changed successfully. 
  230. /// </summary>
  231. public event FeatureDataRowChangeEventHandler FeatureDataRowChanged;
  232. /// <summary>
  233. /// Occurs when a FeatureDataRow is changing. 
  234. /// </summary>
  235. public event FeatureDataRowChangeEventHandler FeatureDataRowChanging;
  236. /// <summary>
  237. /// Occurs after a row in the table has been deleted.
  238. /// </summary>
  239. public event FeatureDataRowChangeEventHandler FeatureDataRowDeleted;
  240. /// <summary>
  241. /// Occurs before a row in the table is about to be deleted.
  242. /// </summary>
  243. public event FeatureDataRowChangeEventHandler FeatureDataRowDeleting;
  244. /// <summary>
  245. /// Adds a row to the FeatureDataTable
  246. /// </summary>
  247. /// <param name="row"></param>
  248. public void AddRow(FeatureDataRow row)
  249. {
  250. base.Rows.Add(row);
  251. }
  252. /// <summary>
  253. /// Returns an enumerator for enumering the rows of the FeatureDataTable
  254. /// </summary>
  255. /// <returns></returns>
  256. public System.Collections.IEnumerator GetEnumerator()
  257. {
  258. return base.Rows.GetEnumerator();
  259. }
  260. /// <summary>
  261. /// Clones the structure of the FeatureDataTable, including all FeatureDataTable schemas and constraints. 
  262. /// </summary>
  263. /// <returns></returns>
  264. public new FeatureDataTable Clone()
  265. {
  266. FeatureDataTable cln = ((FeatureDataTable)(base.Clone()));
  267. cln.InitVars();
  268. return cln;
  269. }
  270. /// <summary>
  271. /// 
  272. /// </summary>
  273. /// <returns></returns>
  274. protected override DataTable CreateInstance()
  275. {
  276. return new FeatureDataTable();
  277. }
  278. internal void InitVars()
  279. {
  280. //this.columnFeatureGeometry = this.Columns["FeatureGeometry"];
  281. }
  282. private void InitClass()
  283. {
  284. //this.columnFeatureGeometry = new DataColumn("FeatureGeometry", typeof(SharpMap.Geometries.Geometry), null, System.Data.MappingType.Element);
  285. //this.Columns.Add(this.columnFeatureGeometry);
  286. }
  287. /// <summary>
  288. /// Creates a new FeatureDataRow with the same schema as the table.
  289. /// </summary>
  290. /// <returns></returns>
  291. public new FeatureDataRow NewRow()
  292. {
  293. return (FeatureDataRow)base.NewRow();
  294. }
  295. /// <summary>
  296. /// Creates a new FeatureDataRow with the same schema as the table, based on a datarow builder
  297. /// </summary>
  298. /// <param name="builder"></param>
  299. /// <returns></returns>
  300. protected override DataRow NewRowFromBuilder(DataRowBuilder builder)
  301. {
  302. return new FeatureDataRow(builder);
  303. }
  304. /// <summary>
  305. /// 
  306. /// </summary>
  307. /// <returns></returns>
  308. protected override System.Type GetRowType()
  309. {
  310. return typeof(FeatureDataRow);
  311. }
  312. /// <summary>
  313. /// Raises the FeatureDataRowChanged event. 
  314. /// </summary>
  315. /// <param name="e"></param>
  316. protected override void OnRowChanged(DataRowChangeEventArgs e)
  317. {
  318. base.OnRowChanged(e);
  319. if ((this.FeatureDataRowChanged != null))
  320. {
  321. this.FeatureDataRowChanged(this, new FeatureDataRowChangeEventArgs(((FeatureDataRow)(e.Row)), e.Action));
  322. }
  323. }
  324. /// <summary>
  325. /// Raises the FeatureDataRowChanging event. 
  326. /// </summary>
  327. /// <param name="e"></param>
  328. protected override void OnRowChanging(DataRowChangeEventArgs e)
  329. {
  330. base.OnRowChanging(e);
  331. if ((this.FeatureDataRowChanging != null))
  332. {
  333. this.FeatureDataRowChanging(this, new FeatureDataRowChangeEventArgs(((FeatureDataRow)(e.Row)), e.Action));
  334. }
  335. }
  336. /// <summary>
  337. /// Raises the FeatureDataRowDeleted event
  338. /// </summary>
  339. /// <param name="e"></param>
  340. protected override void OnRowDeleted(DataRowChangeEventArgs e)
  341. {
  342. base.OnRowDeleted(e);
  343. if ((this.FeatureDataRowDeleted != null))
  344. {
  345. this.FeatureDataRowDeleted(this, new FeatureDataRowChangeEventArgs(((FeatureDataRow)(e.Row)), e.Action));
  346. }
  347. }
  348. /// <summary>
  349. /// Raises the FeatureDataRowDeleting event. 
  350. /// </summary>
  351. /// <param name="e"></param>
  352. protected override void OnRowDeleting(DataRowChangeEventArgs e)
  353. {
  354. base.OnRowDeleting(e);
  355. if ((this.FeatureDataRowDeleting != null))
  356. {
  357. this.FeatureDataRowDeleting(this, new FeatureDataRowChangeEventArgs(((FeatureDataRow)(e.Row)), e.Action));
  358. }
  359. }
  360. /// <summary>
  361. /// Gets the collection of rows that belong to this table.
  362. /// </summary>
  363. public new DataRowCollection Rows
  364. {
  365. get { throw (new NotSupportedException()); }
  366. set { throw (new NotSupportedException()); }
  367. }
  368. /// <summary>
  369. /// Removes the row from the table
  370. /// </summary>
  371. /// <param name="row">Row to remove</param>
  372. public void RemoveRow(FeatureDataRow row)
  373. {
  374. base.Rows.Remove(row);
  375. }
  376. }
  377. /// <summary>
  378. /// Represents the collection of tables for the FeatureDataSet.
  379. /// </summary>
  380. [Serializable()]
  381. public class FeatureTableCollection : System.Collections.Generic.List<FeatureDataTable>
  382. {
  383. }
  384. /// <summary>
  385. /// Represents a row of data in a FeatureDataTable.
  386. /// </summary>
  387. [System.Diagnostics.DebuggerStepThrough()]
  388. [Serializable()]
  389. public class FeatureDataRow : DataRow
  390. {
  391. //private FeatureDataTable tableFeatureTable;
  392. internal FeatureDataRow(DataRowBuilder rb) : base(rb)
  393. {
  394. }
  395. private SharpMap.Geometries.Geometry _Geometry;
  396. /// <summary>
  397. /// The geometry of the current feature
  398. /// </summary>
  399. public SharpMap.Geometries.Geometry Geometry
  400. {
  401. get { return _Geometry; }
  402. set { _Geometry = value; }
  403. }
  404. /// <summary>
  405. /// Returns true of the geometry is null
  406. /// </summary>
  407. /// <returns></returns>
  408. public bool IsFeatureGeometryNull()
  409. {
  410. return this.Geometry == null;
  411. }
  412. /// <summary>
  413. /// Sets the geometry column to null
  414. /// </summary>
  415. public void SetFeatureGeometryNull()
  416. {
  417. this.Geometry = null;
  418. }
  419. }
  420. /// <summary>
  421. /// Occurs after a FeatureDataRow has been changed successfully.
  422. /// </summary>
  423. [System.Diagnostics.DebuggerStepThrough()]
  424. public class FeatureDataRowChangeEventArgs : EventArgs
  425. {
  426. private FeatureDataRow eventRow;
  427. private DataRowAction eventAction;
  428. /// <summary>
  429. /// Initializes a new instance of the FeatureDataRowChangeEventArgs class.
  430. /// </summary>
  431. /// <param name="row"></param>
  432. /// <param name="action"></param>
  433. public FeatureDataRowChangeEventArgs(FeatureDataRow row, DataRowAction action)
  434. {
  435. this.eventRow = row;
  436. this.eventAction = action;
  437. }
  438. /// <summary>
  439. /// Gets the row upon which an action has occurred.
  440. /// </summary>
  441. public FeatureDataRow Row
  442. {
  443. get
  444. {
  445. return this.eventRow;
  446. }
  447. }
  448. /// <summary>
  449. /// Gets the action that has occurred on a FeatureDataRow.
  450. /// </summary>
  451. public DataRowAction Action
  452. {
  453. get
  454. {
  455. return this.eventAction;
  456. }
  457. }
  458. }
  459. }