metadata.py 61 KB

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