Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.34 KB | None | 0 0
  1. import argparse
  2. import os
  3. import xml.etree.ElementTree as et
  4. from zipfile import ZipFile
  5.  
  6. import numpy as np
  7.  
  8.  
  9. def main():
  10. print("FILENAME :", zipFileName)
  11. baseName, _ = os.path.splitext(zipFileName)
  12. print("DIRNAME :", baseName)
  13. os.makedirs(baseName, exist_ok=True)
  14. existing_zip= ZipFile(zipFileName)
  15. existing_zip.extractall(baseName)
  16. existing_zip.close()
  17.  
  18. xNum = 225
  19. zNum = 150
  20.  
  21. data = np.full((zNum * 10, xNum * 10), np.nan, dtype=np.float)
  22.  
  23. for fileName in os.listdir(baseName):
  24. _, ext = os.path.splitext(fileName)
  25. if ext == ".xml":
  26. print("FILENAME :", fileName)
  27. tree = et.parse(baseName + "//" + fileName)
  28. root = tree.getroot()
  29. mesh = root[2][6].text
  30. N = (9 - int(mesh[6])) * zNum
  31. E = int(mesh[7]) * xNum
  32. print(
  33. "LOCATION :", mesh, root[2][7][0][0][0].text, root[2][7][0][0][1].text
  34. )
  35.  
  36. curData = np.full((zNum, xNum), np.nan, dtype=np.float)
  37. rawData = root[2][7][2][0][1].text.split()
  38. xStart, zStart = root[2][7][3][0][1].text.split()
  39. xStart = int(xStart)
  40. zStart = int(zStart)
  41. x=xStart
  42. z=zStart
  43. for raw in rawData:
  44. if raw.split(",")[0] == "地表面":
  45. curData[z][x]=float(raw.split(",")[1])
  46. x+=1
  47. if x >= xNum:
  48. x=0
  49. z+=1
  50. if z >= zNum:
  51. break
  52. data[N : N + zNum, E : E + xNum] = curData
  53. print("MAINDATA :", curData)
  54. os.remove(baseName + "//" + fileName)
  55.  
  56. os.removedirs(baseName)
  57.  
  58. data *= yScale*20/(np.nanmax(data)-np.nanmin(data))
  59. lowestLayer = np.nanmin(data)
  60. data[np.isnan(data)] = lowestLayer - 3
  61. data -= (lowestLayer - 5)
  62.  
  63. file = open(baseName + ".obj", "w")
  64.  
  65. for z in range(zNum * xzScale1):
  66. print("\rPROCESSING :{0}".format(int(100*z/(zNum * xzScale1))), end="")
  67. v = ""
  68. f = ""
  69. for x in range(xNum * xzScale1):
  70. curData = (
  71. str(
  72. data[
  73. z * xzScale2 : z * xzScale2 + xzScale2 - 1,
  74. x * xzScale2 : x * xzScale2 + xzScale2 - 1,
  75. ].mean()
  76. )
  77. )
  78. curPos = (z * xNum * xzScale1 + x) * 8
  79. v += (
  80. "v " + str(x) + " " + curData + " " + str(z) + "\n"
  81. "v " + str(x + 1) + " " + curData + " " + str(z) + "\n"
  82. "v " + str(x) + " " + curData + " " + str(z + 1) + "\n"
  83. "v " + str(x + 1) + " " + curData + " " + str(z + 1) + "\n"
  84. "v " + str(x) + " 0 " + str(z) + "\n"
  85. "v " + str(x + 1) + " 0 " + str(z) + "\n"
  86. "v " + str(x) + " 0 " + str(z + 1) + "\n"
  87. "v " + str(x + 1) + " 0 " + str(z + 1) + "\n"
  88. )
  89. f += (
  90. "f "
  91. + str(curPos + 1)
  92. + " "
  93. + str(curPos + 2)
  94. + " "
  95. + str(curPos + 3)
  96. + "\n"
  97. + "f "
  98. + str(curPos + 2)
  99. + " "
  100. + str(curPos + 3)
  101. + " "
  102. + str(curPos + 4)
  103. + "\n"
  104.  
  105. + "f "
  106. + str(curPos + 1)
  107. + " "
  108. + str(curPos + 2)
  109. + " "
  110. + str(curPos + 5)
  111. + "\n"
  112. + "f "
  113. + str(curPos + 2)
  114. + " "
  115. + str(curPos + 5)
  116. + " "
  117. + str(curPos + 6)
  118. + "\n"
  119.  
  120. + "f "
  121. + str(curPos + 2)
  122. + " "
  123. + str(curPos + 3)
  124. + " "
  125. + str(curPos + 6)
  126. + "\n"
  127. + "f "
  128. + str(curPos + 3)
  129. + " "
  130. + str(curPos + 6)
  131. + " "
  132. + str(curPos + 7)
  133. + "\n"
  134.  
  135. + "f "
  136. + str(curPos + 3)
  137. + " "
  138. + str(curPos + 4)
  139. + " "
  140. + str(curPos + 7)
  141. + "\n"
  142. + "f "
  143. + str(curPos + 4)
  144. + " "
  145. + str(curPos + 7)
  146. + " "
  147. + str(curPos + 8)
  148. + "\n"
  149.  
  150. + "f "
  151. + str(curPos + 4)
  152. + " "
  153. + str(curPos + 1)
  154. + " "
  155. + str(curPos + 8)
  156. + "\n"
  157. + "f "
  158. + str(curPos + 1)
  159. + " "
  160. + str(curPos + 8)
  161. + " "
  162. + str(curPos + 2)
  163. + "\n"
  164. )
  165.  
  166. file.write(v + f)
  167.  
  168. file.write(
  169. "v 0 0 0\n"
  170. + "v " + str(xNum * xzScale1) + " 0 0\n"
  171. + "v 0 0 " + str(zNum * xzScale1) + "\n"
  172. + "v " + str(xNum * xzScale1) + " 0 " + str(zNum * xzScale1) + "\n"
  173. + "f"
  174. + str(zNum * xzScale1 * xNum * xzScale1 * 8 + 1)
  175. + " "
  176. + str(zNum * xzScale1 * xNum * xzScale1 * 8 + 2)
  177. + " "
  178. + str(zNum * xzScale1 * xNum * xzScale1 * 8 + 3)
  179. + "\n"
  180. + "f"
  181. + str(zNum * xzScale1 * xNum * xzScale1 * 8 + 2)
  182. + " "
  183. + str(zNum * xzScale1 * xNum * xzScale1 * 8 + 3)
  184. + " "
  185. + str(zNum * xzScale1 * xNum * xzScale1 * 8 + 4)
  186. + "\n"
  187. )
  188.  
  189. file.close()
  190.  
  191.  
  192. if __name__ == "__main__":
  193. parser = argparse.ArgumentParser()
  194. parser.add_argument("filename", help="Specify a DEM ZIP file")
  195. parser.add_argument('-x', '--xzscale', type=int, default=2, help="Specify the horizontal scale with a value between 1 and 4. The higher the number, the more precise.")
  196. parser.add_argument('-y', '--yscale', type=float, default=1.0, help="Specify the vertical scale.")
  197. args = parser.parse_args()
  198.  
  199. yScale = args.yscale
  200. zipFileName=args.filename
  201.  
  202. # scale1 * scale2 == 10
  203. xzScale = args.xzscale
  204. if xzScale == 1:
  205. xzScale1 = 1
  206. xzScale2 = 10
  207. elif xzScale == 2:
  208. xzScale1 = 2
  209. xzScale2 = 5
  210. elif xzScale == 3:
  211. xzScale1 = 5
  212. xzScale2 = 2
  213. else:
  214. xzScale1 = 10
  215. xzScale2 = 1
  216.  
  217. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement