ShpMapImport.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO;
  5. using FastReport.Utils;
  6. namespace FastReport.Map.Import.Shp
  7. {
  8. internal class ShpMapImport : MapImport
  9. {
  10. #region Fields
  11. private MapObject map;
  12. private Stream stream;
  13. private MapLayer layer;
  14. #endregion // Fields
  15. #region Private Methods
  16. private void LoadFileHeader()
  17. {
  18. byte[] buffer4 = new byte[4];
  19. byte[] buffer8 = new byte[8];
  20. stream.Seek(0, SeekOrigin.Begin);
  21. stream.Read(buffer4, 0, buffer4.Length);
  22. Array.Reverse(buffer4);
  23. bool isFileCodeOK = BitConverter.ToInt32(buffer4, 0) == 9994;
  24. stream.Seek(24, SeekOrigin.Begin);
  25. stream.Read(buffer4, 0, buffer4.Length);
  26. Array.Reverse(buffer4);
  27. bool isFileLengthOK = (BitConverter.ToInt32(buffer4, 0) * 2) == stream.Length;
  28. stream.Seek(32, SeekOrigin.Begin);
  29. stream.Read(buffer4, 0, buffer4.Length);
  30. int shapeType = BitConverter.ToInt32(buffer4, 0);
  31. bool isShapeTypeOK = shapeType == 1 || shapeType == 3 || shapeType == 5 || shapeType == 8;
  32. if (isFileCodeOK && isFileLengthOK && isShapeTypeOK)
  33. {
  34. if (layer == null)
  35. {
  36. layer = new MapLayer();
  37. map.Layers.Add(layer);
  38. }
  39. switch (shapeType)
  40. {
  41. case 1:
  42. layer.Type = LayerType.Point;
  43. break;
  44. case 3:
  45. layer.Type = LayerType.Line;
  46. break;
  47. case 5:
  48. layer.Type = LayerType.Polygon;
  49. break;
  50. }
  51. stream.Seek(36, SeekOrigin.Begin);
  52. layer.Box.Load(stream);
  53. }
  54. }
  55. private int LoadRecordHeader()
  56. {
  57. byte[] buffer4 = new byte[4];
  58. stream.Read(buffer4, 0, buffer4.Length);
  59. Array.Reverse(buffer4);
  60. int recordNumber = BitConverter.ToInt32(buffer4, 0);
  61. stream.Read(buffer4, 0, buffer4.Length);
  62. Array.Reverse(buffer4);
  63. int contentLength = BitConverter.ToInt32(buffer4, 0) * 2;
  64. return contentLength;
  65. }
  66. private ShapePoint LoadPoint()
  67. {
  68. ShapePoint point = new ShapePoint();
  69. point.Load(stream);
  70. return point;
  71. }
  72. private PointD LoadPointD()
  73. {
  74. PointD point = new PointD();
  75. point.Load(stream);
  76. return point;
  77. }
  78. private ShapePolyLine LoadArc()
  79. {
  80. ShapePolyLine line = new ShapePolyLine();
  81. line.Load(stream);
  82. return line;
  83. }
  84. private ShapePolygon LoadPolygon()
  85. {
  86. ShapePolygon polygon = new ShapePolygon();
  87. polygon.Load(stream);
  88. return polygon;
  89. }
  90. private List<ShapePoint> LoadMultiPoint()
  91. {
  92. List<ShapePoint> points = new List<ShapePoint>();
  93. byte[] buffer4 = new byte[4];
  94. stream.Seek(32, SeekOrigin.Current);
  95. stream.Read(buffer4, 0, buffer4.Length);
  96. int numPoints = BitConverter.ToInt32(buffer4, 0);
  97. for (int i = 0; i < numPoints; i++)
  98. {
  99. ShapePoint point = new ShapePoint();
  100. point.Load(stream);
  101. points.Add(point);
  102. }
  103. return points;
  104. }
  105. private void LoadRecordContent(int contentLength)
  106. {
  107. byte[] buffer4 = new byte[4];
  108. stream.Read(buffer4, 0, buffer4.Length);
  109. int objectType = BitConverter.ToInt32(buffer4, 0);
  110. if (objectType == 1 && layer.Type == LayerType.Point)
  111. {
  112. ShapePoint point = LoadPoint();
  113. layer.Shapes.Add(point);
  114. }
  115. else if (objectType == 3 && layer.Type == LayerType.Line)
  116. {
  117. ShapePolyLine line = LoadArc();
  118. layer.Shapes.Add(line);
  119. }
  120. else if (objectType == 5 && layer.Type == LayerType.Polygon)
  121. {
  122. ShapePolygon polygon = LoadPolygon();
  123. layer.Shapes.Add(polygon);
  124. }
  125. else if (objectType == 8 && layer.Type == LayerType.Point)
  126. {
  127. List<ShapePoint> points = LoadMultiPoint();
  128. foreach (ShapePoint point in points)
  129. {
  130. layer.Shapes.Add(point);
  131. }
  132. }
  133. }
  134. private void LoadRecord()
  135. {
  136. int contentLength = LoadRecordHeader();
  137. LoadRecordContent(contentLength);
  138. }
  139. private void LoadRecords()
  140. {
  141. stream.Seek(100, SeekOrigin.Begin);
  142. while (stream.Position < stream.Length)
  143. {
  144. LoadRecord();
  145. }
  146. }
  147. private void ImportMap(MapObject map, Stream stream)
  148. {
  149. this.map = map;
  150. this.stream = stream;
  151. LoadFileHeader();
  152. LoadRecords();
  153. }
  154. private void ImportDbf(string filename)
  155. {
  156. string dbfFilename = Path.ChangeExtension(filename, ".dbf");
  157. if (File.Exists(dbfFilename))
  158. {
  159. DbfFileImport dbfImport = new DbfFileImport();
  160. dbfImport.ImportFile(layer, dbfFilename);
  161. }
  162. }
  163. #endregion // Private Methods
  164. #region Protected Methods
  165. protected override string GetFilter()
  166. {
  167. return Res.Get("FileFilters,ShpFile");
  168. }
  169. #endregion // Protected Methods
  170. #region Public Methods
  171. public override void ImportMap(MapObject map, MapLayer layer, string filename)
  172. {
  173. this.layer = layer;
  174. using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
  175. {
  176. ImportMap(map, stream);
  177. }
  178. ImportDbf(filename);
  179. }
  180. #endregion // Public Methods
  181. }
  182. }