Auto repaint/polygons filled

git-svn-id: http://svn.osgeo.org/qgis/trunk@34 c8812cc2-4d05-0410-92ff-de0c093fc19c
This commit is contained in:
gsherman 2002-07-20 21:20:30 +00:00
parent 5a0b233f5b
commit 200faee289
10 changed files with 69 additions and 46 deletions

View File

@ -1,3 +1,5 @@
July 20, 2002
Repaint automatic for layers.
July 18, 2002
Point, line and polygon PostGis layers can be drawn. Still issues with
map exent and positioning of layers on the canvas. Drawing is manual and

View File

@ -1,8 +1,8 @@
Requirements:
1. PostgresQL built with the --with-CXX configure options (C++ wrapper)
2. PostGIS support in PostgresQL
3. Qt 3.0.4 or higher built with thread support
4. Qt PostgresQL driver (can be built with Qt or separately -- see Qt SQL docs)
3. Qt 3.0.x built with thread support
4. Optional - Qt PostgresQL driver (can be built with Qt or separately -- see Qt SQL docs)
To build Qgis:
1. Make sure your QTDIR environment variable is set to your Qt directory

View File

@ -1,14 +1,15 @@
#############################################################################
# Makefile for building: qgis
# Generated by qmake (1.02a) on: Fri Jul 5 16:45:36 2002
# Generated by qmake (1.03a) on: Sat Jul 20 08:36:58 2002
# Project: qgis.pro
# Template: subdirs
# Command: $(QMAKE) -nocache qgis.pro
# Command: $(QMAKE) qgis.pro
#############################################################################
MAKEFILE = Makefile
QMAKE = qmake
SUBDIRS = src
QMAKE = qmake
SUBDIRS = src
DEL_FILE = rm -f
SUBTARGETS = \
sub-src
@ -17,14 +18,14 @@ first: all
all: Makefile $(SUBTARGETS)
src/$(MAKEFILE):
cd src && $(QMAKE) -nocache -o $(MAKEFILE)
cd src && $(QMAKE) -o $(MAKEFILE)
sub-src: src/$(MAKEFILE) FORCE
cd src && $(MAKE) -f $(MAKEFILE)
Makefile: qgis.pro $(QTDIR)/mkspecs/default/qmake.conf
$(QMAKE) -nocache qgis.pro
Makefile: qgis.pro $(QTDIR)/mkspecs/default/qmake.conf
$(QMAKE) qgis.pro
qmake: qmake_all
@$(QMAKE) -nocache qgis.pro
@$(QMAKE) qgis.pro
qmake_all: src/$(MAKEFILE)
for i in $(SUBDIRS); do ( if [ -d $$i ]; then cd $$i ; grep "^qmake_all:" $(MAKEFILE) 2>/dev/null >/dev/null && $(MAKE) -f $(MAKEFILE) qmake_all || true; fi; ) ; done
@ -34,7 +35,7 @@ clean: qmake_all FORCE
uninstall install uiclean mocclean: qmake_all FORCE
for i in $(SUBDIRS); do ( if [ -d $$i ]; then cd $$i ; $(MAKE) -f $(MAKEFILE) $@; fi; ) ; done
distclean: qmake_all FORCE
for i in $(SUBDIRS); do ( if [ -d $$i ]; then cd $$i ; $(MAKE) -f $(MAKEFILE) $@ ; rm -f $(MAKEFILE) ; fi; ) ; done
for i in $(SUBDIRS); do ( if [ -d $$i ]; then cd $$i ; $(MAKE) -f $(MAKEFILE) $@ ; $(DEL_FILE) $(MAKEFILE) ; fi; ) ; done
FORCE:

View File

