metadata.py 61 KB

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