diff --git a/README.md b/README.md index a8ac074..ae23750 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,17 @@ QGIS PgHydroTools Plugin is an interface used in QGIS to activate all functionality of PgHydro Extension for PostgreSQL/PostGIS. -To use this plugin, you have to install the PgHydro 6.2 extension for PostgreSQL/PostGIS at https://github.com/pghydro/pghydro +To use this plugin, you have to install the PgHydro 6.4 extension for PostgreSQL/PostGIS at https://github.com/pghydro/pghydro # STATUS ## Branches -The master branch has the latest minor release. (2.2) +The master branch has the latest minor release. (2.4) -The develop branch has the next minor release. (2.3-dev) +The develop branch has the next minor release. (2.5-dev) -Next LTR: version 2.4 (Julho 2018) +Next LTR: version 2.6 (February 2022) # INTRODUCTION @@ -30,11 +30,11 @@ PostGIS version 2.0+ QGIS version 2.14+ -Pghydro 6.2 +Pghydro 6.4 -Pghydro Consistency 6.2 +Pghydro Consistency 6.4 -Pghydro Output 6.2 +Pghydro Output 6.4 ## INSTALLATION diff --git a/metadata.txt b/metadata.txt index dba9f7e..591cc08 100644 --- a/metadata.txt +++ b/metadata.txt @@ -10,7 +10,7 @@ name=Pghydro Tools qgisMinimumVersion=2.0 description=PgHydro Tools Interface for PgHydro Extension for PostgreSQL/PostGIS -version=2.2 +version=2.4 author=PgHydro Team email=pghydro.project@gmail.com @@ -36,6 +36,14 @@ repository=www.github.com/pghydro/pghydrotools - Insert of new version logo - Resource_rc bug fixed including and not more deleting codes. - ... + 2.4 - Rename "Connect" label button to "Test Connection" + - Update Version labels to version 2.4 + - Uncheck "Add Pfafstetter Basin Coding Columns" + - Update port to 5432 + - Insert offset to watercourse + - Create spatial index to drn_gm_point geometry column in the table pghydro.pghft_drainage_line after Consist "Drainage Line x Drainage Area" check + - Execution of Vacuum, Analyse and Reindex after each major processing + - ... # Tags are comma separated with spaces allowed tags=spatial database system, otto pfafstetter, drainage, hydrology, hydrography, hydro @@ -47,5 +55,4 @@ icon=icon.png experimental=False # deprecated flag (applies to the whole plugin, not just a single version) -deprecated=False - +deprecated=False \ No newline at end of file diff --git a/pghydro_tools.py b/pghydro_tools.py index 4844184..89b0494 100644 --- a/pghydro_tools.py +++ b/pghydro_tools.py @@ -5,9 +5,9 @@ A QGIS plugin This plugin create the pghydro schema and runs all the process to consist a drainage network ------------------- - begin : 2015-10-07 + begin : 2020-01-31 git sha : $Format:%H$ - copyright : (C) 2015 by Alexandre de Amorim Teixeira + copyright : (C) 2020 by Alexandre de Amorim Teixeira email : pghydro.project@gmail.com ***************************************************************************/ @@ -227,56 +227,6 @@ def unload(self): ###Database Editing - def execute_sql(self, sql): - host = self.dlg.lineEdit_host.text() - port = self.dlg.lineEdit_port.text() - dbname = self.dlg.lineEdit_base.text() - schema = self.dlg.lineEdit_schema.text() - user = self.dlg.lineEdit_user.text() - password = self.dlg.lineEdit_password.text() - connection_str = 'host={0} port={1} dbname={2} user={3} password={4}'.format(host, port, dbname, user, password) - - try: - conn = None - conn = psycopg2.connect(connection_str) - conn.autocommit = True - cur = conn.cursor() - cur.execute(sql) - cur.close() - conn.close() - - except: - self.print_console_message('ERROR\nCheck Database Input Parameters!') - - def return_sql(self, sql): - host = self.dlg.lineEdit_host.text() - port = self.dlg.lineEdit_port.text() - dbname = self.dlg.lineEdit_base.text() - schema = self.dlg.lineEdit_schema.text() - user = self.dlg.lineEdit_user.text() - password = self.dlg.lineEdit_password.text() - connection_str = 'host={0} port={1} dbname={2} user={3} password={4}'.format(host, port, dbname, user, password) - - try: - conn = None - conn = psycopg2.connect(connection_str) - conn.autocommit = True - cur = conn.cursor() - cur.execute(sql) - result = str(cur.fetchone()[0]) - cur.close() - conn.close() - return result - - except: - self.print_console_message('ERROR\nCheck Database Input Parameters!') - - def print_console_message(self, message): - - self.dlg.console.append(time.strftime("\n%d.%m.%Y"+" - "+"%H"+":"+"%M"+":"+"%S")) - self.dlg.console.append(message) - self.dlg.console.repaint() - def create_database(self): host = self.dlg.lineEdit_host.text() port = self.dlg.lineEdit_port.text() @@ -322,7 +272,7 @@ def create_database(self): self.execute_sql(create_pghydro) - self.print_console_message("PgHydro Extension successfully Created!\n") + self.print_console_message("PgHydro Extension Successfully Created!\n") self.execute_sql(create_pgh_consistency) @@ -357,6 +307,56 @@ def connect_database(self): except: self.print_console_message('ERROR\nCheck Database Input Parameters!') + def execute_sql(self, sql): + host = self.dlg.lineEdit_host.text() + port = self.dlg.lineEdit_port.text() + dbname = self.dlg.lineEdit_base.text() + schema = self.dlg.lineEdit_schema.text() + user = self.dlg.lineEdit_user.text() + password = self.dlg.lineEdit_password.text() + connection_str = 'host={0} port={1} dbname={2} user={3} password={4}'.format(host, port, dbname, user, password) + + try: + conn = None + conn = psycopg2.connect(connection_str) + conn.autocommit = True + cur = conn.cursor() + cur.execute(sql) + cur.close() + conn.close() + + except: + self.print_console_message('ERROR\nCheck Database Input Parameters!') + + def return_sql(self, sql): + host = self.dlg.lineEdit_host.text() + port = self.dlg.lineEdit_port.text() + dbname = self.dlg.lineEdit_base.text() + schema = self.dlg.lineEdit_schema.text() + user = self.dlg.lineEdit_user.text() + password = self.dlg.lineEdit_password.text() + connection_str = 'host={0} port={1} dbname={2} user={3} password={4}'.format(host, port, dbname, user, password) + + try: + conn = None + conn = psycopg2.connect(connection_str) + conn.autocommit = True + cur = conn.cursor() + cur.execute(sql) + result = str(cur.fetchone()[0]) + cur.close() + conn.close() + return result + + except: + self.print_console_message('ERROR\nCheck Database Input Parameters!') + + def print_console_message(self, message): + + self.dlg.console.append(time.strftime("\n%d.%m.%Y"+" - "+"%H"+":"+"%M"+":"+"%S")) + self.dlg.console.append(message) + self.dlg.console.repaint() + ###Input Drainage Line def import_drainage_line(self): @@ -374,16 +374,18 @@ def import_drainage_line(self): self.print_console_message('Importing Drainage Lines. Please, wait...\n') self.dlg.console.append('SCHEMA: '+input_drainage_line_table_schema) - self.dlg.console.append('TABELA GEOMETRICA: '+input_drainage_line_table) - self.dlg.console.append('COLUNA COM NOME: '+input_drainage_line_table_attribute_name) - self.dlg.console.append('COLUNA GEOMETRICA: '+input_drainage_line_table_attribute_geom) + self.dlg.console.append('GEOMETRY TABLE: '+input_drainage_line_table) + self.dlg.console.append('RIVER NAME COLUMN: '+input_drainage_line_table_attribute_name) + self.dlg.console.append('GEOMETRY COLUMN: '+input_drainage_line_table_attribute_geom) - sql = """ + sql= """ SELECT pghydro.pghfn_input_data_drainage_line('"""+input_drainage_line_table_schema+"""','"""+input_drainage_line_table+"""','"""+input_drainage_line_table_attribute_geom+"""','"""+input_drainage_line_table_attribute_name+"""'); """ - + self.execute_sql(sql) + self.Vacuum_Database() + self.print_console_message('Drainage Lines Successfully Imported!\n') except: @@ -406,16 +408,18 @@ def import_drainage_area(self): self.print_console_message('Updating Drainage Areas. Please, wait...\n') self.dlg.console.append('SCHEME: '+input_drainage_area_table_schema) - self.dlg.console.append('GEOMETRIC TABLE: '+input_drainage_area_table) - self.dlg.console.append('GEOMETRIC COLUMN: '+input_drainage_area_table_attribute_geom) + self.dlg.console.append('GEOMETRY TABLE: '+input_drainage_area_table) + self.dlg.console.append('GEOMETRY COLUMN: '+input_drainage_area_table_attribute_geom) self.dlg.console.repaint() sql = """ SELECT pghydro.pghfn_input_data_drainage_area('"""+input_drainage_area_table_schema+"""','"""+input_drainage_area_table+"""','"""+input_drainage_area_table_attribute_geom+"""'); """ + self.execute_sql(sql) - - + + self.Vacuum_Database() + self.print_console_message('Drainage Areas Successfully Imported!\n') @@ -600,14 +604,19 @@ def Check_DrainageLineGeometryConsistencies(self): """ self.Turn_OFF_Audit() + + self.Vacuum_Database() + self.execute_sql(sql1) self.execute_sql(sql2) self.execute_sql(sql3) self.execute_sql(sql4) - + self.Check_DrainageLineIsNotSingle() self.Check_DrainageLineIsNotSimple() self.Check_DrainageLineIsNotValid() + + self.Vacuum_Database() self.print_console_message('Geometric Consistency Successfully Checked!\n') @@ -715,11 +724,14 @@ def Check_DrainageLineTopologyConsistencies_1(self): """ self.Turn_OFF_Audit() + self.execute_sql(sql) self.Check_DrainageLineWithinDrainageLine() self.Check_DrainageLineOverlapDrainageLine() self.Check_DrainageLineLoops() + + self.Vacuum_Database() self.print_console_message('Topological Consistency Part I Successfully Checked!\n') @@ -788,12 +800,15 @@ def Check_DrainageLineTopologyConsistencies_2(self): sql = """ SELECT pgh_consistency.pghfn_UpdateDrainageLineConsistencyTopologyTables_2(); """ - + self.Turn_OFF_Audit() + self.execute_sql(sql) self.Check_DrainageLineCrossDrainageLine() self.Check_DrainageLineTouchDrainageLine() + + self.Vacuum_Database() self.print_console_message('Topological Consistency Part II Successfully Checked!\n') @@ -815,13 +830,8 @@ def BreakDrainageLines(self): SELECT pgh_consistency.pghfn_BreakDrainageLine(); """ - sql3 = """ - SELECT pgh_consistency.pghfn_ExplodeDrainageLine(); - """ - self.execute_sql(sql1) self.execute_sql(sql2) - self.execute_sql(sql3) self.print_console_message('Geometries Successfully Broken!\n') @@ -910,7 +920,7 @@ def Execute_Network_Topology(self): try: self.print_console_message('Creating Drainage Line Network. Please, wait...\n') - + sql1 = """ DROP INDEX IF EXISTS pghydro.drp_gm_idx; @@ -944,14 +954,17 @@ def Execute_Network_Topology(self): """ self.Turn_OFF_Audit() + self.execute_sql(sql1) self.execute_sql(sql2) self.execute_sql(sql3) self.execute_sql(sql4) self.execute_sql(sql5) - + self.Check_PointValenceValue2() self.Check_PointValenceValue4() + + self.Vacuum_Database() self.print_console_message('Drainage Line Network Successfully Created!\n') @@ -1076,6 +1089,7 @@ def Execute_Flow_Direction(self): """ self.Turn_OFF_Audit() + self.execute_sql(sql1) self.execute_sql(sql2) self.execute_sql(sql3) @@ -1084,6 +1098,8 @@ def Execute_Flow_Direction(self): self.Check_DrainageLineIsDisconnected() self.Check_PointDivergent() + + self.Vacuum_Database() self.print_console_message('Flow Direction Successfully Calculated!\n') @@ -1235,8 +1251,6 @@ def MakeDrainageAreaValid(self): def Check_DrainageAreaGeometryConsistencies(self): - self.print_console_message('Checking Geometric Consistency. Please, wait...\n') - DrainageAreaPrecision = self.dlg.lineEdit_DrainageAreaPrecision.text() DrainageAreaOffset = self.dlg.lineEdit_DrainageAreaOffset.text() @@ -1281,6 +1295,9 @@ def Check_DrainageAreaGeometryConsistencies(self): """ self.Turn_OFF_Audit() + + self.Vacuum_Database() + self.execute_sql(sql1) self.execute_sql(sql2) self.execute_sql(sql3) @@ -1292,6 +1309,8 @@ def Check_DrainageAreaGeometryConsistencies(self): self.Check_DrainageAreaIsNotSingle() self.Check_DrainageAreaIsNotSimple() self.Check_DrainageAreaIsNotValid() + + self.Vacuum_Database() self.print_console_message('Geometric Consistency Successfully Checked!\n') @@ -1402,10 +1421,13 @@ def Check_DrainageAreaTopologyConsistencies(self): """ self.Turn_OFF_Audit() + self.execute_sql(sql) self.Check_DrainageAreaWithinDrainageArea() self.Check_DrainageAreaOverlapDrainageArea() + + self.Vacuum_Database() self.print_console_message('Topological Geometry Successfully Checked!\n') @@ -1550,6 +1572,10 @@ def Check_DrainageAreaDrainageLineConsistencies(self): CREATE INDEX drn_gm_idx ON pghydro.pghft_drainage_line USING GIST(drn_gm); + DROP INDEX IF EXISTS pghydro.drn_gm_point_idx; + + CREATE INDEX drn_gm_point_idx ON pghydro.pghft_drainage_line USING GIST(drn_gm_point); + DROP INDEX IF EXISTS pghydro.drp_gm_idx; CREATE INDEX drp_gm_idx ON pghydro.pghft_drainage_point USING GIST(drp_gm); @@ -1574,17 +1600,22 @@ def Check_DrainageAreaDrainageLineConsistencies(self): """ self.Turn_OFF_Audit() + + self.Vacuum_Database() + self.execute_sql(sql1) self.execute_sql(sql2) self.execute_sql(sql3) self.execute_sql(sql4) self.execute_sql(sql5) self.execute_sql(sql6) - + self.Check_DrainageAreaMoreOneDrainageLine() self.Check_DrainageLineNoDrainageArea() self.Check_DrainageAreaNoDrainageLine() self.Check_DrainageLineMoreOneDrainageArea() + + self.Vacuum_Database() self.print_console_message('Topological Consistency Successfully Checked!\n') @@ -1601,18 +1632,18 @@ def Principal_Procedure(self): distance_to_sea = self.dlg.lineEdit_distance_to_sea.text() pfafstetter_basin_code = self.dlg.lineEdit_pfafstetter_basin_code.text() pfafstetter_basin_code_level = len(pfafstetter_basin_code) + watershed_pfafstetter_max_code = self.dlg.lineEdit_watershed_pfafstetter_max_code.text() - self.print_console_message('Turning Off Indexes. Please, wait...\n') + DrainageLineOffset = self.dlg.lineEdit_DrainageLineOffset.text() + + WaterCourseOffset = (int(DrainageLineOffset)/2)+1 + self.Turn_OFF_Audit() - sql = """ - SELECT pghydro.pghfn_TurnOffKeysIndex(); - """ + if self.dlg.checkBox_TurnOffKeysIndex.isChecked(): + + self.Turn_OFF_Keys_Index() - self.execute_sql(sql) - - self.print_console_message('Indexes Successfully Turned Off!\n') - if self.dlg.checkBox_CalculateDrainageLineLength.isChecked(): self.print_console_message('Updating Drainage Line Length. Please, wait...\n') @@ -1625,6 +1656,8 @@ def Principal_Procedure(self): self.print_console_message('Drainage Line Length Successfully Updated!\n') + self.Vacuum_Database() + if self.dlg.checkBox_CalculateDrainageAreaArea.isChecked(): self.print_console_message('Updating Drainage Area Area. Please, wait...\n') @@ -1636,7 +1669,9 @@ def Principal_Procedure(self): self.execute_sql(sql) self.print_console_message('Drainage Area Area Successfully Updated!\n') - + + self.Vacuum_Database() + if self.dlg.checkBox_CalculateDistanceToSea.isChecked(): self.print_console_message('Updating Sea Distance. Please, wait...\n') @@ -1649,6 +1684,8 @@ def Principal_Procedure(self): self.print_console_message('Sea Distance Successfully Updated!\n') + self.Vacuum_Database() + if self.dlg.checkBox_CalculateUpstreamArea.isChecked(): self.print_console_message('Updating Upstream Area. Please, wait...\n') @@ -1661,6 +1698,8 @@ def Principal_Procedure(self): self.print_console_message('Upstream Area Successfully Updated!\n') + self.Vacuum_Database() + if self.dlg.checkBox_CalculateUpstreamDrainageLine.isChecked(): self.print_console_message('Updating Upstream Drainage Line. Please, wait...\n') @@ -1672,6 +1711,8 @@ def Principal_Procedure(self): self.execute_sql(sql) self.print_console_message('Upstream Drainage Line Successfully Updated!\n') + + self.Vacuum_Database() if self.dlg.checkBox_CalculateDownstreamDrainageLine.isChecked(): @@ -1685,6 +1726,8 @@ def Principal_Procedure(self): self.print_console_message('Downstream Drainage Line Successfully Updated!\n') + self.Vacuum_Database() + if self.dlg.checkBox_Calculate_Pfafstetter_Codification.isChecked(): self.print_console_message('Calculating Pfafstetter Basin Coding. Please, wait...\n') @@ -1697,6 +1740,8 @@ def Principal_Procedure(self): self.print_console_message('Pfafstetter Basin Coding Successfully Calculated!\n') + self.Vacuum_Database() + if self.dlg.checkBox_UpdatePfafstetterBasinCode.isChecked(): self.print_console_message('Updating Pfafstetter Basin Coding. Please, wait...\n') @@ -1709,6 +1754,8 @@ def Principal_Procedure(self): self.print_console_message('Pfafstetter Basin Coding Successfully Updated!\n') + self.Vacuum_Database() + if self.dlg.checkBox_UpdatePfafstetterWatercourseCode.isChecked(): self.print_console_message('Updating Pfafstetter Water Course Coding. Please, wait...\n') @@ -1721,17 +1768,21 @@ def Principal_Procedure(self): self.print_console_message('Pfafstetter Water Course Coding Successfully Updated!\n') + self.Vacuum_Database() + if self.dlg.checkBox_UpdateWatercourse.isChecked(): self.print_console_message('Updating Water Course. Please, wait...\n') sql = """ - SELECT pghydro.pghfn_UpdateWatercourse(); + SELECT pghydro.pghfn_UpdateWatercourse("""+str(WaterCourseOffset)+"""); """ self.execute_sql(sql) - self.print_console_message('Water Course Successfully Updated!\n') + self.print_console_message("""Water Course Successfully Updated! Offset:"""+str(WaterCourseOffset)+"""\n""") + + self.Vacuum_Database() if self.dlg.checkBox_InsertColumnPfafstetterBasinCodeLevel.isChecked(): @@ -1745,6 +1796,8 @@ def Principal_Procedure(self): self.print_console_message('Pfafstetter Basin Coding Columns Successfully Updated!\n') + self.Vacuum_Database() + if self.dlg.checkBox_UpdateWatercourse_Point.isChecked(): self.print_console_message('Updating Water Course Starting Point. Please, wait...\n') @@ -1777,6 +1830,8 @@ def Principal_Procedure(self): self.print_console_message('Outlet Sea Successfully Updated!\n') + self.Vacuum_Database() + if self.dlg.checkBox_calculatestrahlernumber.isChecked(): self.print_console_message('Updating Strahler Order. Please, wait...\n') @@ -1789,6 +1844,8 @@ def Principal_Procedure(self): self.print_console_message('Strahler Order Successfully Updated!\n') + self.Vacuum_Database() + if self.dlg.checkBox_updateshoreline.isChecked(): self.print_console_message('Updating Shoreline. Please, wait...\n') @@ -1800,6 +1857,8 @@ def Principal_Procedure(self): self.execute_sql(sql) self.print_console_message('Shoreline Successfully Updated!\n') + + self.Vacuum_Database() if self.dlg.checkBox_UpdateDomainColumn.isChecked(): @@ -1813,17 +1872,11 @@ def Principal_Procedure(self): self.print_console_message('Water Course Domain Successfully Updated!\n') - if self.dlg.checkBox_TurnOnKeysIndex.isChecked(): - - self.print_console_message('Turning On Indexes...\n') - - sql = """ - SELECT pghydro.pghfn_TurnOnKeysIndex(); - """ + self.Vacuum_Database() - self.execute_sql(sql) + if self.dlg.checkBox_TurnOnKeysIndex.isChecked(): - self.print_console_message('Indexes Successfully Turned On!\n') + self.Turn_ON_Keys_Index() if self.dlg.checkBox_UpdateWatershed.isChecked(): @@ -1831,43 +1884,32 @@ def Principal_Procedure(self): x=1 else: - self.print_console_message('Turning On Indexes. Please, wait...\n') - - sql1 = """ - SELECT pghydro.pghfn_TurnOnKeysIndex(); - """ - - self.execute_sql(sql1) - - self.print_console_message('Indexes Successfully Turned On!\n') - - sql_min = """ - SELECT pghydro.pghfn_PfafstetterBasinCodeLevelN(1); - """ - - sql_max = """ - SELECT pghydro.pghfn_PfafstetterBasinCodeLevelN((SELECT pghydro.pghfn_numPfafstetterBasinCodeLevel()::integer)); - """ + self.Turn_ON_Keys_Index() result_min = pfafstetter_basin_code_level - result_max = self.return_sql(sql_max) + result_max = watershed_pfafstetter_max_code try: self.print_console_message("Updating Pfafstetter Basin Coding Level "+result_max+". Please, wait...") - sql2 = """ + sql = """ TRUNCATE TABLE pghydro.pghft_watershed; """ - - sql3 = """ + + self.execute_sql(sql) + + sql = """ + SELECT setval(('pghydro.wts_pk_seq'::text)::regclass, 1, false); + """ + self.execute_sql(sql) + + sql = """ SELECT pghydro.pghfn_updatewatersheddrainagearea("""+str(result_max)+"""); """ - self.execute_sql(sql2) - - self.execute_sql(sql3) + self.execute_sql(sql) self.print_console_message("Pfafstetter Basin Coding Level "+result_max+" Successfully Updated!") @@ -1883,11 +1925,11 @@ def Principal_Procedure(self): self.print_console_message("Updating Pfafstetter Basin Coding Level "+str(count-1)+". Please, wait...") - sql4 = """ + sql = """ SELECT pghydro.pghfn_updatewatershed("""+str(count)+"""); """ - self.execute_sql(sql4) + self.execute_sql(sql) self.print_console_message("Pfafstetter Basin Coding Level "+str(count-1)+" Successfully Updated!") @@ -1898,6 +1940,8 @@ def Principal_Procedure(self): count = count -1 self.print_console_message("All Pfafstetter Basin Coding Level Successfully Updated!") + + self.Vacuum_Database() ###Export Data @@ -1905,60 +1949,44 @@ def UpdateExportTables(self): self.print_console_message('Updating Output Geometry Tables. Please, wait...\n') - self.print_console_message('Turning Off Indexes. Please, wait...\n') - sql = """ - SELECT pghydro.pghfn_TurnOffKeysIndex(); + SELECT pgh_output.pghfn_UpdateExportTables(); """ self.Turn_OFF_Audit() - self.execute_sql(sql) - - self.print_console_message('Indexes Successfully Turned Off!\n') - - self.print_console_message('Turning On Indexes. Please, wait...\n') - - sql = """ - SELECT pghydro.pghfn_TurnOnKeysIndex(); - """ + self.Turn_OFF_Keys_Index() - self.execute_sql(sql) + self.Vacuum_Database() - self.print_console_message('Indexes Successfully Turned Off!\n') - - sql = """ - SELECT pgh_output.pghfn_UpdateExportTables(); - """ + self.Turn_ON_Keys_Index() self.execute_sql(sql) + + self.Vacuum_Database() self.print_console_message('Output Geometry Tables Successfully Updated!\n') def Start_Systematize_Hydronym(self): try: - self.print_console_message("Starting Hydronima Systematization. Please, wait...") + self.print_console_message("Starting Hydronymia Systematization. Please, wait...") sql1 = """ - SELECT pghydro.pghfn_TurnOffKeysIndex(); - """ - - sql2 = """ ALTER TABLE pghydro.pghft_drainage_line DROP COLUMN IF EXISTS drn_dra_cd_pfafstetterbasin, DROP COLUMN IF EXISTS drn_wtc_cd_pfafstetterwatercourse, DROP COLUMN IF EXISTS drn_wtc_gm_area; """ - sql3 = """ + sql2 = """ ALTER TABLE pghydro.pghft_drainage_line ADD COLUMN drn_dra_cd_pfafstetterbasin varchar, ADD COLUMN drn_wtc_cd_pfafstetterwatercourse varchar, ADD COLUMN drn_wtc_gm_area numeric; """ - sql4 = """ + sql3 = """ DROP INDEX IF EXISTS pghydro.drn_pk_idx; CREATE INDEX drn_pk_idx ON pghydro.pghft_drainage_line(drn_pk); @@ -1972,14 +2000,14 @@ def Start_Systematize_Hydronym(self): CREATE INDEX dra_pk_idx ON pghydro.pghft_drainage_area(dra_pk); """ - sql5 = """ + sql4 = """ UPDATE pghydro.pghft_drainage_line drn SET drn_dra_cd_pfafstetterbasin = dra.dra_cd_pfafstetterbasin FROM pghydro.pghft_drainage_area dra WHERE drn.drn_dra_pk = dra.dra_pk; """ - sql6 = """ + sql5 = """ DROP INDEX IF EXISTS pghydro.drn_wtc_pk_idx; CREATE INDEX drn_wtc_pk_idx ON pghydro.pghft_drainage_line(drn_wtc_pk); @@ -1989,21 +2017,21 @@ def Start_Systematize_Hydronym(self): CREATE INDEX wtc_pk_idx ON pghydro.pghft_watercourse(wtc_pk); """ - sql7 = """ + sql6 = """ UPDATE pghydro.pghft_drainage_line drn SET drn_wtc_cd_pfafstetterwatercourse = wtc.wtc_cd_pfafstetterwatercourse FROM pghydro.pghft_watercourse wtc WHERE drn.drn_wtc_pk = wtc.wtc_pk; """ - sql8 = """ + sql7 = """ UPDATE pghydro.pghft_drainage_line drn SET drn_wtc_gm_area = wtc.wtc_gm_area FROM pghydro.pghft_watercourse wtc WHERE drn.drn_wtc_pk = wtc.wtc_pk; """ - sql9 = """ + sql8 = """ DROP INDEX IF EXISTS pghydro.drn_pk_idx; DROP INDEX IF EXISTS pghydro.drn_dra_pk_idx; @@ -2022,6 +2050,11 @@ def Start_Systematize_Hydronym(self): """ self.Turn_OFF_Audit() + + self.Turn_OFF_Keys_Index() + + self.Vacuum_Database() + self.execute_sql(sql1) self.execute_sql(sql2) self.execute_sql(sql3) @@ -2030,7 +2063,8 @@ def Start_Systematize_Hydronym(self): self.execute_sql(sql6) self.execute_sql(sql7) self.execute_sql(sql8) - self.execute_sql(sql9) + + self.Vacuum_Database() self.print_console_message("Hydronymia Systematization Successfully Started!") @@ -2089,10 +2123,15 @@ def Systematize_Hydronym(self): """ self.Turn_OFF_Audit() + + self.Vacuum_Database() + self.execute_sql(sql1) self.execute_sql(sql2) self.execute_sql(sql3) self.execute_sql(sql4) + + self.Vacuum_Database() self.print_console_message("Names Successfully Systematized!") @@ -2125,6 +2164,7 @@ def Update_OriginalHydronym(self): """ self.Turn_OFF_Audit() + self.execute_sql(sql1) self.execute_sql(sql2) @@ -2151,6 +2191,7 @@ def Check_ConfluenceHydronym(self): """ self.Turn_OFF_Audit() + self.execute_sql(sql1) self.execute_sql(sql2) @@ -2179,7 +2220,7 @@ def Stop_Systematize_Hydronym(self): try: self.print_console_message("Stoping Hydronymia Systematization. Please, wait...") - sql1 = """ + sql = """ DROP INDEX IF EXISTS pghydro.dra_cd_pfafstetterbasin_idx; DROP INDEX IF EXISTS pghydro.wtc_cd_pfafstetterwatercourse_idx; @@ -2190,20 +2231,17 @@ def Stop_Systematize_Hydronym(self): DROP COLUMN IF EXISTS drn_wtc_gm_area; """ - sql2 = """ - SELECT pghydro.pghfn_turnoffkeysindex(); - """ + self.Turn_OFF_Audit() - sql3 = """ - SELECT pghydro.pghfn_turnonkeysindex(); - """ + self.execute_sql(sql) - self.Turn_OFF_Audit() - self.execute_sql(sql1) - self.execute_sql(sql2) - self.execute_sql(sql3) + self.Turn_OFF_Keys_Index() + + self.Vacuum_Database() + + self.Turn_ON_Keys_Index() - self.print_console_message("Hydronima Systematization Successfully Done!") + self.print_console_message("Hydronymia Systematization Successfully Done!") except: self.print_console_message('ERROR\nCheck Database Input Parameters!') @@ -2415,7 +2453,58 @@ def input_drainage_line_table_attribute_name_select(self): self.dlg.input_drainage_line_table_attribute_name_MapLayerComboBox.addItems(none) fields = [field.name() for field in selectedLayer.pendingFields()] self.dlg.input_drainage_line_table_attribute_name_MapLayerComboBox.addItems(fields) + + + def Vacuum_Database(self): + + if self.dlg.checkBox_Vacuum_Database.isChecked(): + + self.print_console_message('Vacuuming Database. Please, wait...\n') + try: + sql = """ + VACUUM(FULL, ANALYZE); + """ + + self.execute_sql(sql) + + self.print_console_message('Database Successfully Vacuumed!\n') + + except: + self.print_console_message('ERROR\nCheck Database Input Parameters!') + + def Turn_ON_Keys_Index(self): + + self.print_console_message('Turning On Indexes. Please, wait...\n') + + try: + sql = """ + SELECT pghydro.pghfn_turnonkeysindex(); + """ + + self.execute_sql(sql) + + self.print_console_message('Indexes Successfully Turned On!\n') + + except: + self.print_console_message('ERROR\nCheck Database Input Parameters!') + + def Turn_OFF_Keys_Index(self): + + self.print_console_message('Turning Off Indexes. Please, wait...\n') + + try: + sql = """ + SELECT pghydro.pghfn_turnoffkeysindex(); + """ + + self.execute_sql(sql) + + self.print_console_message('Indexes Successfully Turned Off!\n') + + except: + self.print_console_message('ERROR\nCheck Database Input Parameters!') + def run(self): """Run method that performs all the real work""" self.dlg.input_drainage_line_table_MapLayerComboBox.clear() diff --git a/pghydro_tools_dialog_base.ui b/pghydro_tools_dialog_base.ui index b55ec41..fd810c8 100644 --- a/pghydro_tools_dialog_base.ui +++ b/pghydro_tools_dialog_base.ui @@ -136,7 +136,7 @@ - 5433 + 5432 @@ -191,7 +191,7 @@ - Connect + Test Connection @@ -2198,7 +2198,7 @@ - 5880 + 3857 @@ -2211,7 +2211,7 @@ - 5880 + 3857 @@ -2341,6 +2341,9 @@ + + true + 10 @@ -2353,7 +2356,7 @@ Add Pfafstetter Basin Coding Columns - true + false @@ -2376,7 +2379,7 @@ 430 - 20 + 40 171 17 @@ -2392,7 +2395,7 @@ 430 - 40 + 60 181 20 @@ -2408,13 +2411,64 @@ 430 - 60 + 80 + 171 + 17 + + + + Update Watersheds <= + + + false + + + + + + 570 + 80 + 21 + 20 + + + + 6 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 430 + 20 171 17 - Update Watersheds + Turn Off Indexes, PKs and FKs + + + true + + + + + + 430 + 100 + 171 + 17 + + + + Vacuum Database + + + false @@ -2963,7 +3017,7 @@ - PgHydro Tools Version 2.2 + PgHydro Tools Version 2.4 @@ -3005,7 +3059,7 @@ REQUIREMENTS: -Postgresql version 9.1+ -PostGIS version 2.0+ - -PgHydro version 6.2: https://github.com/pghydro/pghydro/tree/master + -PgHydro version 6.4: https://github.com/pghydro/pghydro/tree/master @@ -3034,8 +3088,5 @@ - - -