@ -1,6 +1,6 @@
#############################################################################
# Makefile for building: qgis
# Generated by qmake (1.02a) on: Sat Jul 13 08:56:49 2002
# Generated by qmake (1.03a) on: Sat Jul 20 08:36:25 2002
# Project: src.pro
# Template: app
# Command: $(QMAKE) src.pro
@ -19,7 +19,7 @@ YACCFLAGS= -d
INCPATH = -I$(PGSQL)/include -I$(QTDIR)/include -I$(QTDIR)/mkspecs/default
LINK = g++
LFLAGS =
LIBS = $(SUBLIBS) -Wl,-rpath,$(QTDIR)/lib -L$(QTDIR)/lib -L/usr/X11R6/lib -L$(PGSQL)/lib -lpq++ -lqt-mt -lpthread -lXext -lX11 -lm
LIBS = $(SUBLIBS) -Wl,-rpath,$(QTDIR)/lib -L$(QTDIR)/lib -L/usr/X11R6/lib -L$(PGSQL)/lib -lpq++ -lqt-mt -lpthread -lXext -lX11 -lm
AR = ar cqs
RANLIB =
MOC = $(QTDIR)/bin/moc
@ -31,6 +31,7 @@ COPY = cp -f
COPY_FILE= $(COPY) -p
COPY_DIR = $(COPY) -pR
DEL_FILE = rm -f
SYMLINK = ln -sf
DEL_DIR = rmdir
MOVE = mv
@ -93,7 +94,7 @@ OBJMOC = moc_qgsmapcanvas.o \
moc_qgsdbsourceselectbase.o \
moc_qgisappbase.o \
moc_qgsnewconnectionbase.o
DIST =
DIST = src.pro
QMAKE_TARGET = qgis
DESTDIR =
TARGET = qgis
@ -136,25 +137,25 @@ qmake:
@$(QMAKE) src.pro
dist:
@mkdir -p .tmp/qgis && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .tmp/qgis/ && ( cd `dirname .tmp/qgis` && $(TAR) qgis.tar qgis && $(GZIP) qgis.tar ) && mv `dirname .tmp/qgis`/qgis.tar.gz . && rm -rf .tmp/qgis
@mkdir -p .tmp/qgis && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .tmp/qgis/ && $(COPY_FILE) --parents qgsdbsourceselectbase.ui.h qgisappbase.ui.h .tmp/qgis/ && ( cd `dirname .tmp/qgis` && $(TAR) qgis.tar qgis && $(GZIP) qgis.tar ) && $(MOVE) `dirname .tmp/qgis`/qgis.tar.gz . && $(DEL_DIR) .tmp/qgis
mocclean:
-rm -f $(OBJMOC)
-rm -f $(SRCMOC)
-$(DEL_FILE) $(OBJMOC)
-$(DEL_FILE) $(SRCMOC)
uiclean:
-rm -f $(UICIMPLS) $(UICDECLS)
-$(DEL_FILE) $(UICIMPLS) $(UICDECLS)
clean: mocclean uiclean
-rm -f $(OBJECTS)
-rm -f *~ core *.core
-$(DEL_FILE) $(OBJECTS)
-$(DEL_FILE) *~ core *.core
####### Sub-libraries
distclean: clean
-rm -f $(TARGET) $(TARGET)
-$(DEL_FILE) $(TARGET) $(TARGET)
FORCE:
@ -163,7 +164,8 @@ FORCE:
main.o: main.cpp qgisapp.h \
qgisappbase.h
qgisapp.o: qgisapp.cpp qgsmapcanvas.h \
qgisapp.o: qgisapp.cpp qgsrect.h \
qgsmapcanvas.h \
qgsdbsourceselect.h \
qgsdatabaselayer.h \
qgisapp.h \
@ -173,13 +175,16 @@ qgisapp.o: qgisapp.cpp qgsmapcanvas.h \
qgsdatasource.h \
qgisappbase.h
qgsdatabaselayer.o: qgsdatabaselayer.cpp qgsdatabaselayer.h \
qgsdatabaselayer.o: qgsdatabaselayer.cpp qgsrect.h \
qgsdatabaselayer.h \
qgsmaplayer.h \
qgsdatasource.h
qgsdatasource.o: qgsdatasource.cpp qgsdatasource.h
qgsmapcanvas.o: qgsmapcanvas.cpp qgsmaplayer.h \
qgsmapcanvas.o: qgsmapcanvas.cpp qgsrect.h \
qgsmaplayer.h \
qgsdatabaselayer.h \
qgsmapcanvas.h \
qgsdatasource.h
@ -189,7 +194,8 @@ qgsmaplayer.o: qgsmaplayer.cpp qgsrect.h \
qgsrasterlayer.o: qgsrasterlayer.cpp qgsrasterlayer.h \
qgsmaplayer.h \
qgsdatasource.h
qgsdatasource.h \
qgsrect.h
qgsdbsourceselect.o: qgsdbsourceselect.cpp xpm/point_layer.xpm \
xpm/line_layer.xpm \
@ -204,16 +210,16 @@ qgsnewconnection.o: qgsnewconnection.cpp qgsnewconnection.h \
qgsrect.o: qgsrect.cpp qgsrect.h
qgsdbsourceselectbase.h: qgsdbsourceselectbase.ui qgsdbsourceselectbase.ui.h
qgsdbsourceselectbase.h: qgsdbsourceselectbase.ui
$(UIC) qgsdbsourceselectbase.ui -o qgsdbsourceselectbase.h
qgsdbsourceselectbase.cpp: qgsdbsourceselectbase.h qgsdbsourceselectbase.ui qgsdbsourceselectbase.ui.h
qgsdbsourceselectbase.cpp: qgsdbsourceselectbase.h qgsdbsourceselectbase.ui
$(UIC) qgsdbsourceselectbase.ui -i qgsdbsourceselectbase.h -o qgsdbsourceselectbase.cpp
qgisappbase.h: qgisappbase.ui qgisappbase.ui.h
qgisappbase.h: qgisappbase.ui
$(UIC) qgisappbase.ui -o qgisappbase.h
qgisappbase.cpp: qgisappbase.h qgisappbase.ui qgisappbase.ui.h
qgisappbase.cpp: qgisappbase.h qgisappbase.ui
$(UIC) qgisappbase.ui -i qgisappbase.h -o qgisappbase.cpp
qgsnewconnectionbase.h: qgsnewconnectionbase.ui
@ -222,13 +228,15 @@ qgsnewconnectionbase.h: qgsnewconnectionbase.ui
qgsnewconnectionbase.cpp: qgsnewconnectionbase.h qgsnewconnectionbase.ui
$(UIC) qgsnewconnectionbase.ui -i qgsnewconnectionbase.h -o qgsnewconnectionbase.cpp
qgsdbsourceselectbase.o: qgsdbsourceselectbase.cpp qgsdbsourceselectbase.h
qgsdbsourceselectbase.o: qgsdbsourceselectbase.cpp qgsdbsourceselectbase.ui.h \
qgsdbsourceselectbase.h
qgisappbase.o: qgisappbase.cpp qgisappbase.h
qgisappbase.o: qgisappbase.cpp qgisappbase.ui.h \
qgisappbase.h
qgsnewconnectionbase.o: qgsnewconnectionbase.cpp qgsnewconnectionbase.h
moc_qgsmapcanvas.o: moc_qgsmapcanvas.cpp qgsmapcanvas.h
moc_qgsmapcanvas.o: moc_qgsmapcanvas.cpp qgsmapcanvas.h qgsrect.h
moc_qgsdbsourceselectbase.o: moc_qgsdbsourceselectbase.cpp qgsdbsourceselectbase.h

