35 #include <QDomDocument>
38 #include <QListIterator>
41 #include <QCoreApplication>
54 mSize = QSize( 0, 0 );
99 if ( extent.
width() > 0 &&
101 extent.
width() < 1 &&
106 double xMean = ( qAbs( extent.
xMinimum() ) + qAbs( extent.
xMaximum() ) ) * 0.5;
107 double yMean = ( qAbs( extent.
yMinimum() ) + qAbs( extent.
yMaximum() ) ) * 0.5;
109 double xRange = extent.
width() / xMean;
110 double yRange = extent.
height() / yMean;
112 static const double minProportion = 1e-12;
113 if ( xRange < minProportion || yRange < minProportion )
127 mSize = QSizeF( size.width(), size.height() );
146 return mSize.toSize();
156 double myHeight =
mSize.height();
157 double myWidth =
mSize.width();
161 if ( !myWidth || !myHeight )
172 mMapUnitsPerPixel = mapUnitsPerPixelY > mapUnitsPerPixelX ? mapUnitsPerPixelY : mapUnitsPerPixelX;
175 double dxmin, dxmax, dymin, dymax, whitespace;
177 if ( mapUnitsPerPixelY > mapUnitsPerPixelX )
194 QgsDebugMsg( QString(
"Map units per pixel (x,y) : %1, %2\n" ).arg( mapUnitsPerPixelX ).arg( mapUnitsPerPixelY ) );
195 QgsDebugMsg( QString(
"Pixmap dimensions (x,y) : %1, %2\n" ).arg( myWidth ).arg( myHeight ) );
208 QgsDebugMsg( QString(
"Scale (assuming meters as map units) = 1:%1" ).arg(
mScale ) );
221 bool mySameAsLastFlag =
true;
231 if (
mSize.width() == 1 &&
mSize.height() == 1 )
237 QPaintDevice* thePaintDevice = painter->device();
238 if ( !thePaintDevice )
247 QCoreApplication::processEvents();
279 double scaleFactor = 1.0;
282 scaleFactor = sceneDpi / 25.4;
284 double rasterScaleFactor = ( thePaintDevice->logicalDpiX() + thePaintDevice->logicalDpiY() ) / 2.0 / sceneDpi;
288 mySameAsLastFlag =
false;
293 mySameAsLastFlag =
false;
299 mySameAsLastFlag =
false;
304 mySameAsLastFlag =
false;
313 if ( !mySameAsLastFlag )
316 QSettings mySettings;
317 if ( mySettings.value(
"/qgis/enable_render_caching",
false ).toBool() )
324 QList<QgsVectorOverlay*> allOverlayList;
332 while ( li.hasPrevious() )
343 QString layerId = li.previous();
345 QgsDebugMsg(
"Rendering at layer item " + layerId );
353 QgsDebugMsg(
"If there is a QPaintEngine error here, it is caused by an emit call" );
403 bool scaleRaster =
false;
419 QList<QgsVectorOverlay*> thisLayerOverlayList;
422 QList<QgsVectorOverlay*>::iterator overlayIt = thisLayerOverlayList.begin();
423 for ( ; overlayIt != thisLayerOverlayList.end(); ++overlayIt )
425 if (( *overlayIt )->displayFlag() )
428 allOverlayList.push_back( *overlayIt );
432 overlayManager->
addLayer( vl, thisLayerOverlayList );
448 QSettings mySettings;
451 if ( mySettings.value(
"/qgis/enable_render_caching",
false ).toBool() )
453 if ( !mySameAsLastFlag || ml->
cacheImage() == 0 )
455 QgsDebugMsg(
"\n\n\nCaching enabled but layer redraw forced by extent change or empty cache\n\n\n" );
460 QPainter * mypPainter =
new QPainter( ml->
cacheImage() );
462 if ( mySettings.value(
"/qgis/enable_anti_aliasing",
true ).toBool() )
464 mypPainter->setRenderHint( QPainter::Antialiasing );
468 else if ( mySameAsLastFlag )
471 QgsDebugMsg(
"\n\n\nCaching enabled --- drawing layer from cached image\n\n\n" );
472 mypContextPainter->drawImage( 0, 0, *( ml->
cacheImage() ) );
516 if ( mySettings.value(
"/qgis/enable_render_caching",
false ).toBool() )
525 mypContextPainter->drawImage( 0, 0, *( ml->
cacheImage() ) );
532 QgsDebugMsg(
"Layer not rendered because it is not within the defined "
533 "visibility scale range" );
544 while ( li.hasPrevious() )
551 QString layerId = li.previous();
590 if ( overlayManager && allOverlayList.size() > 0 )
594 QList<QgsVectorOverlay*>::iterator allOverlayIt = allOverlayList.begin();
595 for ( ; allOverlayIt != allOverlayList.end(); ++allOverlayIt )
602 delete overlayManager;
616 QgsDebugMsg(
"Rendering completed in (seconds): " + QString(
"%1" ).arg( renderTime.elapsed() / 1000.0 ) );
650 QgsDebugMsg(
"Adjusting DistArea projection on/off" );
703 static const double splitCoord = 180.0;
705 if ( tr.sourceCrs().geographicFlag() )
717 if ( ll.
x() > ur.
x() )
734 extent =
QgsRectangle( -DBL_MAX, -DBL_MAX, DBL_MAX, DBL_MAX );
735 r2 =
QgsRectangle( -DBL_MAX, -DBL_MAX, DBL_MAX, DBL_MAX );
749 extent = tr.transformBoundingBox( extent );
754 QgsDebugMsg( QString(
"Transform error caught: " ).arg( cse.
what() ) );
777 QgsDebugMsg( QString(
"Transform error caught: %1" ).arg( cse.
what() ) );
798 QgsDebugMsg( QString(
"Transform error caught: %1" ).arg( cse.
what() ) );
820 QgsDebugMsg( QString(
"Transform error caught: %1" ).arg( cse.
what() ) );
839 QStringList::iterator it =
mLayerSet.begin();
845 QgsDebugMsg( QString(
"WARNING: layer '%1' not found in map layer registry!" ).arg( *it ) );
856 QgsDebugMsg(
"Output extent: " + extent.toString() );
876 const double padFactor = 1e-8;
910 QString overlayAlgorithmQString = settings.value(
"qgis/overlayPlacementAlgorithm",
"Central point" ).toString();
914 if ( overlayAlgorithmQString !=
"Central point" )
917 if ( overlayAlgorithmQString ==
"Chain" )
921 else if ( overlayAlgorithmQString ==
"Popmusic tabu chain" )
925 else if ( overlayAlgorithmQString ==
"Popmusic tabu" )
929 else if ( overlayAlgorithmQString ==
"Popmusic chain" )
945 QDomNode myNode = theNode.namedItem(
"units" );
946 QDomElement element = myNode.toElement();
950 if (
"meters" == element.text() )
954 else if (
"feet" == element.text() )
958 else if (
"degrees" == element.text() )
962 else if (
"unknown" == element.text() )
968 QgsDebugMsg(
"Unknown map unit type " + element.text() );
976 QDomNode extentNode = theNode.namedItem(
"extent" );
978 QDomNode xminNode = extentNode.namedItem(
"xmin" );
979 QDomNode yminNode = extentNode.namedItem(
"ymin" );
980 QDomNode xmaxNode = extentNode.namedItem(
"xmax" );
981 QDomNode ymaxNode = extentNode.namedItem(
"ymax" );
983 QDomElement exElement = xminNode.toElement();
984 double xmin = exElement.text().toDouble();
987 exElement = yminNode.toElement();
988 double ymin = exElement.text().toDouble();
991 exElement = xmaxNode.toElement();
992 double xmax = exElement.text().toDouble();
995 exElement = ymaxNode.toElement();
996 double ymax = exElement.text().toDouble();
1002 QDomNode projNode = theNode.namedItem(
"projections" );
1003 element = projNode.toElement();
1008 QDomNode srsNode = theNode.namedItem(
"destinationsrs" );
1019 QDomElement unitsNode = theDoc.createElement(
"units" );
1020 theNode.appendChild( unitsNode );
1022 QString unitsString;
1027 unitsString =
"meters";
1030 unitsString =
"feet";
1033 unitsString =
"degrees";
1037 unitsString =
"unknown";
1040 QDomText unitsText = theDoc.createTextNode( unitsString );
1041 unitsNode.appendChild( unitsText );
1045 QDomElement extentNode = theDoc.createElement(
"extent" );
1046 theNode.appendChild( extentNode );
1048 QDomElement xMin = theDoc.createElement(
"xmin" );
1049 QDomElement yMin = theDoc.createElement(
"ymin" );
1050 QDomElement xMax = theDoc.createElement(
"xmax" );
1051 QDomElement yMax = theDoc.createElement(
"ymax" );
1054 QDomText xMinText = theDoc.createTextNode( QString::number( r.
xMinimum(),
'f' ) );
1055 QDomText yMinText = theDoc.createTextNode( QString::number( r.
yMinimum(),
'f' ) );
1056 QDomText xMaxText = theDoc.createTextNode( QString::number( r.
xMaximum(),
'f' ) );
1057 QDomText yMaxText = theDoc.createTextNode( QString::number( r.
yMaximum(),
'f' ) );
1059 xMin.appendChild( xMinText );
1060 yMin.appendChild( yMinText );
1061 xMax.appendChild( xMaxText );
1062 yMax.appendChild( yMaxText );
1064 extentNode.appendChild( xMin );
1065 extentNode.appendChild( yMin );
1066 extentNode.appendChild( xMax );
1067 extentNode.appendChild( yMax );
1070 QDomElement projNode = theDoc.createElement(
"projections" );
1071 theNode.appendChild( projNode );
1074 projNode.appendChild( projText );
1077 QDomElement srsNode = theDoc.createElement(
"destinationsrs" );
1078 theNode.appendChild( srsNode );