metadata.py 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847
  1. """
  2. Metadata classes for map layer and space time datasets
  3. Usage:
  4. .. code-block:: python
  5. >>> import grass.temporal as tgis
  6. >>> tgis.init()
  7. >>> meta = tgis.RasterMetadata()
  8. >>> meta = tgis.Raster3DMetadata()
  9. >>> meta = tgis.VectorMetadata()
  10. >>> meta = tgis.STRDSMetadata()
  11. >>> meta = tgis.STR3DSMetadata()
  12. >>> meta = tgis.STVDSMetadata()
  13. (C) 2012-2013 by the GRASS Development Team
  14. This program is free software under the GNU General Public
  15. License (>=v2). Read the file COPYING that comes with GRASS
  16. for details.
  17. :authors: Soeren Gebbert
  18. """
  19. from __future__ import print_function
  20. from .base import SQLDatabaseInterface
  21. ###############################################################################
  22. class RasterMetadataBase(SQLDatabaseInterface):
  23. """This is the metadata base class for time stamped raster and raster3d maps
  24. Usage:
  25. .. code-block:: python
  26. >>> init()
  27. >>> meta = RasterMetadataBase(table="metadata", ident="soil@PERMANENT",
  28. ... datatype="CELL", cols=100, rows=100, number_of_cells=10000, nsres=0.1,
  29. ... ewres=0.1, min=0, max=100)
  30. >>> meta.datatype
  31. 'CELL'
  32. >>> meta.cols
  33. 100
  34. >>> meta.rows
  35. 100
  36. >>> meta.number_of_cells
  37. 10000
  38. >>> meta.nsres
  39. 0.1
  40. >>> meta.ewres
  41. 0.1
  42. >>> meta.min
  43. 0.0
  44. >>> meta.max
  45. 100.0
  46. >>> meta.print_info()
  47. | Datatype:................... CELL
  48. | Number of columns:.......... 100
  49. | Number of rows:............. 100
  50. | Number of cells:............ 10000
  51. | North-South resolution:..... 0.1
  52. | East-west resolution:....... 0.1
  53. | Minimum value:.............. 0.0
  54. | Maximum value:.............. 100.0
  55. >>> meta.print_shell_info()
  56. datatype=CELL
  57. cols=100
  58. rows=100
  59. number_of_cells=10000
  60. nsres=0.1
  61. ewres=0.1
  62. min=0.0
  63. max=100.0
  64. """
  65. def __init__(
  66. self,
  67. table=None,
  68. ident=None,
  69. datatype=None,
  70. cols=None,
  71. rows=None,
  72. number_of_cells=None,
  73. nsres=None,
  74. ewres=None,
  75. min=None,
  76. max=None,
  77. ):
  78. SQLDatabaseInterface.__init__(self, table, ident)
  79. self.set_id(ident)
  80. self.set_datatype(datatype)
  81. self.set_cols(cols)
  82. self.set_rows(rows)
  83. self.set_number_of_cells(number_of_cells)
  84. self.set_nsres(nsres)
  85. self.set_ewres(ewres)
  86. self.set_min(min)
  87. self.set_max(max)
  88. def set_id(self, ident):
  89. """Convenient method to set the unique identifier (primary key)"""
  90. self.ident = ident
  91. self.D["id"] = ident
  92. def set_datatype(self, datatype):
  93. """Set the datatype"""
  94. self.D["datatype"] = datatype
  95. def set_cols(self, cols):
  96. """Set the number of cols"""
  97. if cols is not None:
  98. self.D["cols"] = int(cols)
  99. else:
  100. self.D["cols"] = None
  101. def set_rows(self, rows):
  102. """Set the number of rows"""
  103. if rows is not None:
  104. self.D["rows"] = int(rows)
  105. else:
  106. self.D["rows"] = None
  107. def set_number_of_cells(self, number_of_cells):
  108. """Set the number of cells"""
  109. if number_of_cells is not None:
  110. self.D["number_of_cells"] = int(number_of_cells)
  111. else:
  112. self.D["number_of_cells"] = None
  113. def set_nsres(self, nsres):
  114. """Set the north-south resolution"""
  115. if nsres is not None:
  116. self.D["nsres"] = float(nsres)
  117. else:
  118. self.D["nsres"] = None
  119. def set_ewres(self, ewres):
  120. """Set the east-west resolution"""
  121. if ewres is not None:
  122. self.D["ewres"] = float(ewres)
  123. else:
  124. self.D["ewres"] = None
  125. def set_min(self, min):
  126. """Set the minimum raster value"""
  127. if min is not None:
  128. self.D["min"] = float(min)
  129. else:
  130. self.D["min"] = None
  131. def set_max(self, max):
  132. """Set the maximum raster value"""
  133. if max is not None:
  134. self.D["max"] = float(max)
  135. else:
  136. self.D["max"] = None
  137. def get_id(self):
  138. """Convenient method to get the unique identifier (primary key)
  139. :return: None if not found
  140. """
  141. if "id" in self.D:
  142. return self.D["id"]
  143. else:
  144. return None
  145. def get_datatype(self):
  146. """Get the map type
  147. :return: None if not found"""
  148. if "datatype" in self.D:
  149. return self.D["datatype"]
  150. else:
  151. return None
  152. def get_cols(self):
  153. """Get number of cols
  154. :return: None if not found"""
  155. if "cols" in self.D:
  156. return self.D["cols"]
  157. else:
  158. return None
  159. def get_rows(self):
  160. """Get number of rows
  161. :return: None if not found"""
  162. if "rows" in self.D:
  163. return self.D["rows"]
  164. else:
  165. return None
  166. def get_number_of_cells(self):
  167. """Get number of cells
  168. :return: None if not found"""
  169. if "number_of_cells" in self.D:
  170. return self.D["number_of_cells"]
  171. else:
  172. return None
  173. def get_nsres(self):
  174. """Get the north-south resolution
  175. :return: None if not found"""
  176. if "nsres" in self.D:
  177. return self.D["nsres"]
  178. else:
  179. return None
  180. def get_ewres(self):
  181. """Get east-west resolution
  182. :return: None if not found"""
  183. if "ewres" in self.D:
  184. return self.D["ewres"]
  185. else:
  186. return None
  187. def get_min(self):
  188. """Get the minimum cell value
  189. :return: None if not found"""
  190. if "min" in self.D:
  191. return self.D["min"]
  192. else:
  193. return None
  194. def get_max(self):
  195. """Get the maximum cell value
  196. :return: None if not found"""
  197. if "max" in self.D:
  198. return self.D["max"]
  199. else:
  200. return None
  201. # Properties
  202. datatype = property(fget=get_datatype, fset=set_datatype)
  203. cols = property(fget=get_cols, fset=set_cols)
  204. rows = property(fget=get_rows, fset=set_rows)
  205. number_of_cells = property(fget=get_number_of_cells, fset=set_number_of_cells)
  206. nsres = property(fget=get_nsres, fset=set_nsres)
  207. ewres = property(fget=get_ewres, fset=set_ewres)
  208. min = property(fget=get_min, fset=set_min)
  209. max = property(fget=get_max, fset=set_max)
  210. def _print_info_body(self, shell=False):
  211. """Print information about this class (body part).
  212. :param bool shell: True for human readable style otherwise shell style
  213. """
  214. if shell:
  215. print("datatype=" + str(self.get_datatype()))
  216. print("cols=" + str(self.get_cols()))
  217. print("rows=" + str(self.get_rows()))
  218. print("number_of_cells=" + str(self.get_number_of_cells()))
  219. print("nsres=" + str(self.get_nsres()))
  220. print("ewres=" + str(self.get_ewres()))
  221. print("min=" + str(self.get_min()))
  222. print("max=" + str(self.get_max()))
  223. else:
  224. print(" | Datatype:................... " + str(self.get_datatype()))
  225. print(" | Number of columns:.......... " + str(self.get_cols()))
  226. print(" | Number of rows:............. " + str(self.get_rows()))
  227. print(" | Number of cells:............ " + str(self.get_number_of_cells()))
  228. print(" | North-South resolution:..... " + str(self.get_nsres()))
  229. print(" | East-west resolution:....... " + str(self.get_ewres()))
  230. print(" | Minimum value:.............. " + str(self.get_min()))
  231. print(" | Maximum value:.............. " + str(self.get_max()))
  232. ###############################################################################
  233. class RasterMetadata(RasterMetadataBase):
  234. """This is the raster metadata class
  235. This class is the interface to the raster_metadata table in the
  236. temporal database that stores the metadata of all registered raster maps.
  237. The metadata includes the datatype, number of cols, rows and cells and
  238. the north-south and east west resolution of the map. Additionally the
  239. minimum and maximum valuesare stored.
  240. Usage:
  241. .. code-block:: python
  242. >>> init()
  243. >>> meta = RasterMetadata(ident="soil@PERMANENT",
  244. ... datatype="CELL", cols=100, rows=100, number_of_cells=10000, nsres=0.1,
  245. ... ewres=0.1, min=0, max=100)
  246. >>> meta.datatype
  247. 'CELL'
  248. >>> meta.cols
  249. 100
  250. >>> meta.rows
  251. 100
  252. >>> meta.number_of_cells
  253. 10000
  254. >>> meta.nsres
  255. 0.1
  256. >>> meta.ewres
  257. 0.1
  258. >>> meta.min
  259. 0.0
  260. >>> meta.max
  261. 100.0
  262. >>> meta.print_info()
  263. +-------------------- Metadata information ----------------------------------+
  264. | Datatype:................... CELL
  265. | Number of columns:.......... 100
  266. | Number of rows:............. 100
  267. | Number of cells:............ 10000
  268. | North-South resolution:..... 0.1
  269. | East-west resolution:....... 0.1
  270. | Minimum value:.............. 0.0
  271. | Maximum value:.............. 100.0
  272. >>> meta.print_shell_info()
  273. datatype=CELL
  274. cols=100
  275. rows=100
  276. number_of_cells=10000
  277. nsres=0.1
  278. ewres=0.1
  279. min=0.0
  280. max=100.0
  281. """
  282. def __init__(
  283. self,
  284. ident=None,
  285. datatype=None,
  286. cols=None,
  287. rows=None,
  288. number_of_cells=None,
  289. nsres=None,
  290. ewres=None,
  291. min=None,
  292. max=None,
  293. band_reference=None,
  294. ):
  295. RasterMetadataBase.__init__(
  296. self,
  297. "raster_metadata",
  298. ident,
  299. datatype,
  300. cols,
  301. rows,
  302. number_of_cells,
  303. nsres,
  304. ewres,
  305. min,
  306. max,
  307. )
  308. self.set_band_reference(band_reference)
  309. def set_band_reference(self, band_reference):
  310. """Set the band reference identifier"""
  311. self.D["band_reference"] = band_reference
  312. def get_band_reference(self):
  313. """Get the band reference identifier
  314. :return: None if not found"""
  315. if "band_reference" in self.D:
  316. return self.D["band_reference"]
  317. else:
  318. return None
  319. band_reference = property(fget=get_band_reference, fset=set_band_reference)
  320. def _print_info_body(self, shell=False):
  321. """Print information about this class (body part).
  322. :param bool shell: True for human readable style otherwise shell style
  323. """
  324. super()._print_info_body(shell)
  325. # band reference section (raster specific only)
  326. if shell:
  327. print("band_reference=" + str(self.get_band_reference()))
  328. else:
  329. print(" | Band reference:............. " + str(self.get_band_reference()))
  330. ###############################################################################
  331. class Raster3DMetadata(RasterMetadataBase):
  332. """This is the raster3d metadata class
  333. This class is the interface to the raster3d_metadata table in the
  334. temporal database that stores the metadata of all registered
  335. 3D raster maps.
  336. The metadata includes all raster metadata variables and additional
  337. the number of depths, the top-bottom resolution and the space time 3D
  338. raster dataset register table is stored.
  339. Usage:
  340. .. code-block:: python
  341. >>> init()
  342. >>> meta = Raster3DMetadata(ident="soil@PERMANENT",
  343. ... datatype="FCELL", cols=100, rows=100, depths=100,
  344. ... number_of_cells=1000000, nsres=0.1, ewres=0.1, tbres=0.1,
  345. ... min=0, max=100)
  346. >>> meta.datatype
  347. 'FCELL'
  348. >>> meta.cols
  349. 100
  350. >>> meta.rows
  351. 100
  352. >>> meta.depths
  353. 100
  354. >>> meta.number_of_cells
  355. 1000000
  356. >>> meta.nsres
  357. 0.1
  358. >>> meta.ewres
  359. 0.1
  360. >>> meta.tbres
  361. 0.1
  362. >>> meta.min
  363. 0.0
  364. >>> meta.max
  365. 100.0
  366. >>> meta.print_info()
  367. +-------------------- Metadata information ----------------------------------+
  368. | Datatype:................... FCELL
  369. | Number of columns:.......... 100
  370. | Number of rows:............. 100
  371. | Number of cells:............ 1000000
  372. | North-South resolution:..... 0.1
  373. | East-west resolution:....... 0.1
  374. | Minimum value:.............. 0.0
  375. | Maximum value:.............. 100.0
  376. | Number of depths:........... 100
  377. | Top-Bottom resolution:...... 0.1
  378. >>> meta.print_shell_info()
  379. datatype=FCELL
  380. cols=100
  381. rows=100
  382. number_of_cells=1000000
  383. nsres=0.1
  384. ewres=0.1
  385. min=0.0
  386. max=100.0
  387. depths=100
  388. tbres=0.1
  389. """
  390. def __init__(
  391. self,
  392. ident=None,
  393. datatype=None,
  394. cols=None,
  395. rows=None,
  396. depths=None,
  397. number_of_cells=None,
  398. nsres=None,
  399. ewres=None,
  400. tbres=None,
  401. min=None,
  402. max=None,
  403. ):
  404. RasterMetadataBase.__init__(
  405. self,
  406. "raster3d_metadata",
  407. ident,
  408. datatype,
  409. cols,
  410. rows,
  411. number_of_cells,
  412. nsres,
  413. ewres,
  414. min,
  415. max,
  416. )
  417. self.set_tbres(tbres)
  418. self.set_depths(depths)
  419. def set_depths(self, depths):
  420. """Set the number of depths"""
  421. if depths is not None:
  422. self.D["depths"] = int(depths)
  423. else:
  424. self.D["depths"] = None
  425. def set_tbres(self, tbres):
  426. """Set the top-bottom resolution"""
  427. if tbres is not None:
  428. self.D["tbres"] = float(tbres)
  429. else:
  430. self.D["tbres"] = None
  431. def get_depths(self):
  432. """Get number of depths
  433. :return: None if not found"""
  434. if "depths" in self.D:
  435. return self.D["depths"]
  436. else:
  437. return None
  438. def get_tbres(self):
  439. """Get top-bottom resolution
  440. :return: None if not found"""
  441. if "tbres" in self.D:
  442. return self.D["tbres"]
  443. else:
  444. return None
  445. depths = property(fget=get_depths, fset=set_depths)
  446. tbres = property(fget=get_tbres, fset=set_tbres)
  447. def _print_info_body(self, shell=False):
  448. """Print information about this class (body part).
  449. :param bool shell: True for human readable style otherwise shell style
  450. """
  451. super()._print_info_body(shell)
  452. if shell:
  453. print("depths=" + str(self.get_depths()))
  454. print("tbres=" + str(self.get_tbres()))
  455. else:
  456. print(" | Number of depths:........... " + str(self.get_depths()))
  457. print(" | Top-Bottom resolution:...... " + str(self.get_tbres()))
  458. ###############################################################################
  459. class VectorMetadata(SQLDatabaseInterface):
  460. """This is the vector metadata class
  461. This class is the interface to the vector_metadata table in the
  462. temporal database that stores the metadata of all registered
  463. vector maps.
  464. Usage:
  465. .. code-block:: python
  466. >>> init()
  467. >>> meta = VectorMetadata(ident="lidar@PERMANENT", is_3d=True,
  468. ... number_of_points=1, number_of_lines=2, number_of_boundaries=3,
  469. ... number_of_centroids=4, number_of_faces=5, number_of_kernels=6,
  470. ... number_of_primitives=7, number_of_nodes=8, number_of_areas=9,
  471. ... number_of_islands=10, number_of_holes=11, number_of_volumes=12)
  472. >>> meta.id
  473. 'lidar@PERMANENT'
  474. >>> meta.is_3d
  475. True
  476. >>> meta.number_of_points
  477. 1
  478. >>> meta.number_of_lines
  479. 2
  480. >>> meta.number_of_boundaries
  481. 3
  482. >>> meta.number_of_centroids
  483. 4
  484. >>> meta.number_of_faces
  485. 5
  486. >>> meta.number_of_kernels
  487. 6
  488. >>> meta.number_of_primitives
  489. 7
  490. >>> meta.number_of_nodes
  491. 8
  492. >>> meta.number_of_areas
  493. 9
  494. >>> meta.number_of_islands
  495. 10
  496. >>> meta.number_of_holes
  497. 11
  498. >>> meta.number_of_volumes
  499. 12
  500. >>> meta.print_info()
  501. +-------------------- Metadata information ----------------------------------+
  502. | Is map 3d .................. True
  503. | Number of points ........... 1
  504. | Number of lines ............ 2
  505. | Number of boundaries ....... 3
  506. | Number of centroids ........ 4
  507. | Number of faces ............ 5
  508. | Number of kernels .......... 6
  509. | Number of primitives ....... 7
  510. | Number of nodes ............ 8
  511. | Number of areas ............ 9
  512. | Number of islands .......... 10
  513. | Number of holes ............ 11
  514. | Number of volumes .......... 12
  515. >>> meta.print_shell_info()
  516. is_3d=True
  517. points=1
  518. lines=2
  519. boundaries=3
  520. centroids=4
  521. faces=5
  522. kernels=6
  523. primitives=7
  524. nodes=8
  525. areas=9
  526. islands=10
  527. holes=11
  528. volumes=12
  529. """
  530. def __init__(
  531. self,
  532. ident=None,
  533. is_3d=False,
  534. number_of_points=None,
  535. number_of_lines=None,
  536. number_of_boundaries=None,
  537. number_of_centroids=None,
  538. number_of_faces=None,
  539. number_of_kernels=None,
  540. number_of_primitives=None,
  541. number_of_nodes=None,
  542. number_of_areas=None,
  543. number_of_islands=None,
  544. number_of_holes=None,
  545. number_of_volumes=None,
  546. ):
  547. SQLDatabaseInterface.__init__(self, "vector_metadata", ident)
  548. self.set_id(ident)
  549. self.set_3d_info(is_3d)
  550. self.set_number_of_points(number_of_points)
  551. self.set_number_of_lines(number_of_lines)
  552. self.set_number_of_boundaries(number_of_boundaries)
  553. self.set_number_of_centroids(number_of_centroids)
  554. self.set_number_of_faces(number_of_faces)
  555. self.set_number_of_kernels(number_of_kernels)
  556. self.set_number_of_primitives(number_of_primitives)
  557. self.set_number_of_nodes(number_of_nodes)
  558. self.set_number_of_areas(number_of_areas)
  559. self.set_number_of_islands(number_of_islands)
  560. self.set_number_of_holes(number_of_holes)
  561. self.set_number_of_volumes(number_of_volumes)
  562. def set_id(self, ident):
  563. """Convenient method to set the unique identifier (primary key)"""
  564. self.ident = ident
  565. self.D["id"] = ident
  566. def set_3d_info(self, is_3d):
  567. """Set True if the vector map is three dimensional"""
  568. self.D["is_3d"] = is_3d
  569. def set_number_of_points(self, number_of_points):
  570. """Set the number of points of the vector map"""
  571. self.D["points"] = number_of_points
  572. def set_number_of_lines(self, number_of_lines):
  573. """Set the number of lines of the vector map"""
  574. self.D["lines"] = number_of_lines
  575. def set_number_of_boundaries(self, number_of_boundaries):
  576. """Set the number of boundaries of the vector map"""
  577. self.D["boundaries"] = number_of_boundaries
  578. def set_number_of_centroids(self, number_of_centroids):
  579. """Set the number of centroids of the vector map"""
  580. self.D["centroids"] = number_of_centroids
  581. def set_number_of_faces(self, number_of_faces):
  582. """Set the number of faces of the vector map"""
  583. self.D["faces"] = number_of_faces
  584. def set_number_of_kernels(self, number_of_kernels):
  585. """Set the number of kernels of the vector map"""
  586. self.D["kernels"] = number_of_kernels
  587. def set_number_of_primitives(self, number_of_primitives):
  588. """Set the number of primitives of the vector map"""
  589. self.D["primitives"] = number_of_primitives
  590. def set_number_of_nodes(self, number_of_nodes):
  591. """Set the number of nodes of the vector map"""
  592. self.D["nodes"] = number_of_nodes
  593. def set_number_of_areas(self, number_of_areas):
  594. """Set the number of areas of the vector map"""
  595. self.D["areas"] = number_of_areas
  596. def set_number_of_islands(self, number_of_islands):
  597. """Set the number of islands of the vector map"""
  598. self.D["islands"] = number_of_islands
  599. def set_number_of_holes(self, number_of_holes):
  600. """Set the number of holes of the vector map"""
  601. self.D["holes"] = number_of_holes
  602. def set_number_of_volumes(self, number_of_volumes):
  603. """Set the number of volumes of the vector map"""
  604. self.D["volumes"] = number_of_volumes
  605. def get_id(self):
  606. """Convenient method to get the unique identifier (primary key)
  607. :return: None if not found
  608. """
  609. if "id" in self.D:
  610. return self.D["id"]
  611. else:
  612. return None
  613. def get_3d_info(self):
  614. """Return True if the map is three dimensional,
  615. False if not and None if not info was found"""
  616. if "is_3d" in self.D:
  617. return self.D["is_3d"]
  618. else:
  619. return None
  620. def get_number_of_points(self):
  621. """Get the number of points of the vector map
  622. :return: None if not found"""
  623. if "points" in self.D:
  624. return self.D["points"]
  625. else:
  626. return None
  627. def get_number_of_lines(self):
  628. """Get the number of lines of the vector map
  629. :return: None if not found"""
  630. if "lines" in self.D:
  631. return self.D["lines"]
  632. else:
  633. return None
  634. def get_number_of_boundaries(self):
  635. """Get the number of boundaries of the vector map
  636. :return: None if not found"""
  637. if "boundaries" in self.D:
  638. return self.D["boundaries"]
  639. else:
  640. return None
  641. def get_number_of_centroids(self):
  642. """Get the number of centroids of the vector map
  643. :return: None if not found"""
  644. if "centroids" in self.D:
  645. return self.D["centroids"]
  646. else:
  647. return None
  648. def get_number_of_faces(self):
  649. """Get the number of faces of the vector map
  650. :return: None if not found"""
  651. if "faces" in self.D:
  652. return self.D["faces"]
  653. else:
  654. return None
  655. def get_number_of_kernels(self):
  656. """Get the number of kernels of the vector map
  657. :return: None if not found"""
  658. if "kernels" in self.D:
  659. return self.D["kernels"]
  660. else:
  661. return None
  662. def get_number_of_primitives(self):
  663. """Get the number of primitives of the vector map
  664. :return: None if not found"""
  665. if "primitives" in self.D:
  666. return self.D["primitives"]
  667. else:
  668. return None
  669. def get_number_of_nodes(self):
  670. """Get the number of nodes of the vector map
  671. :return: None if not found"""
  672. if "nodes" in self.D:
  673. return self.D["nodes"]
  674. else:
  675. return None
  676. def get_number_of_areas(self):
  677. """Get the number of areas of the vector map
  678. :return: None if not found"""
  679. if "areas" in self.D:
  680. return self.D["areas"]
  681. else:
  682. return None
  683. def get_number_of_islands(self):
  684. """Get the number of islands of the vector map
  685. :return: None if not found"""
  686. if "islands" in self.D:
  687. return self.D["islands"]
  688. else:
  689. return None
  690. def get_number_of_holes(self):
  691. """Get the number of holes of the vector map
  692. :return: None if not found"""
  693. if "holes" in self.D:
  694. return self.D["holes"]
  695. else:
  696. return None
  697. def get_number_of_volumes(self):
  698. """Get the number of volumes of the vector map
  699. :return: None if not found"""
  700. if "volumes" in self.D:
  701. return self.D["volumes"]
  702. else:
  703. return None
  704. # Set the properties
  705. id = property(fget=get_id, fset=set_id)
  706. is_3d = property(fget=get_3d_info, fset=set_3d_info)
  707. number_of_points = property(fget=get_number_of_points, fset=set_number_of_points)
  708. number_of_lines = property(fget=get_number_of_lines, fset=set_number_of_lines)
  709. number_of_boundaries = property(
  710. fget=get_number_of_boundaries, fset=set_number_of_boundaries
  711. )
  712. number_of_centroids = property(
  713. fget=get_number_of_centroids, fset=set_number_of_centroids
  714. )
  715. number_of_faces = property(fget=get_number_of_faces, fset=set_number_of_faces)
  716. number_of_kernels = property(fget=get_number_of_kernels, fset=set_number_of_kernels)
  717. number_of_primitives = property(
  718. fget=get_number_of_primitives, fset=set_number_of_primitives
  719. )
  720. number_of_nodes = property(fget=get_number_of_nodes, fset=set_number_of_nodes)
  721. number_of_areas = property(fget=get_number_of_areas, fset=set_number_of_areas)
  722. number_of_islands = property(fget=get_number_of_islands, fset=set_number_of_islands)
  723. number_of_holes = property(fget=get_number_of_holes, fset=set_number_of_holes)
  724. number_of_volumes = property(fget=get_number_of_volumes, fset=set_number_of_volumes)
  725. def _print_info_body(self, shell=False):
  726. """Print information about this class (body part).
  727. :param bool shell: True for human readable style otherwise shell style
  728. """
  729. if shell:
  730. print("is_3d=" + str(self.get_3d_info()))
  731. print("points=" + str(self.get_number_of_points()))
  732. print("lines=" + str(self.get_number_of_lines()))
  733. print("boundaries=" + str(self.get_number_of_boundaries()))
  734. print("centroids=" + str(self.get_number_of_centroids()))
  735. print("faces=" + str(self.get_number_of_faces()))
  736. print("kernels=" + str(self.get_number_of_kernels()))
  737. print("primitives=" + str(self.get_number_of_primitives()))
  738. print("nodes=" + str(self.get_number_of_nodes()))
  739. print("areas=" + str(self.get_number_of_areas()))
  740. print("islands=" + str(self.get_number_of_islands()))
  741. print("holes=" + str(self.get_number_of_holes()))
  742. print("volumes=" + str(self.get_number_of_volumes()))
  743. else:
  744. print(" | Is map 3d .................. " + str(self.get_3d_info()))
  745. print(" | Number of points ........... " + str(self.get_number_of_points()))
  746. print(" | Number of lines ............ " + str(self.get_number_of_lines()))
  747. print(
  748. " | Number of boundaries ....... "
  749. + str(self.get_number_of_boundaries())
  750. )
  751. print(
  752. " | Number of centroids ........ " + str(self.get_number_of_centroids())
  753. )
  754. print(" | Number of faces ............ " + str(self.get_number_of_faces()))
  755. print(
  756. " | Number of kernels .......... " + str(self.get_number_of_kernels())
  757. )
  758. print(
  759. " | Number of primitives ....... "
  760. + str(self.get_number_of_primitives())
  761. )
  762. print(" | Number of nodes ............ " + str(self.get_number_of_nodes()))
  763. print(" | Number of areas ............ " + str(self.get_number_of_areas()))
  764. print(
  765. " | Number of islands .......... " + str(self.get_number_of_islands())
  766. )
  767. print(" | Number of holes ............ " + str(self.get_number_of_holes()))
  768. print(
  769. " | Number of volumes .......... " + str(self.get_number_of_volumes())
  770. )
  771. ###############################################################################
  772. class STDSMetadataBase(SQLDatabaseInterface):
  773. """This is the space time dataset metadata base class for
  774. strds, stvds and str3ds datasets
  775. setting/getting the id, the title and the description
  776. Usage:
  777. .. code-block:: python
  778. >>> init()
  779. >>> meta = STDSMetadataBase(ident="soils@PERMANENT",
  780. ... title="Soils", description="Soils 1950 - 2010")
  781. >>> meta.id
  782. 'soils@PERMANENT'
  783. >>> meta.title
  784. 'Soils'
  785. >>> meta.description
  786. 'Soils 1950 - 2010'
  787. >>> meta.number_of_maps
  788. >>> meta.print_info()
  789. | Number of registered maps:.. None
  790. |
  791. | Title:
  792. | Soils
  793. | Description:
  794. | Soils 1950 - 2010
  795. | Command history:
  796. >>> meta.print_shell_info()
  797. number_of_maps=None
  798. """
  799. def __init__(
  800. self, table=None, ident=None, title=None, description=None, command=None
  801. ):
  802. SQLDatabaseInterface.__init__(self, table, ident)
  803. self.set_id(ident)
  804. self.set_title(title)
  805. self.set_description(description)
  806. self.set_command(command)
  807. # No setter for this
  808. self.D["number_of_maps"] = None
  809. def set_id(self, ident):
  810. """Convenient method to set the unique identifier (primary key)"""
  811. self.ident = ident
  812. self.D["id"] = ident
  813. def set_title(self, title):
  814. """Set the title"""
  815. self.D["title"] = title
  816. def set_description(self, description):
  817. """Set the number of cols"""
  818. self.D["description"] = description
  819. def set_command(self, command):
  820. """Set the number of cols"""
  821. self.D["command"] = command
  822. def get_id(self):
  823. """Convenient method to get the unique identifier (primary key)
  824. :return: None if not found
  825. """
  826. if "id" in self.D:
  827. return self.D["id"]
  828. else:
  829. return None
  830. def get_title(self):
  831. """Get the title
  832. :return: None if not found"""
  833. if "title" in self.D:
  834. return self.D["title"]
  835. else:
  836. return None
  837. def get_description(self):
  838. """Get description
  839. :return: None if not found"""
  840. if "description" in self.D:
  841. return self.D["description"]
  842. else:
  843. return None
  844. def get_command(self):
  845. """Get command
  846. :return: None if not found"""
  847. if "command" in self.D:
  848. return self.D["command"]
  849. else:
  850. return None
  851. def get_number_of_maps(self):
  852. """Get the number of registered maps,
  853. this value is set in the database
  854. automatically via SQL, so no setter exists
  855. :return: None if not found"""
  856. if "number_of_maps" in self.D:
  857. return self.D["number_of_maps"]
  858. else:
  859. return None
  860. id = property(fget=get_id, fset=set_id)
  861. title = property(fget=get_title, fset=set_title)
  862. description = property(fget=get_description, fset=set_description)
  863. number_of_maps = property(fget=get_number_of_maps)
  864. def print_info(self):
  865. """Print information about this class in human readable style"""
  866. self._print_info_head(shell=False)
  867. self._print_info_body(shell=False)
  868. self._print_info_tail(shell=False)
  869. def print_shell_info(self):
  870. """Print information about this class in shell style"""
  871. self._print_info_head(shell=True)
  872. self._print_info_body(shell=True)
  873. self._print_info_tail(shell=True)
  874. def _print_info_head(self, shell=False):
  875. """Print information about this class (head part).
  876. No header printed in shell style mode.
  877. :param bool shell: True for human readable style otherwise shell style
  878. """
  879. if not shell:
  880. print(
  881. " +-------------------- Metadata information ----------------------------------+"
  882. )
  883. def _print_info_tail(self, shell=False):
  884. """Print information about this class (tail part).
  885. :param bool shell: True for human readable style otherwise shell style
  886. """
  887. if shell:
  888. print("number_of_maps=" + str(self.get_number_of_maps()))
  889. else:
  890. print(" | Number of registered maps:.. " + str(self.get_number_of_maps()))
  891. print(" |")
  892. print(" | Title:")
  893. print(" | " + str(self.get_title()))
  894. print(" | Description:")
  895. print(" | " + str(self.get_description()))
  896. print(" | Command history:")
  897. command = self.get_command()
  898. if command:
  899. for token in command.split("\n"):
  900. print(" | " + str(token))
  901. def print_history(self):
  902. """Print history information about this class in human readable
  903. shell style
  904. """
  905. # 0123456789012345678901234567890
  906. print("# Title:")
  907. print("# " + str(self.get_title()))
  908. print("# Description:")
  909. print("# " + str(self.get_description()))
  910. print("# Command history:")
  911. command = self.get_command()
  912. if command:
  913. tokens = command.split("\n")
  914. print_list = []
  915. for token in tokens:
  916. token = str(token).rstrip().lstrip()
  917. if len(token) > 1:
  918. print_list.append(token)
  919. count = 0
  920. for token in print_list:
  921. count += 1
  922. if len(token) > 1:
  923. if token[0] == "#":
  924. print(token)
  925. elif count < len(print_list):
  926. print(token + " \\")
  927. else:
  928. print(token)
  929. ###############################################################################
  930. class STDSRasterMetadataBase(STDSMetadataBase):
  931. """This is the space time dataset metadata base
  932. class for strds and str3ds datasets
  933. Most of the metadata values are set by SQL scripts in the database when
  934. new maps are added. Therefor only some set- an many
  935. get-functions are available.
  936. Usage:
  937. .. code-block:: python
  938. >>> init()
  939. >>> meta = STDSRasterMetadataBase(ident="soils@PERMANENT",
  940. ... title="Soils", description="Soils 1950 - 2010")
  941. >>> meta.id
  942. 'soils@PERMANENT'
  943. >>> meta.title
  944. 'Soils'
  945. >>> meta.description
  946. 'Soils 1950 - 2010'
  947. >>> meta.number_of_maps
  948. >>> meta.min_max
  949. >>> meta.max_max
  950. >>> meta.min_min
  951. >>> meta.max_min
  952. >>> meta.nsres_min
  953. >>> meta.nsres_max
  954. >>> meta.ewres_min
  955. >>> meta.ewres_max
  956. >>> meta.print_info()
  957. | North-South resolution min:. None
  958. | North-South resolution max:. None
  959. | East-west resolution min:... None
  960. | East-west resolution max:... None
  961. | Minimum value min:.......... None
  962. | Minimum value max:.......... None
  963. | Maximum value min:.......... None
  964. | Maximum value max:.......... None
  965. | Aggregation type:........... None
  966. | Number of registered maps:.. None
  967. |
  968. | Title:
  969. | Soils
  970. | Description:
  971. | Soils 1950 - 2010
  972. | Command history:
  973. >>> meta.print_shell_info()
  974. nsres_min=None
  975. nsres_max=None
  976. ewres_min=None
  977. ewres_max=None
  978. min_min=None
  979. min_max=None
  980. max_min=None
  981. max_max=None
  982. aggregation_type=None
  983. number_of_maps=None
  984. """
  985. def __init__(
  986. self,
  987. table=None,
  988. ident=None,
  989. title=None,
  990. description=None,
  991. aggregation_type=None,
  992. ):
  993. STDSMetadataBase.__init__(self, table, ident, title, description)
  994. # Initialize the dict to select all values from the db
  995. self.D["min_max"] = None
  996. self.D["max_max"] = None
  997. self.D["min_min"] = None
  998. self.D["max_min"] = None
  999. self.D["nsres_min"] = None
  1000. self.D["nsres_max"] = None
  1001. self.D["ewres_min"] = None
  1002. self.D["ewres_max"] = None
  1003. self.D["aggregation_type"] = aggregation_type
  1004. def set_aggregation_type(self, aggregation_type):
  1005. """Set the aggregation type of the dataset (mean, min, max, ...)"""
  1006. self.D["aggregation_type"] = aggregation_type
  1007. def get_aggregation_type(self):
  1008. """Get the aggregation type of the dataset (mean, min, max, ...)
  1009. :return: None if not found
  1010. """
  1011. if "aggregation_type" in self.D:
  1012. return self.D["aggregation_type"]
  1013. else:
  1014. return None
  1015. def get_max_min(self):
  1016. """Get the minimal maximum of all registered maps,
  1017. this value is set in the database
  1018. automatically via SQL, so no setter exists
  1019. :return: None if not found"""
  1020. if "max_min" in self.D:
  1021. return self.D["max_min"]
  1022. else:
  1023. return None
  1024. def get_min_min(self):
  1025. """Get the minimal minimum of all registered maps,
  1026. this value is set in the database
  1027. automatically via SQL, so no setter exists
  1028. :return: None if not found"""
  1029. if "min_min" in self.D:
  1030. return self.D["min_min"]
  1031. else:
  1032. return None
  1033. def get_max_max(self):
  1034. """Get the maximal maximum of all registered maps,
  1035. this value is set in the database
  1036. automatically via SQL, so no setter exists
  1037. :return: None if not found"""
  1038. if "max_max" in self.D:
  1039. return self.D["max_max"]
  1040. else:
  1041. return None
  1042. def get_min_max(self):
  1043. """Get the maximal minimum of all registered maps,
  1044. this value is set in the database
  1045. automatically via SQL, so no setter exists
  1046. :return: None if not found"""
  1047. if "min_max" in self.D:
  1048. return self.D["min_max"]
  1049. else:
  1050. return None
  1051. def get_nsres_min(self):
  1052. """Get the minimal north-south resolution of all registered maps,
  1053. this value is set in the database
  1054. automatically via SQL, so no setter exists
  1055. :return: None if not found"""
  1056. if "nsres_min" in self.D:
  1057. return self.D["nsres_min"]
  1058. else:
  1059. return None
  1060. def get_nsres_max(self):
  1061. """Get the maximal north-south resolution of all registered maps,
  1062. this value is set in the database
  1063. automatically via SQL, so no setter exists
  1064. :return: None if not found"""
  1065. if "nsres_max" in self.D:
  1066. return self.D["nsres_max"]
  1067. else:
  1068. return None
  1069. def get_ewres_min(self):
  1070. """Get the minimal east-west resolution of all registered maps,
  1071. this value is set in the database
  1072. automatically via SQL, so no setter exists
  1073. :return: None if not found"""
  1074. if "ewres_min" in self.D:
  1075. return self.D["ewres_min"]
  1076. else:
  1077. return None
  1078. def get_ewres_max(self):
  1079. """Get the maximal east-west resolution of all registered maps,
  1080. this value is set in the database
  1081. automatically via SQL, so no setter exists
  1082. :return: None if not found"""
  1083. if "ewres_max" in self.D:
  1084. return self.D["ewres_max"]
  1085. else:
  1086. return None
  1087. nsres_min = property(fget=get_nsres_min)
  1088. nsres_max = property(fget=get_nsres_max)
  1089. ewres_min = property(fget=get_ewres_min)
  1090. ewres_max = property(fget=get_ewres_max)
  1091. min_min = property(fget=get_min_min)
  1092. min_max = property(fget=get_min_max)
  1093. max_min = property(fget=get_max_min)
  1094. max_max = property(fget=get_max_max)
  1095. aggregation_type = property(fset=set_aggregation_type, fget=get_aggregation_type)
  1096. def _print_info_body(self, shell=False):
  1097. """Print information about this class (body part).
  1098. :param bool shell: True for human readable style otherwise shell style
  1099. """
  1100. if shell:
  1101. print("nsres_min=" + str(self.get_nsres_min()))
  1102. print("nsres_max=" + str(self.get_nsres_max()))
  1103. print("ewres_min=" + str(self.get_ewres_min()))
  1104. print("ewres_max=" + str(self.get_ewres_max()))
  1105. print("min_min=" + str(self.get_min_min()))
  1106. print("min_max=" + str(self.get_min_max()))
  1107. print("max_min=" + str(self.get_max_min()))
  1108. print("max_max=" + str(self.get_max_max()))
  1109. print("aggregation_type=" + str(self.get_aggregation_type()))
  1110. else:
  1111. print(" | North-South resolution min:. " + str(self.get_nsres_min()))
  1112. print(" | North-South resolution max:. " + str(self.get_nsres_max()))
  1113. print(" | East-west resolution min:... " + str(self.get_ewres_min()))
  1114. print(" | East-west resolution max:... " + str(self.get_ewres_max()))
  1115. print(" | Minimum value min:.......... " + str(self.get_min_min()))
  1116. print(" | Minimum value max:.......... " + str(self.get_min_max()))
  1117. print(" | Maximum value min:.......... " + str(self.get_max_min()))
  1118. print(" | Maximum value max:.......... " + str(self.get_max_max()))
  1119. print(" | Aggregation type:........... " + str(self.get_aggregation_type()))
  1120. ###############################################################################
  1121. class STRDSMetadata(STDSRasterMetadataBase):
  1122. """This is the raster metadata class
  1123. This class is the interface to the strds_metadata table in the
  1124. temporal database that stores the metadata of all registered
  1125. space time raster datasets
  1126. Most of the metadata values are set by SQL scripts in the database when
  1127. new raster maps are added. Therefor only some set- an many
  1128. get-functions are available.
  1129. Usage:
  1130. .. code-block:: python
  1131. >>> init()
  1132. >>> meta = STRDSMetadata(ident="soils@PERMANENT",
  1133. ... title="Soils", description="Soils 1950 - 2010")
  1134. >>> meta.id
  1135. 'soils@PERMANENT'
  1136. >>> meta.title
  1137. 'Soils'
  1138. >>> meta.description
  1139. 'Soils 1950 - 2010'
  1140. >>> meta.number_of_maps
  1141. >>> meta.min_max
  1142. >>> meta.max_max
  1143. >>> meta.min_min
  1144. >>> meta.max_min
  1145. >>> meta.nsres_min
  1146. >>> meta.nsres_max
  1147. >>> meta.ewres_min
  1148. >>> meta.ewres_max
  1149. >>> meta.raster_register
  1150. >>> meta.print_info()
  1151. +-------------------- Metadata information ----------------------------------+
  1152. | Raster register table:...... None
  1153. | North-South resolution min:. None
  1154. | North-South resolution max:. None
  1155. | East-west resolution min:... None
  1156. | East-west resolution max:... None
  1157. | Minimum value min:.......... None
  1158. | Minimum value max:.......... None
  1159. | Maximum value min:.......... None
  1160. | Maximum value max:.......... None
  1161. | Aggregation type:........... None
  1162. | Number of registered bands:. None
  1163. | Number of registered maps:.. None
  1164. |
  1165. | Title:
  1166. | Soils
  1167. | Description:
  1168. | Soils 1950 - 2010
  1169. | Command history:
  1170. >>> meta.print_shell_info()
  1171. raster_register=None
  1172. nsres_min=None
  1173. nsres_max=None
  1174. ewres_min=None
  1175. ewres_max=None
  1176. min_min=None
  1177. min_max=None
  1178. max_min=None
  1179. max_max=None
  1180. aggregation_type=None
  1181. number_of_bands=None
  1182. number_of_maps=None
  1183. """
  1184. def __init__(self, ident=None, raster_register=None, title=None, description=None):
  1185. STDSRasterMetadataBase.__init__(
  1186. self, "strds_metadata", ident, title, description
  1187. )
  1188. self.D["number_of_bands"] = None
  1189. self.set_raster_register(raster_register)
  1190. def set_raster_register(self, raster_register):
  1191. """Set the raster map register table name"""
  1192. self.D["raster_register"] = raster_register
  1193. def get_raster_register(self):
  1194. """Get the raster map register table name
  1195. :return: None if not found"""
  1196. if "raster_register" in self.D:
  1197. return self.D["raster_register"]
  1198. else:
  1199. return None
  1200. def get_number_of_bands(self):
  1201. """Get the number of registered bands
  1202. :return: None if not found
  1203. """
  1204. if "number_of_bands" in self.D:
  1205. return self.D["number_of_bands"]
  1206. else:
  1207. return None
  1208. raster_register = property(fget=get_raster_register, fset=set_raster_register)
  1209. number_of_bands = property(fget=get_number_of_bands)
  1210. def _print_info_body(self, shell=False):
  1211. """Print information about this class (body part).
  1212. :param bool shell: True for human readable style otherwise shell style
  1213. """
  1214. if shell:
  1215. print("raster_register=" + str(self.get_raster_register()))
  1216. else:
  1217. print(" | Raster register table:...... " + str(self.get_raster_register()))
  1218. super()._print_info_body(shell)
  1219. if shell:
  1220. print("number_of_bands=" + str(self.get_number_of_bands()))
  1221. else:
  1222. print(" | Number of registered bands:. " + str(self.get_number_of_bands()))
  1223. ###############################################################################
  1224. class STR3DSMetadata(STDSRasterMetadataBase):
  1225. """This is the space time 3D raster metadata class
  1226. This class is the interface to the str3ds_metadata table in the
  1227. temporal database that stores the metadata of all registered
  1228. space time 3D raster datasets
  1229. Most of the metadata values are set by SQL scripts in the database when
  1230. new 3D raster maps are added. Therefor only some set- an many
  1231. get-functions are available.
  1232. Usage:
  1233. .. code-block:: python
  1234. >>> init()
  1235. >>> meta = STR3DSMetadata(ident="soils@PERMANENT",
  1236. ... title="Soils", description="Soils 1950 - 2010")
  1237. >>> meta.id
  1238. 'soils@PERMANENT'
  1239. >>> meta.title
  1240. 'Soils'
  1241. >>> meta.description
  1242. 'Soils 1950 - 2010'
  1243. >>> meta.number_of_maps
  1244. >>> meta.min_max
  1245. >>> meta.max_max
  1246. >>> meta.min_min
  1247. >>> meta.max_min
  1248. >>> meta.nsres_min
  1249. >>> meta.nsres_max
  1250. >>> meta.ewres_min
  1251. >>> meta.ewres_max
  1252. >>> meta.tbres_min
  1253. >>> meta.tbres_max
  1254. >>> meta.raster3d_register
  1255. >>> meta.print_info()
  1256. +-------------------- Metadata information ----------------------------------+
  1257. | 3D raster register table:... None
  1258. | Top-bottom resolution min:.. None
  1259. | Top-bottom resolution max:.. None
  1260. | North-South resolution min:. None
  1261. | North-South resolution max:. None
  1262. | East-west resolution min:... None
  1263. | East-west resolution max:... None
  1264. | Minimum value min:.......... None
  1265. | Minimum value max:.......... None
  1266. | Maximum value min:.......... None
  1267. | Maximum value max:.......... None
  1268. | Aggregation type:........... None
  1269. | Number of registered maps:.. None
  1270. |
  1271. | Title:
  1272. | Soils
  1273. | Description:
  1274. | Soils 1950 - 2010
  1275. | Command history:
  1276. >>> meta.print_shell_info()
  1277. raster3d_register=None
  1278. nsres_min=None
  1279. nsres_max=None
  1280. ewres_min=None
  1281. ewres_max=None
  1282. min_min=None
  1283. min_max=None
  1284. max_min=None
  1285. max_max=None
  1286. tbres_min=None
  1287. tbres_max=None
  1288. aggregation_type=None
  1289. number_of_maps=None
  1290. """
  1291. def __init__(
  1292. self, ident=None, raster3d_register=None, title=None, description=None
  1293. ):
  1294. STDSRasterMetadataBase.__init__(
  1295. self, "str3ds_metadata", ident, title, description
  1296. )
  1297. self.set_raster3d_register(raster3d_register)
  1298. self.D["tbres_min"] = None
  1299. self.D["tbres_max"] = None
  1300. def set_raster3d_register(self, raster3d_register):
  1301. """Set the raster map register table name"""
  1302. self.D["raster3d_register"] = raster3d_register
  1303. def get_raster3d_register(self):
  1304. """Get the raster3d map register table name
  1305. :return: None if not found"""
  1306. if "raster3d_register" in self.D:
  1307. return self.D["raster3d_register"]
  1308. else:
  1309. return None
  1310. def get_tbres_min(self):
  1311. """Get the minimal top-bottom resolution of all registered maps,
  1312. this value is set in the database
  1313. automatically via SQL, so no setter exists
  1314. :return: None if not found"""
  1315. if "tbres_min" in self.D:
  1316. return self.D["tbres_min"]
  1317. else:
  1318. return None
  1319. def get_tbres_max(self):
  1320. """Get the maximal top-bottom resolution of all registered maps,
  1321. this value is set in the database
  1322. automatically via SQL, so no setter exists
  1323. :return: None if not found"""
  1324. if "tbres_max" in self.D:
  1325. return self.D["tbres_max"]
  1326. else:
  1327. return None
  1328. raster3d_register = property(fget=get_raster3d_register, fset=set_raster3d_register)
  1329. tbres_min = property(fget=get_tbres_min)
  1330. tbres_max = property(fget=get_tbres_max)
  1331. def _print_info_body(self, shell=False):
  1332. """Print information about this class (body part).
  1333. :param bool shell: True for human readable style otherwise shell style
  1334. """
  1335. if shell:
  1336. print("raster3d_register=" + str(self.get_raster3d_register()))
  1337. print("tbres_min=" + str(self.get_tbres_min()))
  1338. print("tbres_max=" + str(self.get_tbres_max()))
  1339. else:
  1340. print(
  1341. " | 3D raster register table:... " + str(self.get_raster3d_register())
  1342. )
  1343. print(" | Top-bottom resolution min:.. " + str(self.get_ewres_min()))
  1344. print(" | Top-bottom resolution max:.. " + str(self.get_ewres_max()))
  1345. super()._print_info_body(shell)
  1346. ###############################################################################
  1347. class STVDSMetadata(STDSMetadataBase):
  1348. """This is the space time vector dataset metadata class
  1349. This class is the interface to the stvds_metadata table in the
  1350. temporal database that stores the metadata of all registered
  1351. space time vector datasets
  1352. Most of the metadata values are set by SQL scripts in the database when
  1353. new vector maps are added. Therefor only some set- an many get-functions
  1354. are available.
  1355. Usage:
  1356. .. code-block:: python
  1357. >>> init()
  1358. >>> meta = STVDSMetadata(ident="lidars@PERMANENT",
  1359. ... title="LIDARS", description="LIDARS 2008 - 2010")
  1360. >>> meta.id
  1361. 'lidars@PERMANENT'
  1362. >>> meta.title
  1363. 'LIDARS'
  1364. >>> meta.description
  1365. 'LIDARS 2008 - 2010'
  1366. >>> meta.number_of_maps
  1367. >>> meta.number_of_points
  1368. >>> meta.number_of_lines
  1369. >>> meta.number_of_boundaries
  1370. >>> meta.number_of_centroids
  1371. >>> meta.number_of_faces
  1372. >>> meta.number_of_kernels
  1373. >>> meta.number_of_primitives
  1374. >>> meta.number_of_nodes
  1375. >>> meta.number_of_areas
  1376. >>> meta.number_of_islands
  1377. >>> meta.number_of_holes
  1378. >>> meta.number_of_volumes
  1379. >>> meta.print_info()
  1380. +-------------------- Metadata information ----------------------------------+
  1381. | Vector register table:...... None
  1382. | Number of points ........... None
  1383. | Number of lines ............ None
  1384. | Number of boundaries ....... None
  1385. | Number of centroids ........ None
  1386. | Number of faces ............ None
  1387. | Number of kernels .......... None
  1388. | Number of primitives ....... None
  1389. | Number of nodes ............ None
  1390. | Number of areas ............ None
  1391. | Number of islands .......... None
  1392. | Number of holes ............ None
  1393. | Number of volumes .......... None
  1394. | Number of registered maps:.. None
  1395. |
  1396. | Title:
  1397. | LIDARS
  1398. | Description:
  1399. | LIDARS 2008 - 2010
  1400. | Command history:
  1401. >>> meta.print_shell_info()
  1402. vector_register=None
  1403. points=None
  1404. lines=None
  1405. boundaries=None
  1406. centroids=None
  1407. faces=None
  1408. kernels=None
  1409. primitives=None
  1410. nodes=None
  1411. areas=None
  1412. islands=None
  1413. holes=None
  1414. volumes=None
  1415. number_of_maps=None
  1416. """
  1417. def __init__(self, ident=None, vector_register=None, title=None, description=None):
  1418. STDSMetadataBase.__init__(self, "stvds_metadata", ident, title, description)
  1419. self.set_vector_register(vector_register)
  1420. self.D["points"] = None
  1421. self.D["lines"] = None
  1422. self.D["boundaries"] = None
  1423. self.D["centroids"] = None
  1424. self.D["faces"] = None
  1425. self.D["kernels"] = None
  1426. self.D["primitives"] = None
  1427. self.D["nodes"] = None
  1428. self.D["areas"] = None
  1429. self.D["islands"] = None
  1430. self.D["holes"] = None
  1431. self.D["volumes"] = None
  1432. def set_vector_register(self, vector_register):
  1433. """Set the vector map register table name"""
  1434. self.D["vector_register"] = vector_register
  1435. def get_vector_register(self):
  1436. """Get the vector map register table name
  1437. :return: None if not found"""
  1438. if "vector_register" in self.D:
  1439. return self.D["vector_register"]
  1440. else:
  1441. return None
  1442. def get_number_of_points(self):
  1443. """Get the number of points of all registered maps,
  1444. this value is set in the database
  1445. automatically via SQL, so no setter exists
  1446. :return: None if not found"""
  1447. if "points" in self.D:
  1448. return self.D["points"]
  1449. else:
  1450. return None
  1451. def get_number_of_lines(self):
  1452. """Get the number of lines of all registered maps,
  1453. this value is set in the database
  1454. automatically via SQL, so no setter exists
  1455. :return: None if not found"""
  1456. if "lines" in self.D:
  1457. return self.D["lines"]
  1458. else:
  1459. return None
  1460. def get_number_of_boundaries(self):
  1461. """Get the number of boundaries of all registered maps,
  1462. this value is set in the database
  1463. automatically via SQL, so no setter exists
  1464. :return: None if not found"""
  1465. if "boundaries" in self.D:
  1466. return self.D["boundaries"]
  1467. else:
  1468. return None
  1469. def get_number_of_centroids(self):
  1470. """Get the number of centroids of all registered maps,
  1471. this value is set in the database
  1472. automatically via SQL, so no setter exists
  1473. :return: None if not found"""
  1474. if "centroids" in self.D:
  1475. return self.D["centroids"]
  1476. else:
  1477. return None
  1478. def get_number_of_faces(self):
  1479. """Get the number of faces of all registered maps,
  1480. this value is set in the database
  1481. automatically via SQL, so no setter exists
  1482. :return: None if not found"""
  1483. if "faces" in self.D:
  1484. return self.D["faces"]
  1485. else:
  1486. return None
  1487. def get_number_of_kernels(self):
  1488. """Get the number of kernels of all registered maps,
  1489. this value is set in the database
  1490. automatically via SQL, so no setter exists
  1491. :return: None if not found"""
  1492. if "kernels" in self.D:
  1493. return self.D["kernels"]
  1494. else:
  1495. return None
  1496. def get_number_of_primitives(self):
  1497. """Get the number of primitives of all registered maps,
  1498. this value is set in the database
  1499. automatically via SQL, so no setter exists
  1500. :return: None if not found"""
  1501. if "primitives" in self.D:
  1502. return self.D["primitives"]
  1503. else:
  1504. return None
  1505. def get_number_of_nodes(self):
  1506. """Get the number of nodes of all registered maps,
  1507. this value is set in the database
  1508. automatically via SQL, so no setter exists
  1509. :return: None if not found"""
  1510. if "nodes" in self.D:
  1511. return self.D["nodes"]
  1512. else:
  1513. return None
  1514. def get_number_of_areas(self):
  1515. """Get the number of areas of all registered maps,
  1516. this value is set in the database
  1517. automatically via SQL, so no setter exists
  1518. :return: None if not found"""
  1519. if "areas" in self.D:
  1520. return self.D["areas"]
  1521. else:
  1522. return None
  1523. def get_number_of_islands(self):
  1524. """Get the number of islands of all registered maps,
  1525. this value is set in the database
  1526. automatically via SQL, so no setter exists
  1527. :return: None if not found"""
  1528. if "islands" in self.D:
  1529. return self.D["islands"]
  1530. else:
  1531. return None
  1532. def get_number_of_holes(self):
  1533. """Get the number of holes of all registered maps,
  1534. this value is set in the database
  1535. automatically via SQL, so no setter exists
  1536. :return: None if not found"""
  1537. if "holes" in self.D:
  1538. return self.D["holes"]
  1539. else:
  1540. return None
  1541. def get_number_of_volumes(self):
  1542. """Get the number of volumes of all registered maps,
  1543. this value is set in the database
  1544. automatically via SQL, so no setter exists
  1545. :return: None if not found"""
  1546. if "volumes" in self.D:
  1547. return self.D["volumes"]
  1548. else:
  1549. return None
  1550. # Set the properties
  1551. vector_register = property(fget=get_vector_register, fset=set_vector_register)
  1552. number_of_points = property(fget=get_number_of_points)
  1553. number_of_lines = property(fget=get_number_of_lines)
  1554. number_of_boundaries = property(fget=get_number_of_boundaries)
  1555. number_of_centroids = property(fget=get_number_of_centroids)
  1556. number_of_faces = property(fget=get_number_of_faces)
  1557. number_of_kernels = property(fget=get_number_of_kernels)
  1558. number_of_primitives = property(fget=get_number_of_primitives)
  1559. number_of_nodes = property(fget=get_number_of_nodes)
  1560. number_of_areas = property(fget=get_number_of_areas)
  1561. number_of_islands = property(fget=get_number_of_islands)
  1562. number_of_holes = property(fget=get_number_of_holes)
  1563. number_of_volumes = property(fget=get_number_of_volumes)
  1564. def _print_info_body(self, shell=False):
  1565. """Print information about this class (body part).
  1566. :param bool shell: True for human readable style otherwise shell style
  1567. """
  1568. if shell:
  1569. print("vector_register=" + str(self.get_vector_register()))
  1570. print("points=" + str(self.get_number_of_points()))
  1571. print("lines=" + str(self.get_number_of_lines()))
  1572. print("boundaries=" + str(self.get_number_of_boundaries()))
  1573. print("centroids=" + str(self.get_number_of_centroids()))
  1574. print("faces=" + str(self.get_number_of_faces()))
  1575. print("kernels=" + str(self.get_number_of_kernels()))
  1576. print("primitives=" + str(self.get_number_of_primitives()))
  1577. print("nodes=" + str(self.get_number_of_nodes()))
  1578. print("areas=" + str(self.get_number_of_areas()))
  1579. print("islands=" + str(self.get_number_of_islands()))
  1580. print("holes=" + str(self.get_number_of_holes()))
  1581. print("volumes=" + str(self.get_number_of_volumes()))
  1582. else:
  1583. print(" | Vector register table:...... " + str(self.get_vector_register()))
  1584. print(" | Number of points ........... " + str(self.number_of_points))
  1585. print(" | Number of lines ............ " + str(self.number_of_lines))
  1586. print(" | Number of boundaries ....... " + str(self.number_of_boundaries))
  1587. print(" | Number of centroids ........ " + str(self.number_of_centroids))
  1588. print(" | Number of faces ............ " + str(self.number_of_faces))
  1589. print(" | Number of kernels .......... " + str(self.number_of_kernels))
  1590. print(" | Number of primitives ....... " + str(self.number_of_primitives))
  1591. print(" | Number of nodes ............ " + str(self.number_of_nodes))
  1592. print(" | Number of areas ............ " + str(self.number_of_areas))
  1593. print(" | Number of islands .......... " + str(self.number_of_islands))
  1594. print(" | Number of holes ............ " + str(self.number_of_holes))
  1595. print(" | Number of volumes .......... " + str(self.number_of_volumes))
  1596. ###############################################################################
  1597. if __name__ == "__main__":
  1598. import doctest
  1599. doctest.testmod()