View File

@ -54,7 +54,7 @@ QgisAppBase (parent, name, fl)
// resize it to fit in the frame
// QRect r = frmCanvas->rect();
// canvas->resize(r.width(), r.height());
mapCanvas->setBackgroundColor (QColor (220, 235, 255));
mapCanvas->setBackgroundColor (Qt::white); //QColor (220, 235, 255));
mapCanvas->setMinimumWidth (400);

View File

@ -182,7 +182,7 @@
<iconset>image5</iconset>
</property>
<property name="text">
<string>Draw</string>
<string>Refresh </string>
</property>
</action>
</actions>
@ -203,7 +203,7 @@
<data format="XPM.GZ" length="661">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523232520022630543251d2e253d856405bffcbc54105b19c8563600020b03103711c44d0303b04aac005546593911b74ce2d09151c60089046512a100641a14109419789f522203f6082e19385ba9d69a0b008e2682ef</data>
</image>
<image name="image5">
<data format="XPM.GZ" length="1226">789cc5d3c10ac2300c00d07bbf222cb722dd9c1741fc04c5a3201e4615f430059d0711ffdd2ada364d8a3010c30e813cb2a4b4a586e56206ba54e7aee9f616ecae3981de5cdaf6ba5a4f6faa18d5e0be1a86c54015062ccc8f87ed33479763e5625cbd4a5fa287411f598328a1d8c485388f0ce96f244347202818b60e336917d130c24d98826f9f3f9f8c61bb894622c9398be48f465e8c190191bb81463c23660ced85c4840ac629355177afd064cda7292686c67bfe74e614f91fe6df6998fc47efbdbfb94fd403df21d37e</data>
<data format="XPM.GZ" length="5806">789c5d58c76e253b0eddf75718cd5d63a0573960300be79c730f6641aaaaeceb1caee3c3fcfb8887d7e32ed5e9067c4c8a922806c97ffd9a3bdbdb9efbf5d78fe7294f277ece5ff2d3dcafeee5f6f6e3dffff9d7df3f7e66d99cfe6b8bb9ece73f7efcdc9fcef9b99dfbbb5e89a34028c107be30e6f410c939e28bca077ce0b7917c3eb217cd273bd1f89b483e19cbe931b22fcab35e01b98be49f63ce5534df75a4bf13e9ef47f3df47f2f9b19cf7c6dc3f46f203e5be50807f46ebf988ece33cea4101be1bd9ab95f79d02e3db687c83f90605f84734fe4a79890ffe863ffa41017b9017b902fb5f57ded40a8cbf847ea3c0f8c81f12ed8f2fc05305f821ecb50af0f7687cb45f417c74ad021cfe193205c60fe08d02f2ab687e8ba75c0179745edc47e77dae5c2a05e4f06f3b28203f1b9f279d627d8302fc04f60a05e6cba3f9903f65a280bc88e63f8ef68ffc6251e07cb69557990272c46b5f28c04b8c6705ec1d45f67f63bd5e017b587fd52b205f86bc50802fc13e3ec4f710ede768bc1e5ac3f98a0272e42bccc39fb432f62f1d8ecf93acbe540aeca71ac7a7bf88f6b38af3a914e00bd1795bfeb102bc1ec7af473c0fa2801cf5a42e14e0c8a79e15d07f8af63fc57e7205e647fc75a502fa93b17d42bef954018efce97305e6bb1be73f81379502f3a11e0b3ee8b7e3fcf251fc13f2877305f4e16fa915904fc6e72d88df5e14e088c72e55809f8ef3cdbbc87f88076915903f47eb413c37f8a08ff386393b5f8ae21fe7eb6b05f859e4fff5e8fc517f3c3ed8bb8ee6bf1cdbf31cc90fc6f129e7517d97687d88676cd7e21df9d5d60ac879bc3e413ed5ac40fe21be5baf00477c369d02f6e08f365180c39f4da6803de46bdd2b30be8cea15f2455205e4cd787e427fe04e017be8ff955760beb5717d70a8576da180fc7cac4fa80f6da9803df4cfb256401ff953150ad8437cd59902e3d10f1a56603c8deb25e3fccb5481f1a8af4dae0047fcd5b902fa889f9215901f46f50ef51fe960f5351be73fbd41bf53408ef8403a227e5d3ae6d481d70accefc7fd5950bf9354010eff26b902f165f7af5a01fe0ade28a06ff70556408ef525a200c77e934e81f5219fc364cdecbe837c49d3ac48ac3e61fe345340be31e3d54c1ff5212dd2c2b87ff9e2a9f9e7d578d6dafadcd68c8bad8f71bfc271613e42bf4aab2ffbec8ce76962f106ffa5b502f612e379369363bf69ab80bd3de3999fed1fe799b202e32f8de7f9cc1f88af54f23eb17c368e820cb98df7f990dafe07e3456adc9b7f501021bf335e54a9c59fadaf2f5a5bbf473f4279b6fbd5a6727577827ae0d7bf7866f17c613c17f3aff3c6cbc4ec09d697e183bc335ea6a9c507fc9f150a70c473562ae0bf47e35562e3c5380a0afcb961bc98f957b0ffac5540fe64bcf299ad07fd2f6305e46cbc1a32cba77be3e100ad5ec2df9957403f315e0fb9d96f8d37696ef1837e93754d965b7f41bc7ddfff05f188eb83f977cd7893e7162f27332e85c5dbd28c0f85f50bf3d7c089d527c2f9e4a1da64f67e81fff3b42972ccc777c6dbbeb47a85fb6a1e1c965b3fba31ce5569f1b434e34d69f182fe90e761bfb6bf65e3925b3d64f4c7bc90597d149c6f5e2a20473fcbabaab3fd12fa475e378dddd719e78d7288f364f83fe7362bac1f9a3d5c58601fe79d7b05d687f3ccbbe01fcb278c2f1205ec1d1baf0bb32f383f94038bdf57e375929b7f4be36d65fef2b08ff0340e7f7ebf3718f5b12815b08ffc45bb307b2fc6dbb4b0f35e352e556debb3f951c02137fdbaee6cfd6ecf78d0b7f708fa47d128b01edc4782fbc5f6cfb67e5cf8b11ee427ae4b384f3f3fee4f6edf785316d6bf36c7fd8a500fcb523aebbf928efba3c77da2ec15b067fd35f721c2307e3ae37963f160fdba08729bdf78f9a52fcfe3fee4115f152b307ec5b8af4c9f37c7fd8ed371bf14e403aee7167f85f1b01ebbdfa0fea17c5b7f437dc3f6acdfa07fe17a64f98efb4edd7999ddff902f4daa00c77deefbbee366f71fdfb5767ec85f1c9fed17f9f5c7fb12ebfbbe4f09ead71ff735c407daa9d577eceffbbe4c62bc63b6f70ff215d709db8fddaff1e0823efc25499f0ae40ef541b23e11cb17d8935281f9917f782e59ffb4f751d36762e78ff54adb1782f513f243fabeb4f70323ff90bed67fec7d2a7debedbd617f0fe87befedbe8378efc2ebd4eefb0ef53fa47bd2597ea17e74c39077361ffc1d9ae58c3becfffbfebb3ffd8223c74e9c779debdde02edca59bb82b77ed6ec2ef4935fed40fdab7eeceddbb07f7e89edcb39bba17f7eadedcbbfb709f6ede2dfca9ef16838d3bb7e496dd8a5b756be1e775b7e136c30c6f6ecb6dbb1d1df1a51fb417c2acf7417bd7edb9fda0357107eed01db9e3f0d3963b71a73ae20ffb6afdc19db973f7db252e7599cb5de14a57b9da3561c4c4b5e4fe6f7f8188d82d93907713eaa8a7812ee892267445d77443b7e1b777740fff3db8797a743bf444cf34a5177aa5377aa70ffaa4795aa0455aa2655aa1555aa375f877e2de698336698bb6698776698fb07e3a08b60fe9888ee9844ee98ccee9b7e95342296594534125555453432d3b266696f0e8edc2c375e00bbee409e2e5ca4df89a6ff896eff89e1f82ee63f8cd133ff33468bff02bbff13b7ff027c33fbcc08b18b1c4cbbc32d35ee5355e0fda1bbcc95bbccd3bbccb7bbc0ffd033ee4a3a073cc277c0aed333ee7df413b0957b22ce4551172e78de7d9deb375b8e8b7e23047d016e27361f6e179eba50b8fd0412eb8904bde11ac5faee45a6ee456eed42b722f0fc2f2284ff21cd6b12d53799157b9943779970fe87fcabc2c048fadc8a22cc9b2acc8aafe3140d6c2ff75d9904dd9926dfc79c0eafb8eecca1e9dc8be1cc8a11cc9b19cc8a99cc979d0ff1d2ed9a96416635ff129799014219fabf08468a4f5ceebdf1b82efc3d7c9a6efbf62fe2b7e742e3ff80b7fe927fe2a685f43fbc6dffa3b7fef1f627dff68ebf34f41fbd95fe3e71bdef253cefdcb77067ec733effa57e9fd9b7f87ee47b0fde9e7fdbcbc7f5b1fe7a3aeca2ff8c5b08625bfec57fc34e8074f7dcb63fd30625e3efc1abf8571eb7e63ac0bfdfffef3c7ff00e7f464ef</data>
</image>
</images>
<connections>
@ -248,13 +248,13 @@
<include location="local" impldecl="in implementation">qgisappbase.ui.h</include>
</includes>
<slots>
<slot>addLayer()</slot>
<slot>fileExit()</slot>
<slot>fileOpen()</slot>
<slot>init()</slot>
<slot>drawLayers()</slot>
<slot>addLayer()</slot>
<slot>zoomIn()</slot>
<slot>zoomOut()</slot>
<slot>init()</slot>
<slot>drawLayers()</slot>
</slots>
<layoutdefaults spacing="6" margin="11"/>
</UI>

