Advertisement
Guest User

Untitled

a guest
Mar 14th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.68 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. # define Interface
  5. ##PostGIS spatial processing (QGIS 2.x)=group
  6. ##Point on surface (PostGIS)=name
  7. ##Input_layer=vector
  8. ##Output_relation_type=selection Table;View;Materialized View
  9. ##Output_schema=string public
  10. ##Output_layer=string pg_pointonsurface
  11. ##Output_primary_key=string gid
  12. ##Output_geometry_column=string geom
  13. ##Attributes_to_keep_(comma_separated_list)_[non_working_dummy]=string None
  14. ##Add_output_layer_to_map=boolean true
  15.  
  16. from PyQt4.QtCore import *
  17. from PyQt4.QtGui import *
  18. from PyQt4 import *
  19.  
  20. from qgis.core import *
  21. from qgis.gui import *
  22. from qgis.utils import *
  23.  
  24. import psycopg2
  25.  
  26. # get input parameters from GUI
  27. inlayer = processing.getObject(Input_layer)
  28. inlayer_dp = inlayer.dataProvider().dataSourceUri()
  29.  
  30. # get database parameters (input layer)
  31. db_name = QgsDataSourceURI(inlayer_dp).database()
  32. db_host = QgsDataSourceURI(inlayer_dp).host()
  33. db_port = QgsDataSourceURI(inlayer_dp).port()
  34. db_user = QgsDataSourceURI(inlayer_dp).username()
  35. db_password = QgsDataSourceURI(inlayer_dp).password()
  36.  
  37. # get input layer parameters
  38. inlayer_schema = QgsDataSourceURI(inlayer_dp).schema()
  39. inlayer_table = QgsDataSourceURI(inlayer_dp).table()
  40. inlayer_uic = QgsDataSourceURI(inlayer_dp).keyColumn
  41. inlayer_geom = QgsDataSourceURI(inlayer_dp).geometryColumn()
  42. inlayer_crs = inlayer.crs().postgisSrid()
  43.  
  44. # get output relation parameters
  45. outrelationtype = Output_relation_type
  46. if outrelationtype == 0:
  47. outrelationtype = 'TABLE'
  48. elif outrelationtype == 1:
  49. outrelationtype = 'VIEW'
  50. elif outrelationtype == 2:
  51. outrelationtype = 'MATERIALIZED VIEW'
  52.  
  53. outschema = Output_schema
  54. outlayer = Output_layer
  55. outpk = Output_primary_key
  56. outgeom = Output_geometry_column
  57. outadd = Add_output_layer_to_map
  58.  
  59. # check input layer
  60. provider = inlayer.dataProvider()
  61. if provider.name() != 'postgres':
  62. raise RuntimeError('Input layer '' + inlayer.name() + '' is not a PostgreSQL/PostGIS relation :(')
  63.  
  64. # connect to database
  65. conn = psycopg2.connect( "dbname={0} host={1} port={2} user={3} password={4}".format( db_name, db_host, db_port, db_user, db_password ) )
  66.  
  67. # create and run query
  68. with conn.cursor() as curs:
  69. sql = """CREATE {0} "{1}"."{2}" AS SELECT
  70. row_number() over() AS "{3}",
  71. ST_PointOnSurface("{4}")::geometry(Point, {5}) AS "{6}"
  72. FROM "{7}"."{8}";
  73. """.format( outrelationtype, outschema, outlayer, outpk, inlayer_geom, inlayer_crs, outgeom, inlayer_schema, inlayer_table )
  74.  
  75. progress.setInfo('Executing SQL statement ... n')
  76. progress.setInfo(sql)
  77. curs.execute(sql)
  78. progress.setInfo('... done. n')
  79.  
  80. # create primary key, sequence and spatial index for relation type 'TABLE'
  81. if outrelationtype == 'TABLE':
  82. sql_pk = """ALTER TABLE "{0}"."{1}" ADD CONSTRAINT "{1}_pkey" PRIMARY KEY ("{2}");""".format( outschema, outlayer, outpk )
  83. curs.execute(sql_pk)
  84.  
  85. sql_seq = """CREATE SEQUENCE "{0}"."{1}_{2}_seq" OWNED BY "{0}"."{1}"."{2}";
  86. SELECT SETVAL('"{0}"."{1}_{2}_seq"', (SELECT MAX("{2}") FROM "{0}"."{1}"));
  87. ALTER TABLE "{0}"."{1}"
  88. ALTER COLUMN "{2}" SET DEFAULT nextval('"{0}"."{1}_{2}_seq"'::regclass);
  89. """.format ( outschema, outlayer, outpk )
  90. curs.execute(sql_seq)
  91.  
  92. sql_sidx = """CREATE INDEX "sidx_{1}_{2}" ON "{0}"."{1}" USING GIST ("{2}");""".format( outschema, outlayer, outgeom )
  93. curs.execute(sql_sidx)
  94.  
  95. # commit changes if everything went OK
  96. conn.commit()
  97.  
  98. # load layer
  99. if outadd:
  100. uri = QgsDataSourceURI()
  101. uri.setConnection( db_host, db_port, db_name, db_user, db_password )
  102. uri.setDataSource( outschema, outlayer, outgeom, None, outpk )
  103. vlayer = QgsVectorLayer( uri.uri(), outlayer, "postgres" )
  104. QgsMapLayerRegistry.instance().addMapLayer(vlayer)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement