mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-15 00:04:00 -04:00
Speed up topology loading
When loading topology viewer on a PostGIS-2.0+ database, it includes type and srid typmod in the view layers, avoiding a full scan of the datasets. Fix #9510
This commit is contained in:
parent
1d09f43493
commit
73b4986747
@ -34,8 +34,8 @@ current_path = os.path.dirname(__file__)
|
|||||||
# @param db is the selected database
|
# @param db is the selected database
|
||||||
# @param mainwindow is the DBManager mainwindow
|
# @param mainwindow is the DBManager mainwindow
|
||||||
def load(db, mainwindow):
|
def load(db, mainwindow):
|
||||||
# check whether the selected database has topology enabled
|
# check whether the selected database supports topology
|
||||||
# (search for topology.topology)
|
# (search for topology.topology)
|
||||||
sql = u"""SELECT count(*)
|
sql = u"""SELECT count(*)
|
||||||
FROM pg_class AS cls JOIN pg_namespace AS nsp ON nsp.oid = cls.relnamespace
|
FROM pg_class AS cls JOIN pg_namespace AS nsp ON nsp.oid = cls.relnamespace
|
||||||
WHERE cls.relname = 'topology' AND nsp.nspname = 'topology'"""
|
WHERE cls.relname = 'topology' AND nsp.nspname = 'topology'"""
|
||||||
@ -72,16 +72,25 @@ def run(item, action, mainwindow):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
if item.schema() != None:
|
if item.schema() != None:
|
||||||
sql = u"SELECT count(*) FROM topology.topology WHERE name = %s" % quoteStr(item.schema().name)
|
sql = u"SELECT srid FROM topology.topology WHERE name = %s" % quoteStr(item.schema().name)
|
||||||
c = db.connector._get_cursor()
|
c = db.connector._get_cursor()
|
||||||
db.connector._execute( c, sql )
|
db.connector._execute( c, sql )
|
||||||
res = db.connector._fetchone( c )
|
res = db.connector._fetchone( c )
|
||||||
isTopoSchema = res != None and int(res[0]) > 0
|
isTopoSchema = res != None
|
||||||
|
|
||||||
if not isTopoSchema:
|
if not isTopoSchema:
|
||||||
QMessageBox.critical(mainwindow, "Invalid topology", u'Schema "%s" is not registered in topology.topology.' % item.schema().name)
|
QMessageBox.critical(mainwindow, "Invalid topology", u'Schema "%s" is not registered in topology.topology.' % item.schema().name)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
toposrid = int(res[0])
|
||||||
|
|
||||||
|
# Check if postgis supports typmod geometries
|
||||||
|
sql = u"SELECT typmodin FROM pg_type WHERE typname = 'geometry' AND typmodin::int > 0"
|
||||||
|
c = db.connector._get_cursor()
|
||||||
|
db.connector._execute( c, sql )
|
||||||
|
res = db.connector._fetchone( c )
|
||||||
|
supportsTypmod = res != None
|
||||||
|
|
||||||
# load layers into the current project
|
# load layers into the current project
|
||||||
toponame = item.schema().name
|
toponame = item.schema().name
|
||||||
template_dir = os.path.join(current_path, 'templates')
|
template_dir = os.path.join(current_path, 'templates')
|
||||||
@ -105,8 +114,11 @@ def run(item, action, mainwindow):
|
|||||||
legend.setGroupVisible(group, False)
|
legend.setGroupVisible(group, False)
|
||||||
|
|
||||||
# face
|
# face
|
||||||
layer = db.toSqlLayer(u'SELECT face_id, topology.ST_GetFaceGeometry(%s, face_id) as geom ' \
|
geomcast = ''
|
||||||
'FROM %s.face WHERE face_id > 0' % (quoteStr(toponame), quoteId(toponame)),
|
if supportsTypmod:
|
||||||
|
geomcast = '::geometry(multipolygon,%s)' % toposrid
|
||||||
|
layer = db.toSqlLayer(u'SELECT face_id, topology.ST_GetFaceGeometry(%s, face_id)%s as geom ' \
|
||||||
|
'FROM %s.face WHERE face_id > 0' % (geomcast, quoteStr(toponame), quoteId(toponame)),
|
||||||
'geom', 'face_id', u'%s.face' % toponame)
|
'geom', 'face_id', u'%s.face' % toponame)
|
||||||
layer.loadNamedStyle(os.path.join(template_dir, 'face.qml'))
|
layer.loadNamedStyle(os.path.join(template_dir, 'face.qml'))
|
||||||
registry.addMapLayers([layer])
|
registry.addMapLayers([layer])
|
||||||
@ -115,8 +127,11 @@ def run(item, action, mainwindow):
|
|||||||
legend.moveLayer(layer, group)
|
legend.moveLayer(layer, group)
|
||||||
|
|
||||||
# face_seed
|
# face_seed
|
||||||
layer = db.toSqlLayer(u'SELECT face_id, ST_PointOnSurface(topology.ST_GetFaceGeometry(%s, face_id)) as geom ' \
|
geomcast = ''
|
||||||
'FROM %s.face WHERE face_id > 0' % (quoteStr(toponame), quoteId(toponame)),
|
if supportsTypmod:
|
||||||
|
geomcast = '::geometry(point,%s)' % toposrid
|
||||||
|
layer = db.toSqlLayer(u'SELECT face_id, ST_PointOnSurface(topology.ST_GetFaceGeometry(%s, face_id))%s as geom ' \
|
||||||
|
'FROM %s.face WHERE face_id > 0' % (geomcast ,quoteStr(toponame), quoteId(toponame)),
|
||||||
'geom', 'face_id', u'%s.face_seed' % toponame)
|
'geom', 'face_id', u'%s.face_seed' % toponame)
|
||||||
layer.loadNamedStyle(os.path.join(template_dir, 'face_seed.qml'))
|
layer.loadNamedStyle(os.path.join(template_dir, 'face_seed.qml'))
|
||||||
registry.addMapLayers([layer])
|
registry.addMapLayers([layer])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user