View File

@ -52,4 +52,4 @@ void QgisAppBase::init()
void QgisAppBase::drawLayers()
{
}
}

View File

@ -1,6 +1,7 @@
#include <qstring.h>
#include <qpainter.h>
#include <qpointarray.h>
#include <qbrush.h>
#include "qgsrect.h"
#include <libpq++.h>
#include <qmessagebox.h>
@ -47,6 +48,7 @@ QgsDatabaseLayer::QgsDatabaseLayer(const char *conninfo, QString table) :
//QMessageBox::warning(this,"Connection Problem",msg);
valid = false;
}
}else{
QString msg = "Unable to get geometry information for " + tableName;
//QMessageBox::warning(this,"Connection Problem",msg);
@ -69,6 +71,8 @@ void QgsDatabaseLayer::draw(QPainter *p, QgsRect *viewExtent, int yTransform){
3. transform
4. draw
*/
cout << "Drawing layer using view extent " << viewExtent->stringRep() <<
" with a y transform of " << yTransform << endl;
PgCursor pgs(dataSource, "drawCursor");
QString sql = "select asbinary(" + geometryColumn + ",'" + endianString();
sql += "') as features from " + tableName;
@ -86,7 +90,7 @@ void QgsDatabaseLayer::draw(QPainter *p, QgsRect *viewExtent, int yTransform){
memset (feature, '\0', pgs.GetLength (idx, 0) + 1);
memcpy (feature, pgs.GetValue (idx, 0), pgs.GetLength (idx, 0));
wkbType = (int)feature[1];
cout << "Feature type: " << wkbType << endl;
//cout << "Feature type: " << wkbType << endl;
// read each feature based on its type
double *x;
double *y;
@ -171,7 +175,9 @@ void QgsDatabaseLayer::draw(QPainter *p, QgsRect *viewExtent, int yTransform){
}
break;
case WKBMultiPolygon:
p->setPen(Qt::blue);
p->setPen(Qt::darkGreen);
QBrush brush(Qt::green);
p->setBrush(brush);
// get the number of polygons
ptr = feature + 5;
numPolygons = (int *)ptr;

View File

@ -34,6 +34,7 @@ void QgsMapCanvas::addLayer(QgsMapLayer *lyr){
if(layers.size() == 1){
fullExtent = lyr->extent();
}
render();
// set zpos to something...
//lyr->zpos = 0;
}
@ -61,12 +62,12 @@ void QgsMapCanvas::render(){
QRect v = paint->viewport ();
int d = QMIN (v.width (), v.height ());
int dm = QMAX(v.width(), v.height());
paint->setViewport (v.left () + (v.width () - d) / 2,
v.top () + (v.height () - d) / 2, d, d);
paint->setViewport (v.left () + (v.width () - d) / 2,
v.top () + (v.height () - d) / 2, d, d);
// render all layers in the stack, starting at the base
map<QString,QgsMapLayer *>::iterator mi = layers.begin();
int yTransform = mapWindow->bottom() - abs(mapWindow->height() - currentExtent.height())/2;
int yTransform = currentExtent.yMax();//mapWindow->bottom() - abs(mapWindow->height() - currentExtent.height())/2;
while(mi != layers.end()){
QgsMapLayer *ml = (*mi).second;
// QgsDatabaseLayer *dbl = (QgsDatabaseLayer *)&ml;
@ -76,3 +77,6 @@ void QgsMapCanvas::render(){
}
paint->end();
}
void QgsMapCanvas::paintEvent(QPaintEvent *pe){
render();
}

View File

@ -19,8 +19,10 @@
#define QGSMAPCANVAS_H
#include <map>
#include <qwidget.h>
#include <qevent.h>
#include "qgsrect.h"
class QRect;
class QgsMapLayer;
/*! \class QgsMapCanvas
@ -42,7 +44,7 @@ public:
*/
void render();
private:
void paintEvent(QPaintEvent *pe);
//! map containing the layers by name
map<QString,QgsMapLayer *>layers;
//! Full extent of the map canvas