Guest User

Untitled

a guest
Nov 6th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.01 KB | None | 0 0
  1. from Tkinter import *
  2. from Queue import Queue, Empty
  3. from subprocess import Popen, PIPE
  4. from threading import Thread
  5. from osgeo import gdal, ogr, osr
  6. import tkFileDialog
  7. import ttk
  8. from ttk import Treeview, Scrollbar, Style
  9. import os, datetime, time
  10. from time import gmtime, strftime
  11. import subprocess,shlex
  12. import psycopg2 as psycopg
  13. from psycopg2 import sql
  14. import platform
  15.  
  16. def iter_except(function, exception):
  17. try:
  18. while True:
  19. yield function()
  20. except exception:
  21. return
  22.  
  23.  
  24. #TODO Napraviti scrollbar
  25. #TODO Kopiranje u mozaik
  26. #TODO Konfiguracija - zavrsiti
  27.  
  28. class Main_Importer_GUI:
  29.  
  30. def __init__(self, master):
  31.  
  32. self.mod_py = False
  33.  
  34. self.source_dir = '/home/dboto/Documents/python/raster'
  35. self.mosaic_dir = '/home/dboto/Documents/python/raster'
  36. self.mosaic_srs = '3765'
  37.  
  38. self.pg_host = 'localhost'
  39. self.pg_db = 'gis'
  40. self.pg_table = 'drone_mosaic'
  41. self.pg_uname = 'postgres'
  42. self.pg_pass = 'postgres'
  43.  
  44. # --------------------------------------------------------------------------
  45. master = master
  46. master.minsize(400, 700)
  47. master.resizable(0, 0)
  48. master.title("KING ICT Drone images importer")
  49. # --------------------------------------------------------------------------
  50. menubar = Menu(root)
  51.  
  52. filemenu = Menu(menubar)
  53. filemenu.add_command(label='New Project')
  54. filemenu.add_command(label='Configuration', command=self.config_window)
  55. filemenu.add_command(label='Load Files...', command=self.select_file)
  56. filemenu.add_command(label='Exit', command=root.quit)
  57. menubar.add_cascade(label="File", menu=filemenu)
  58.  
  59. datamenu = Menu(menubar)
  60. datamenu.add_command(label='Show data', command=self.data_window)
  61. menubar.add_cascade(label="Data", menu=datamenu)
  62.  
  63. master.config(menu=menubar)
  64.  
  65. # --------------------------------------------------------------------------
  66.  
  67. label_1 = Label(master, text="Odaberite TIF datoteku za import")
  68. label_1.grid(sticky="W", column=0, row=0, padx=(10, 50))
  69.  
  70. self.tiff_filepath = StringVar()
  71. self.selected_TIFF = Entry(master, width=60, textvariable=self.tiff_filepath)
  72. self.selected_TIFF.grid(sticky="W", column=0, row=1, padx=(10, 10))
  73.  
  74. select_TIF_file = Button(master, text="Odaberi", command=self.select_file)
  75. select_TIF_file.grid(sticky="E", column=0, row=1, padx=(10, 10))
  76.  
  77. selected_label = Label(master, text="Odabrane TIFF datoteke:")
  78. selected_label.grid(sticky="W", column=0, row=2, padx=(10, 50))
  79.  
  80. self.file_box = Listbox(master, width=70, height=8)
  81. self.file_box.grid(sticky="W", column=0, row=3, padx=(10, 10))
  82.  
  83. site_label = Label(root, text="Unesite lokaciju snimanja", font=(None, 8))
  84. site_label.grid(sticky="W", column=0, row=4, padx=(10, 50))
  85.  
  86. self.entry_site = StringVar()
  87. self.site_text = Entry(master, width=40, textvariable=self.entry_site)
  88. self.site_text.grid(sticky="W", column=0, row=4, padx=(170, 10))
  89.  
  90. date_label = Label(root, text="Unesite datum snimanja", font=(None, 8))
  91. date_label.grid(sticky="W", column=0, row=5, padx=(10, 50))
  92.  
  93. self.entry_day = StringVar()
  94. self.date_day = Entry(master, width=3, textvariable=self.entry_day)
  95. self.date_day.grid(sticky="W", column=0, row=5, padx=(170, 200))
  96.  
  97. self.entry_month = StringVar()
  98. self.date_month = Entry(master, width=3, textvariable=self.entry_month)
  99. self.date_month.grid(sticky="W", column=0, row=5, padx=(195, 10))
  100.  
  101. self.entry_year = StringVar()
  102. self.date_year = Entry(master, width=4, textvariable=self.entry_year)
  103. self.date_year.grid(sticky="W", column=0, row=5, padx=(220, 10))
  104.  
  105. output_label = Label(root, text="Output", font=(None, 8))
  106. output_label.grid(sticky="W", column=0, row=6, padx=(10, 50))
  107.  
  108. self.output = Listbox(root, width=70, height=30, bg="black", fg="#00ff00")
  109. self.output.grid(sticky="W", column=0, row=7, padx=(10, 10))
  110.  
  111. self.progress = ttk.Progressbar(root, orient='horizontal', maximum=100, length=560, mode='determinate')
  112. self.progress.grid(sticky="W", column=0, row=8, padx=(10, 10))
  113.  
  114. self.start = Button(master, text="Pokreni import", command=self.start_process, state=DISABLED)
  115. self.start.grid(column=0, row=9, padx=(10, 10))
  116. # --------------------------------------------------------------------------
  117.  
  118. def select_file(self):
  119. self.selected_tif_paths = tkFileDialog.askopenfilenames(initialdir=self.source_dir, title="Odaberi", filetypes=(("tiff files", "*.tif"), ("all files", "*.*")))
  120. self.tiff_filepath.set(self.selected_tif_paths)
  121.  
  122. self.file_box.delete(0, 'end')
  123.  
  124. for fileName in self.selected_tif_paths:
  125. self.file_box.insert(END, fileName)
  126. # --------------------------------------------------------------------------
  127.  
  128. self.tiff_path = gdal.Open(fileName)
  129. tiff_srs = osr.SpatialReference(wkt=self.tiff_path.GetProjection())
  130. tiff_gt = self.tiff_path.GetGeoTransform()
  131. tif_band = self.tiff_path.GetRasterBand(1)
  132.  
  133. self.tiff_bands = self.tiff_path.RasterCount
  134. self.tiff_srid = tiff_srs.GetAttrValue("AUTHORITY", 1)
  135. self.tiff_ctime = time.ctime(os.path.getctime(fileName))
  136. self.tiff_pixel = tiff_gt[1]
  137. self.tiff_nodata = tif_band.GetNoDataValue()
  138. # -----------------------------------------------------------------------
  139. c_time_in_seconds = os.path.getctime(os.path.join(fileName))
  140. c_time_array = str(time.gmtime(c_time_in_seconds)[:3])
  141. c_date_str = ''.join(c_time_array)
  142. c_datetime_obj = datetime.datetime.strptime(c_date_str, '(%Y, %d, %m)')
  143.  
  144. self.created_date = c_datetime_obj.date()
  145. self.current_date = strftime('(%Y, %d, %m)', gmtime())
  146.  
  147. self.file_box.insert(END, ' FILE NAME_= %s' % os.path.basename(fileName))
  148. self.file_box.insert(END, ' BANDS NUM_= %s' % self.tiff_bands)
  149. self.file_box.insert(END, ' PIXEL SIZE = %s' % tiff_gt[1])
  150. self.file_box.insert(END, ' SRID_= %s' % self.tiff_srid)
  151. self.file_box.insert(END, ' CREATE DATE = %s' % self.created_date)
  152. self.file_box.insert(END, ' CURRENT DATE = %s' % self.current_date)
  153. self.file_box.insert(END, ' NO DATA = %s' % self.tiff_nodata)
  154. self.file_box.insert(END, ' # ----------------------------------------------------------')
  155.  
  156. self.entry_site.set(os.path.basename(fileName[:-4]))
  157. self.entry_year.set(c_date_str.split(",")[0][1:])
  158. self.entry_month.set(c_date_str.split(",")[1][1:])
  159. self.entry_day.set(c_date_str.split(",")[2][:-1])
  160.  
  161. if self.tiff_bands < 4:
  162. self.output.insert(1, '*** ERROR: Odabrana TIFF datoteka nema ALPHA kanal! ***')
  163. self.output.itemconfig(0, {'bg':'black'})
  164. self.output.itemconfig(0, {'fg': 'red'})
  165. self.start.configure(state='disable')
  166. else:
  167. self.output.delete(0)
  168. self.start.configure(state='normal')
  169. # --------------------------------------------------------------------------
  170.  
  171. def start_process(self):
  172. self.start.configure(state='disable')
  173. self.progress.start(100)
  174.  
  175. for tiff_path in self.selected_tif_paths:
  176.  
  177. self.output.insert(END, "**************************GDAL PROCESSING - TIFF OPTIMIZACIJA***************************")
  178. self.output.insert(END, "INPUT FILE NAME IS: ---- %s ----" % (os.path.basename(tiff_path)))
  179. # ----------------------------------------------------------------------
  180. # ----------------------------------------------------------------------
  181.  
  182. tmp_vrt = tiff_path[:-4] + '_OPT.vrt'
  183.  
  184. if self.mod_py:
  185. output_vrt = gdal.BuildVRT(tmp_vrt, tiff_path, bandList = [1,2,3], callback=gdal.TermProgress)
  186. else:
  187. buildvrt_opt = '-b 1 -b 2 -b 3'
  188. buildvrt_sys = '-overwrite'
  189. buildvrt_cmd = 'gdalbuildvrt %s %s %s %s' % (os.path.basename(tmp_vrt), buildvrt_opt, buildvrt_sys, os.path.basename(tiff_path))
  190. self.process_output(buildvrt_cmd)
  191. # ---------------------------------------------------------------------
  192.  
  193. output_tiff = tiff_path[:-4] + '_OPT.tif'
  194.  
  195. if self.mod_py:
  196. gdal.Warp(output_tiff,
  197. tmp_vrt,
  198. dstSRS = 'EPSG:{}'.format(self.mosaic_srs),
  199. srcSRS = 'EPSG:{}'.format(self.tiff_srid),
  200. srcNodata = self.tiff_nodata,
  201. dstNodata = 255,
  202. format = 'GTiff',
  203. creationOptions=['PHOTOMETRIC=YCBCR', 'COMPRESS=JPEG', 'TILED=YES'], callback=gdal.TermProgress)
  204. else:
  205. gdalwarp_opt = '-srcnodata {} -dstnodata 255 -co "PHOTOMETRIC=YCBCR" -co "COMPRESS=JPEG" -co "TILED=YES"'.format(self.tiff_nodata)
  206. gdalwarp_sys = '-overwrite -wo NUM_THREADS=ALL_CPUS -multi'
  207. gdalwarp_srs = '-s_srs EPSG:{} -t_srs EPSG:{}'.format(self.tiff_srid, self.mosaic_srs)
  208. gdalwarp_cmd = 'gdalwarp %s %s %s %s %s' % (gdalwarp_opt, gdalwarp_srs, gdalwarp_sys, os.path.basename(tmp_vrt), os.path.basename(output_tiff))
  209. self.process_output(gdalwarp_cmd)
  210.  
  211. # ---------------------------------------------------------------------
  212. tiff_opt = gdal.Open(output_tiff, 0)
  213.  
  214. if self.mod_py:
  215. gdal.SetConfigOption('COMPRESS_OVERVIEW', 'JPEG')
  216. gdal.SetConfigOption('PHOTOMETRIC_OVERVIEW', 'YCBCR')
  217. gdal.SetConfigOption('INTERLEAVE_OVERVIEW', 'PIXEL')
  218. self.process = tiff_opt.BuildOverviews("NEAREST", [2, 4, 8, 16, 32, 64, 128, 256, 512], callback=gdal.TermProgress)
  219. else:
  220. gdaladdo_opt = '-ro -r nearest --config COMPRESS_OVERVIEW JPEG --config PHOTOMETRIC_OVERVIEW YCBCR --config INTERLEAVE_OVERVIEW PIXEL'
  221. gdaladdo_sys = '2 4 8 16 32 64 128 256 512'
  222. gdaladdo_cmd = 'gdaladdo %s %s %s' % (gdaladdo_opt, os.path.basename(output_tiff), gdaladdo_sys)
  223. print gdaladdo_cmd
  224. self.process_output(gdaladdo_cmd)
  225. # ---------------------------------------------------------------------
  226. # ---------------------------------------------------------------------
  227.  
  228. gt = self.tiff_path.GetGeoTransform()
  229.  
  230. tiff_up_L = gdal.ApplyGeoTransform(gt, 0, 0) # koordinate gornjeg lijevog kuta
  231. tiff_up_R = gdal.ApplyGeoTransform(gt, self.tiff_path.RasterXSize, 0) # koordinate gornjeg desnog kuta
  232. tiff_dw_L = gdal.ApplyGeoTransform(gt, 0, self.tiff_path.RasterYSize) # koordinate donjeg lijevog kuta
  233. tiff_dw_R = gdal.ApplyGeoTransform(gt, self.tiff_path.RasterXSize, self.tiff_path.RasterYSize) # koordinate donjeg desnod kuta
  234.  
  235. gdaladdo_opt = '-ro -r nearest --config COMPRESS_OVERVIEW JPEG --config PHOTOMETRIC_OVERVIEW YCBCR --config INTERLEAVE_OVERVIEW PIXEL'
  236. gdaladdo_sys = '2 4 8 16 32 64 128 256 512'
  237. gdaladdo_cmd = 'gdaladdo %s %s %s' % (gdaladdo_opt, os.path.basename(output_tiff), gdaladdo_sys)
  238. self.process_output(gdaladdo_cmd)
  239.  
  240. # ---------------------------------------------------------------------
  241. # ---------------------------------------------------------------------
  242.  
  243. tiff_bounds_wkt = 'POLYGON((%s %s, %s %s, %s %s, %s %s, %s %s))")' % (
  244. tiff_up_L[0], tiff_up_L[1],
  245. tiff_dw_L[0], tiff_dw_L[1],
  246. tiff_dw_R[0], tiff_dw_R[1],
  247. tiff_up_R[0], tiff_up_R[1],
  248. tiff_up_L[0], tiff_up_L[1])
  249.  
  250. footprint = self.mask_footprint()
  251.  
  252. if self.tiff_srid != int(self.mosaic_srs):
  253. tiff_bounds = ogr.CreateGeometryFromWkt(tiff_bounds_wkt)
  254. tiff_bounds = self.coordinate_transform(tiff_bounds)
  255.  
  256. footprint = str(self.coordinate_transform(footprint))
  257.  
  258. # ---------------------------------------------------------------------
  259.  
  260. mask_shp_name = tiff_path[:-4] + '_OPT.shp'
  261. shp_outDriver = ogr.GetDriverByName('ESRI Shapefile')
  262.  
  263. mosaic_srs = osr.SpatialReference()
  264. mosaic_srs.ImportFromEPSG(int(self.mosaic_srs))
  265.  
  266. shp_outDataSource = shp_outDriver.CreateDataSource(mask_shp_name)
  267. shp_outLayer = shp_outDataSource.CreateLayer("mask", mosaic_srs, geom_type=ogr.wkbPolygon)
  268.  
  269. shp_idField = ogr.FieldDefn("id", ogr.OFTInteger)
  270. shp_outLayer.CreateField(shp_idField)
  271. shp_idField = ogr.FieldDefn("ND", ogr.OFTString)
  272. shp_outLayer.CreateField(shp_idField)
  273.  
  274. featureDefn = shp_outLayer.GetLayerDefn()
  275. feature = ogr.Feature(featureDefn)
  276. feature.SetGeometry(ogr.CreateGeometryFromWkt(footprint))
  277. feature.SetField("id", 1)
  278. feature.SetField("ND", os.path.basename(tiff_path)[:-4])
  279. shp_outLayer.CreateFeature(feature)
  280. feature = None
  281.  
  282. # Save and close DataSource
  283. shp_outDataSource = None
  284.  
  285. # ---------------------------------------------------------------------
  286.  
  287. self.recording_date = datetime.datetime(int(self.entry_year.get()), int(self.entry_month.get()),
  288. int(self.entry_day.get()))
  289.  
  290. # ---------------------------------------------------------------------
  291.  
  292. pg_connect = psycopg.connect('dbname=%s user=%s' % (self.pg_db, self.pg_uname))
  293. cur = pg_connect.cursor()
  294.  
  295. mosaic_insert = cur.mogrify("INSERT INTO drone_mosaic_new (ingestion, location, srid, resolution, bands, nodata, geom, site, footprint,created_on)"
  296. "VALUES( %s, %s, %s, %s, %s, %s, ST_GeomFromText(%s, {}), %s, ST_GeomFromText(%s, {}), %s)".format(self.mosaic_srs, self.mosaic_srs),
  297. (self.recording_date,
  298. tiff_path,
  299. self.tiff_srid,
  300. self.tiff_pixel,
  301. self.tiff_bands,
  302. self.tiff_nodata,
  303. tiff_bounds,
  304. self.entry_site.get(),
  305. footprint,
  306. datetime.datetime.now()))
  307. cur.execute(mosaic_insert)
  308. pg_connect.commit()
  309.  
  310. cur.close()
  311. pg_connect.close()
  312. # ---------------------------------------------------------------------
  313.  
  314. print 'KRAJ'
  315. self.progress.configure(value=100)
  316.  
  317. def mask_footprint(self):
  318. if self.tiff_bands > 3:
  319. alfa_band = self.tiff_path.GetRasterBand(4)
  320.  
  321. tmp_vector_mem = ogr.GetDriverByName('MEMORY').CreateDataSource('mask.shp')
  322.  
  323. tmp_vector_layer = tmp_vector_mem.CreateLayer('polygonized', srs=None)
  324. tmp_vector_field = ogr.FieldDefn('mask', ogr.OFTInteger)
  325. tmp_vector_layer.CreateField(tmp_vector_field)
  326.  
  327. gdal.Polygonize(alfa_band, None, tmp_vector_layer, 0, [], callback=gdal.TermProgress)
  328.  
  329. for feature in tmp_vector_layer:
  330. if feature.GetField("mask") == 255:
  331. geometry = feature.GetGeometryRef()
  332. symplifyed_footprint = geometry.Simplify(2.0)
  333.  
  334. return symplifyed_footprint
  335.  
  336. def coordinate_transform(self, geometry_trans):
  337.  
  338. source_srs = osr.SpatialReference()
  339. source_srs.ImportFromEPSG(int(self.tiff_srid))
  340.  
  341. self.target_srs = osr.SpatialReference()
  342. self.target_srs.ImportFromEPSG(int(self.mosaic_srs))
  343.  
  344. transform = osr.CoordinateTransformation(source_srs, self.target_srs)
  345. geometry_trans.Transform(transform)
  346.  
  347. return str(geometry_trans)
  348.  
  349. def process_output(self, process_cmd):
  350.  
  351. self.process = Popen(shlex.split(process_cmd), stdout=PIPE, stderr=PIPE, cwd=self.source_dir)
  352. q = Queue(maxsize=1024)
  353. t = Thread(target=self.reader_thread, args=[q])
  354. t.daemon = True
  355. t.start()
  356.  
  357. self.update(q)
  358.  
  359. def reader_thread(self, q):
  360. try:
  361. with self.process.stdout as pipe:
  362. for line in iter(pipe.readline, b''):
  363. q.put(line)
  364. finally:
  365. q.put(None)
  366.  
  367. def update(self, q):
  368. # TODO di staviti wait govno?
  369. self.process.wait()
  370. for line in iter_except(q.get_nowait, Empty):
  371. if line is None:
  372. self.progress.stop()
  373. self.progress.configure(value=100)
  374. #self.quit()
  375. return
  376. else:
  377. self.output.insert(END, line[:-1])
  378. break
  379. self.file_box.after(50, self.update, q)
  380.  
  381. def quit(self):
  382. self.process.kill()
  383.  
  384. # ---------------------------------------------------------------------
  385. # ---------------------------------------------------------------------
  386.  
  387. def config_window(self):
  388. config_win = Toplevel(root)
  389. config_win = config_win
  390. config_win.minsize(400, 700)
  391. config_win.resizable(0, 0)
  392. config_win.title("KING ICT Importer Config")
  393. # ---------------------------------------------------------------------
  394. config_warrning = Label(config_win, text="Upozorenje: Promjena parametara moze dovesti do neispravnog\n rada programa", fg="red")
  395. config_warrning.grid(columnspan=2, column=0, row=0, padx=(10, 50))
  396.  
  397. self.config_active = IntVar()
  398. config_activ = Checkbutton(config_win, text='Izmjena parametara konfiguracije', variable=self.config_active, command=self.config_activate)
  399. config_activ.grid(sticky="W", columnspan=2, column=0, row=1, padx=(10, 10))
  400.  
  401. config_source_lab = Label(config_win, text="TIFF direktorij")
  402. config_source_lab.grid(sticky="W", column=0, row=2, padx=(10, 50))
  403.  
  404. self.config_source_dir_text = StringVar()
  405. self.config_source_dir = Entry(config_win, width=30, state=DISABLED, textvariable=self.config_source_dir_text)
  406. self.config_source_dir.grid(sticky="W", column=1, row=2, padx=(10, 10))
  407. self.config_source_dir_text.set(self.source_dir)
  408.  
  409. config_mosaic_lab = Label(config_win, text="Mozaik direktorij")
  410. config_mosaic_lab.grid(sticky="W", column=0, row=3, padx=(10, 50))
  411.  
  412. self.config_mosaic_dir_text = StringVar()
  413. self.config_mosaic_dir = Entry(config_win, width=30, state=DISABLED, textvariable=self.config_mosaic_dir_text)
  414. self.config_mosaic_dir.grid(sticky="W", column=1, row=3, padx=(10, 10))
  415. self.config_mosaic_dir_text.set(self.mosaic_dir)
  416.  
  417. config_pg_host_label = Label(config_win, text="PG Host")
  418. config_pg_host_label.grid(sticky="W", column=0, row=4, padx=(10, 50))
  419.  
  420. self.config_pg_host_text = StringVar()
  421. self.config_pg_host = Entry(config_win, width=30, state=DISABLED, textvariable=self.config_pg_host_text)
  422. self.config_pg_host.grid(sticky="W", column=1, row=4, padx=(10, 10))
  423. self.config_pg_host_text.set(self.pg_host)
  424.  
  425. config_pg_db_label = Label(config_win, text="PG Baza")
  426. config_pg_db_label.grid(sticky="W", column=0, row=5, padx=(10, 50))
  427.  
  428. self.config_pg_db_text = StringVar()
  429. self.config_pg_db = Entry(config_win, width=30, state=DISABLED, textvariable=self.config_pg_db_text)
  430. self.config_pg_db.grid(sticky="W", column=1, row=5, padx=(10, 10))
  431. self.config_pg_db_text.set(self.pg_db)
  432.  
  433. config_pg_uname_label = Label(config_win, text="PG Ime")
  434. config_pg_uname_label.grid(sticky="W", column=0, row=6, padx=(10, 50))
  435.  
  436. self.config_pg_uname_text = StringVar()
  437. self.config_pg_uname = Entry(config_win, width=30, state=DISABLED, textvariable=self.config_pg_uname_text)
  438. self.config_pg_uname.grid(sticky="W", column=1, row=6, padx=(10, 10))
  439. self.config_pg_uname_text.set(self.pg_uname)
  440.  
  441. config_pg_pass_label = Label(config_win, text="TIFF Zaporka")
  442. config_pg_pass_label.grid(sticky="W", column=0, row=7, padx=(10, 50))
  443.  
  444. self.config_pg_pass_text = StringVar()
  445. self.config_pg_pass = Entry(config_win, width=30, state=DISABLED, textvariable=self.config_pg_pass_text)
  446. self.config_pg_pass.grid(sticky="W", column=1, row=7, padx=(10, 10))
  447. self.config_pg_pass_text.set(self.pg_pass)
  448.  
  449. def config_activate(self):
  450. if self.config_active.get() == 0:
  451. self.config_source_dir.configure(state='disabled')
  452. self.config_mosaic_dir.configure(state='disabled')
  453. self.config_pg_host.configure(state='disabled')
  454. self.config_pg_db.configure(state='disabled')
  455. self.config_pg_uname.configure(state='disabled')
  456. self.config_pg_pass.configure(state='disabled')
  457.  
  458. else:
  459. self.config_source_dir.configure(state='normal')
  460. self.config_mosaic_dir.configure(state='normal')
  461. self.config_pg_host.configure(state='normal')
  462. self.config_pg_db.configure(state='normal')
  463. self.config_pg_uname.configure(state='normal')
  464. self.config_pg_pass.configure(state='normal')
  465.  
  466. # ---------------------------------------------------------------------
  467. # ---------------------------------------------------------------------
  468.  
  469. def data_window(self):
  470. data_win = Toplevel(root)
  471. data_win.title("KING ICT Importer Mosaic Data")
  472. data_win.resizable(0, 0)
  473. # ---------------------------------------------------------------------
  474. table_frame = ttk.Treeview(data_win, selectmode="browse", column=("column1", "column2", "column3", "column4", "column5", "column6", "column7", "column8", "column9"), show='headings')
  475.  
  476. scrollbar = Scrollbar(data_win, orient="vertical", command=table_frame.yview)
  477. scrollbar.grid(sticky='nse', column=1, row=0)
  478. table_frame.configure(yscrollcommand=scrollbar.set)
  479. # ---------------------------------------------------------------------
  480. table_frame.heading("#1", text="ID")
  481. table_frame.heading("#2", text="URI")
  482. table_frame.heading("#3", text="Datum snimanja")
  483. table_frame.heading("#4", text="Datum importa")
  484. table_frame.heading("#5", text="SRID")
  485. table_frame.heading("#6", text="Lokacija")
  486. table_frame.heading("#7", text="Bendova")
  487. table_frame.heading("#8", text="NoData")
  488. table_frame.heading("#9", text="Rezolucija")
  489.  
  490. table_frame.column("#1", minwidth=0, width=30)
  491. table_frame.column("#2", minwidth=0, width=400)
  492. table_frame.column("#3", minwidth=0, width=150)
  493. table_frame.column("#4", minwidth=0, width=150)
  494. table_frame.column("#5", minwidth=0, width=70)
  495. table_frame.column("#6", minwidth=0, width=150)
  496. table_frame.column("#7", minwidth=0, width=60)
  497. table_frame.column("#8", minwidth=0, width=60)
  498. table_frame.column("#9", minwidth=0, width=60)
  499.  
  500. table_frame.grid(sticky="W", column=0, row=0, padx=(0, 0))
  501.  
  502. # ---------------------------------------------------------------------
  503. pg_connect = psycopg.connect('dbname=%s user=%s' % (self.pg_db, self.pg_uname))
  504. cur = pg_connect.cursor()
  505.  
  506. select_data = "SELECT fid, location, ingestion, created_on, srid, site, bands, nodata, resolution FROM drone_mosaic_new"
  507. cur.execute(select_data)
  508. mosaic_data = cur.fetchall()
  509.  
  510. for row in mosaic_data:
  511. table_frame.insert('', END, values=row)
  512.  
  513. cur.close()
  514. pg_connect.close()
  515. # ---------------------------------------------------------------------
  516.  
  517. root = Tk()
  518. my_gui = Main_Importer_GUI(root)
  519. root.mainloop()
Add Comment
Please, Sign In to add comment