Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.83 KB | None | 0 0
  1. #!/usr/bin/ruby
  2.  
  3.  
  4. def read_data(io, type, bo, label = '')
  5. data = nil
  6. bytes = nil
  7. value = nil
  8.  
  9. if type == :int
  10. data = io.read(4)
  11. if bo == :big
  12. value = data.unpack('N')[0]
  13. elsif bo == :little
  14. value = data.unpack('V')[0]
  15. else
  16. raise ArgumentError
  17. end
  18. bytes = "%04x %04x" % data.unpack('n2')
  19. elsif type == :double
  20. data = io.read(8)
  21. if bo == :big
  22. value = data.unpack('G')[0]
  23. elsif bo == :little
  24. value = data.unpack('E')[0]
  25. else
  26. raise ArgumentError
  27. end
  28. bytes = "%04x %04x %04x %04x" % data.unpack('n4')
  29. else
  30. raise ArgumentError
  31. end
  32.  
  33. str = [label, "value= #{value}", bytes, type.to_s, bo.to_s].join("\t")
  34. [value, str]
  35. end
  36.  
  37.  
  38.  
  39.  
  40. Dir.glob('*.shp').sort.each do |path|
  41. open(path, 'rb') do |io|
  42. puts '##########################################'
  43. puts "dump #{path}"
  44. puts '--------------------------------'
  45. puts 'File Header'
  46. puts '--------------------------------'
  47. puts read_data(io, :int, :big, 'File Code')[1]
  48. puts read_data(io, :int, :big, 'Unused')[1]
  49. puts read_data(io, :int, :big, 'Unused')[1]
  50. puts read_data(io, :int, :big, 'Unused')[1]
  51. puts read_data(io, :int, :big, 'Unused')[1]
  52. puts read_data(io, :int, :big, 'Unused')[1]
  53. puts read_data(io, :int, :big, 'File Length')[1]
  54. puts read_data(io, :int, :little, 'Version')[1]
  55. puts read_data(io, :int, :little, 'Shape Type')[1]
  56. puts read_data(io, :double, :little, 'Xmin')[1]
  57. puts read_data(io, :double, :little, 'Ymin')[1]
  58. puts read_data(io, :double, :little, 'Xmax')[1]
  59. puts read_data(io, :double, :little, 'Ymax')[1]
  60. puts read_data(io, :double, :little, 'Zmin')[1]
  61. puts read_data(io, :double, :little, 'Zmax')[1]
  62. puts read_data(io, :double, :little, 'Mmin')[1]
  63. puts read_data(io, :double, :little, 'Mmax')[1]
  64. puts '--------------------------------'
  65. puts 'Records'
  66. puts '--------------------------------'
  67. until io.eof?
  68. puts read_data(io, :int, :big, 'Record Number')[1]
  69. puts read_data(io, :int, :big, 'Content Length')[1]
  70. v = read_data(io, :int, :little, 'Shape Type')
  71. puts v[1]
  72. if v[0] == 0 # Null Shape
  73. nil
  74. elsif v[0] == 1 # Point
  75. puts read_data(io, :double, :little, 'X')[1]
  76. puts read_data(io, :double, :little, 'Y')[1]
  77. elsif v[0] == 3 || v[0] == 5 # PolyLine or Polygon
  78. puts read_data(io, :double, :little, 'Xmin')[1]
  79. puts read_data(io, :double, :little, 'Ymin')[1]
  80. puts read_data(io, :double, :little, 'Xmax')[1]
  81. puts read_data(io, :double, :little, 'Ymax')[1]
  82. parts = read_data(io, :int, :little, 'NumParts')
  83. puts parts[1]
  84. points = read_data(io, :int, :little, 'NumPoints')
  85. puts points[1]
  86. parts[0].times do |i|
  87. puts read_data(io, :int, :little, "Index of part[#{i}]")[1]
  88. end
  89. points[0].times do |i|
  90. puts read_data(io, :double, :little, "X[#{i}]")[1]
  91. puts read_data(io, :double, :little, "Y[#{i}]")[1]
  92. end
  93. end
  94. puts '------------'
  95. end
  96. end
  97. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement