void QgsComposerLegendWidget::updateLegend() { if ( mLegend ) { mLegend->beginCommand( tr( "Legend updated" ) ); QgisApp* app = QgisApp::instance(); if ( !app ) { return; } //get layer id list QStringList layerIdList; QgsMapCanvas* canvas = app->mapCanvas(); if ( canvas ) { QgsMapRenderer* renderer = canvas->mapRenderer(); if ( renderer ) { layerIdList = renderer->layerSet(); } } //and also group info QgsAppLegendInterface legendIface( app->legend() ); QList< GroupLayerInfo > groupInfo = legendIface.groupLayerRelationship(); mLegend->model()->setLayerSetAndGroups( layerIdList, groupInfo ); mLegend->endCommand(); } }
osg::Image* QgsOsgEarthTileSource::createImage( const TileKey& key, ProgressCallback* progress ) { Q_UNUSED( key ); Q_UNUSED( progress ); osg::ref_ptr<osg::Image> image; if ( intersects( &key ) ) { //Get the extents of the tile double xmin, ymin, xmax, ymax; key.getExtent().getBounds( xmin, ymin, xmax, ymax ); int tileSize = getPixelsPerTile(); int target_width = tileSize; int target_height = tileSize; QgsDebugMsg( "QGIS: xmin:" + QString::number( xmin ) + " ymin:" + QString::number( ymin ) + " ymax:" + QString::number( ymax ) + " ymax " + QString::number( ymax ) ); //Return if parameters are out of range. if ( target_width <= 0 || target_height <= 0 ) { return 0; } QImage* qImage = createImage( target_width, target_height ); if ( !qImage ) { return 0; } QgsMapRenderer* mainRenderer = mQGisIface->mapCanvas()->mapRenderer(); mMapRenderer->setLayerSet( mainRenderer->layerSet() ); mMapRenderer->setOutputSize( QSize( qImage->width(), qImage->height() ), qImage->logicalDpiX() ); QgsRectangle mapExtent( xmin, ymin, xmax, ymax ); mMapRenderer->setExtent( mapExtent ); QPainter thePainter( qImage ); //thePainter.setRenderHint(QPainter::Antialiasing); //make it look nicer mMapRenderer->render( &thePainter ); unsigned char* data = qImage->bits(); image = new osg::Image; //The pixel format is always RGBA to support transparency image->setImage( qImage->width(), qImage->height(), 1, 4, GL_BGRA, GL_UNSIGNED_BYTE, //Why not GL_RGBA - QGIS bug? data, osg::Image::NO_DELETE, 1 ); image->flipVertical(); } //Create a transparent image if we don't have an image if ( !image.valid() ) { return ImageUtils::createEmptyImage(); } return image.release(); }
void QgsOsgEarthTileSource::initialize( const std::string& referenceURI, const Profile* overrideProfile ) { Q_UNUSED( referenceURI ); Q_UNUSED( overrideProfile ); setProfile( osgEarth::Registry::instance()->getGlobalGeodeticProfile() ); QgsMapRenderer* mainRenderer = mQGisIface->mapCanvas()->mapRenderer(); mMapRenderer = new QgsMapRenderer(); long epsgGlobe = 4326; if ( mainRenderer->destinationCrs().authid().compare( QString( "EPSG:%1" ).arg( epsgGlobe ), Qt::CaseInsensitive ) != 0 ) { QgsCoordinateReferenceSystem srcCRS( mainRenderer->destinationCrs() ); //FIXME: crs from canvas or first layer? QgsCoordinateReferenceSystem destCRS; destCRS.createFromOgcWmsCrs( QString( "EPSG:%1" ).arg( epsgGlobe ) ); //QgsProject::instance()->writeEntry("SpatialRefSys","/ProjectionsEnabled",1); mMapRenderer->setDestinationCrs( destCRS ); mMapRenderer->setProjectionsEnabled( true ); mCoordTranform = new QgsCoordinateTransform( srcCRS, destCRS ); } mMapRenderer->setOutputUnits( mainRenderer->outputUnits() ); mMapRenderer->setMapUnits( QGis::Degrees ); mMapRenderer->setLabelingEngine( new QgsPalLabeling() ); }
void GlobePlugin::syncExtent() { QgsMapCanvas* mapCanvas = mQGisIface->mapCanvas(); QgsMapRenderer* mapRenderer = mapCanvas->mapRenderer(); QgsRectangle extent = mapCanvas->extent(); osgEarth::Util::EarthManipulator* manip = dynamic_cast<osgEarth::Util::EarthManipulator*>( mOsgViewer->getCameraManipulator() ); //rotate earth to north and perpendicular to camera manip->setRotation( osg::Quat() ); QgsDistanceArea dist; dist.setSourceCrs( mapRenderer->destinationCrs().srsid() ); dist.setEllipsoidalMode( mapRenderer->hasCrsTransformEnabled() ); dist.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); QgsPoint ll = QgsPoint( extent.xMinimum(), extent.yMinimum() ); QgsPoint ul = QgsPoint( extent.xMinimum(), extent.yMaximum() ); double height = dist.measureLine( ll, ul ); //camera viewing angle double viewAngle = 30; //camera distance double distance = height / tan( viewAngle * osg::PI / 180 ); //c = b*cotan(B(rad)) OE_NOTICE << "map extent: " << height << " camera distance: " << distance << std::endl; osgEarth::Util::Viewpoint viewpoint( osg::Vec3d( extent.center().x(), extent.center().y(), 0.0 ), 0.0, -90.0, distance ); manip->setViewpoint( viewpoint, 4.0 ); }
void QgsMapToolLabel::createRubberBands( ) { delete mLabelRubberBand; delete mFeatureRubberBand; //label rubber band QgsRectangle rect = mCurrentLabelPos.labelRect; mLabelRubberBand = new QgsRubberBand( mCanvas, false ); mLabelRubberBand->addPoint( QgsPoint( rect.xMinimum(), rect.yMinimum() ) ); mLabelRubberBand->addPoint( QgsPoint( rect.xMinimum(), rect.yMaximum() ) ); mLabelRubberBand->addPoint( QgsPoint( rect.xMaximum(), rect.yMaximum() ) ); mLabelRubberBand->addPoint( QgsPoint( rect.xMaximum(), rect.yMinimum() ) ); mLabelRubberBand->addPoint( QgsPoint( rect.xMinimum(), rect.yMinimum() ) ); mLabelRubberBand->setColor( Qt::green ); mLabelRubberBand->setWidth( 3 ); mLabelRubberBand->show(); //feature rubber band QgsVectorLayer* vlayer = currentLayer(); if ( vlayer ) { QgsFeature f; if ( currentFeature( f, true ) ) { QgsGeometry* geom = f.geometry(); if ( geom ) { mFeatureRubberBand = new QgsRubberBand( mCanvas, geom->type() == QGis::Polygon ); mFeatureRubberBand->setColor( Qt::red ); mFeatureRubberBand->setToGeometry( geom, vlayer ); mFeatureRubberBand->show(); } } //fixpoint rubber band QgsPoint fixPoint; if ( rotationPoint( fixPoint ) ) { if ( mCanvas ) { QgsMapRenderer* r = mCanvas->mapRenderer(); if ( r && r->hasCrsTransformEnabled() ) { fixPoint = r->mapToLayerCoordinates( vlayer, fixPoint ); } } QgsGeometry* pointGeom = QgsGeometry::fromPoint( fixPoint ); mFixPointRubberBand = new QgsRubberBand( mCanvas, false ); mFixPointRubberBand->setColor( Qt::blue ); mFixPointRubberBand->setToGeometry( pointGeom, vlayer ); mFixPointRubberBand->show(); delete pointGeom; } } }
QStringList QgsComposerLegend::layerIdList() const { //take layer list from map renderer (to have legend order) if ( mComposition ) { QgsMapRenderer* r = mComposition->mapRenderer(); if ( r ) { return r->layerSet(); } } return QStringList(); }
bool QgsMapCanvasItem::setRenderContextVariables( QPainter* p, QgsRenderContext& context ) const { if ( !mMapCanvas || !p ) { return false; } QgsMapRenderer* mapRenderer = mMapCanvas->mapRenderer(); if ( !mapRenderer ) { return false; } context.setPainter( p ); context.setRendererScale( mMapCanvas->scale() ); int dpi = mapRenderer->outputDpi(); int painterDpi = p->device()->logicalDpiX(); double scaleFactor = 1.0; double rasterScaleFactor = 1.0; //little trick to find out if painting origines from composer or main map canvas if ( data( 1 ).toString() == "composer" ) { rasterScaleFactor = painterDpi / 25.4; scaleFactor = dpi / 25.4; } else { if ( mapRenderer->outputUnits() == QgsMapRenderer::Millimeters ) { scaleFactor = dpi / 25.4; } } context.setScaleFactor( scaleFactor ); context.setRasterScaleFactor( rasterScaleFactor ); return true; }
QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *parent, Qt::WFlags fl ) : QDialog( parent, fl ) , mMapCanvas( mapCanvas ) { setupUi( this ); connect( buttonBox, SIGNAL( accepted() ), this, SLOT( accept() ) ); connect( buttonBox, SIGNAL( rejected() ), this, SLOT( reject() ) ); connect( buttonBox->button( QDialogButtonBox::Apply ), SIGNAL( clicked() ), this, SLOT( apply() ) ); connect( this, SIGNAL( accepted() ), this, SLOT( apply() ) ); connect( projectionSelector, SIGNAL( sridSelected( QString ) ), this, SLOT( setMapUnitsToCurrentProjection() ) ); /////////////////////////////////////////////////////////// // Properties stored in map canvas's QgsMapRenderer // these ones are propagated to QgsProject by a signal QgsMapRenderer* myRenderer = mMapCanvas->mapRenderer(); QGis::UnitType myUnit = myRenderer->mapUnits(); setMapUnits( myUnit ); // we need to initialize it, since the on_cbxProjectionEnabled_stateChanged() // callback triggered by setChecked() might use it. mProjectSrsId = myRenderer->destinationCrs().srsid(); //see if the user wants on the fly projection enabled bool myProjectionEnabled = myRenderer->hasCrsTransformEnabled(); cbxProjectionEnabled->setChecked( myProjectionEnabled ); QgsDebugMsg( "Read project CRSID: " + QString::number( mProjectSrsId ) ); projectionSelector->setSelectedCrsId( mProjectSrsId ); projectionSelector->setEnabled( myProjectionEnabled ); /////////////////////////////////////////////////////////// // Properties stored in QgsProject title( QgsProject::instance()->title() ); // get the manner in which the number of decimal places in the mouse // position display is set (manual or automatic) bool automaticPrecision = QgsProject::instance()->readBoolEntry( "PositionPrecision", "/Automatic" ); if ( automaticPrecision ) { radAutomatic->setChecked( true ); spinBoxDP->setDisabled( true ); labelDP->setDisabled( true ); } else { radManual->setChecked( true ); } cbxAbsolutePath->setCurrentIndex( QgsProject::instance()->readBoolEntry( "Paths", "/Absolute", true ) ? 0 : 1 ); int dp = QgsProject::instance()->readNumEntry( "PositionPrecision", "/DecimalPlaces" ); spinBoxDP->setValue( dp ); QString format = QgsProject::instance()->readEntry( "PositionPrecision", "/DegreeFormat", "D" ); if ( format == "DM" ) radDM->setChecked( true ); else if ( format == "DMS" ) radDMS->setChecked( true ); else radD->setChecked( true ); //get the color selections and set the button color accordingly int myRedInt = QgsProject::instance()->readNumEntry( "Gui", "/SelectionColorRedPart", 255 ); int myGreenInt = QgsProject::instance()->readNumEntry( "Gui", "/SelectionColorGreenPart", 255 ); int myBlueInt = QgsProject::instance()->readNumEntry( "Gui", "/SelectionColorBluePart", 0 ); int myAlphaInt = QgsProject::instance()->readNumEntry( "Gui", "/SelectionColorAlphaPart", 255 ); QColor myColor = QColor( myRedInt, myGreenInt, myBlueInt, myAlphaInt ); pbnSelectionColor->setColor( myColor ); //get the color for map canvas background and set button color accordingly (default white) myRedInt = QgsProject::instance()->readNumEntry( "Gui", "/CanvasColorRedPart", 255 ); myGreenInt = QgsProject::instance()->readNumEntry( "Gui", "/CanvasColorGreenPart", 255 ); myBlueInt = QgsProject::instance()->readNumEntry( "Gui", "/CanvasColorBluePart", 255 ); myColor = QColor( myRedInt, myGreenInt, myBlueInt ); pbnCanvasColor->setColor( myColor ); //get project scales QStringList myScales = QgsProject::instance()->readListEntry( "Scales", "/ScalesList" ); if ( !myScales.isEmpty() ) { QStringList::const_iterator scaleIt = myScales.constBegin(); for ( ; scaleIt != myScales.constEnd(); ++scaleIt ) { QListWidgetItem* newItem = new QListWidgetItem( lstScales ); newItem->setText( *scaleIt ); newItem->setFlags( Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable ); lstScales->addItem( newItem ); } } grpProjectScales->setChecked( QgsProject::instance()->readBoolEntry( "Scales", "/useProjectScales" ) ); QgsMapLayer* currentLayer = 0; QStringList noIdentifyLayerIdList = QgsProject::instance()->readListEntry( "Identify", "/disabledLayers" ); const QMap<QString, QgsMapLayer*> &mapLayers = QgsMapLayerRegistry::instance()->mapLayers(); if ( mMapCanvas->currentLayer() ) { mLayerSrsId = mMapCanvas->currentLayer()->crs().srsid(); } else if ( mapLayers.size() > 0 ) { mLayerSrsId = mapLayers.begin().value()->crs().srsid(); } else { mLayerSrsId = mProjectSrsId; } twIdentifyLayers->setColumnCount( 3 ); twIdentifyLayers->horizontalHeader()->setVisible( true ); twIdentifyLayers->setHorizontalHeaderItem( 0, new QTableWidgetItem( tr( "Layer" ) ) ); twIdentifyLayers->setHorizontalHeaderItem( 1, new QTableWidgetItem( tr( "Type" ) ) ); twIdentifyLayers->setHorizontalHeaderItem( 2, new QTableWidgetItem( tr( "Identifiable" ) ) ); twIdentifyLayers->setRowCount( mapLayers.size() ); twIdentifyLayers->verticalHeader()->setResizeMode( QHeaderView::ResizeToContents ); int i = 0; for ( QMap<QString, QgsMapLayer*>::const_iterator it = mapLayers.constBegin(); it != mapLayers.constEnd(); it++, i++ ) { currentLayer = it.value(); QTableWidgetItem *twi = new QTableWidgetItem( QString::number( i ) ); twIdentifyLayers->setVerticalHeaderItem( i, twi ); twi = new QTableWidgetItem( currentLayer->name() ); twi->setData( Qt::UserRole, it.key() ); twi->setFlags( twi->flags() & ~Qt::ItemIsEditable ); twIdentifyLayers->setItem( i, 0, twi ); QString type; if ( currentLayer->type() == QgsMapLayer::VectorLayer ) { type = tr( "Vector" ); } else if ( currentLayer->type() == QgsMapLayer::RasterLayer ) { QgsRasterLayer *rl = qobject_cast<QgsRasterLayer *>( currentLayer ); if ( rl && rl->providerType() == "wms" ) { type = tr( "WMS" ); } else { type = tr( "Raster" ); } } twi = new QTableWidgetItem( type ); twi->setFlags( twi->flags() & ~Qt::ItemIsEditable ); twIdentifyLayers->setItem( i, 1, twi ); QCheckBox *cb = new QCheckBox(); cb->setChecked( !noIdentifyLayerIdList.contains( currentLayer->id() ) ); twIdentifyLayers->setCellWidget( i, 2, cb ); } grpOWSServiceCapabilities->setChecked( QgsProject::instance()->readBoolEntry( "WMSServiceCapabilities", "/", false ) ); mWMSTitle->setText( QgsProject::instance()->readEntry( "WMSServiceTitle", "/" ) ); mWMSContactOrganization->setText( QgsProject::instance()->readEntry( "WMSContactOrganization", "/", "" ) ); mWMSContactPerson->setText( QgsProject::instance()->readEntry( "WMSContactPerson", "/", "" ) ); mWMSContactMail->setText( QgsProject::instance()->readEntry( "WMSContactMail", "/", "" ) ); mWMSContactPhone->setText( QgsProject::instance()->readEntry( "WMSContactPhone", "/", "" ) ); mWMSAbstract->setPlainText( QgsProject::instance()->readEntry( "WMSServiceAbstract", "/", "" ) ); mWMSOnlineResourceLineEdit->setText( QgsProject::instance()->readEntry( "WMSOnlineResource", "/", "" ) ); mWMSUrlLineEdit->setText( QgsProject::instance()->readEntry( "WMSUrl", "/", "" ) ); bool ok; QStringList values; mWMSExtMinX->setValidator( new QDoubleValidator( mWMSExtMinX ) ); mWMSExtMinY->setValidator( new QDoubleValidator( mWMSExtMinY ) ); mWMSExtMaxX->setValidator( new QDoubleValidator( mWMSExtMaxX ) ); mWMSExtMaxY->setValidator( new QDoubleValidator( mWMSExtMaxY ) ); values = QgsProject::instance()->readListEntry( "WMSExtent", "/", &ok ); grpWMSExt->setChecked( ok && values.size() == 4 ); if ( grpWMSExt->isChecked() ) { mWMSExtMinX->setText( values[0] ); mWMSExtMinY->setText( values[1] ); mWMSExtMaxX->setText( values[2] ); mWMSExtMaxY->setText( values[3] ); } values = QgsProject::instance()->readListEntry( "WMSCrsList", "/", &ok ); grpWMSList->setChecked( ok && values.size() > 0 ); if ( grpWMSList->isChecked() ) { mWMSList->addItems( values ); } else { values = QgsProject::instance()->readListEntry( "WMSEpsgList", "/", &ok ); grpWMSList->setChecked( ok && values.size() > 0 ); if ( grpWMSList->isChecked() ) { QStringList list; foreach ( QString value, values ) { list << QString( "EPSG:%1" ).arg( value ); } mWMSList->addItems( list ); }
int main( int argc, char * argv[] ) { #ifndef _MSC_VER qInstallMsgHandler( dummyMessageHandler ); #endif QgsApplication qgsapp( argc, argv, getenv( "DISPLAY" ) ); //Default prefix path may be altered by environment variable QgsApplication::init(); #if defined(MAPSERVER_SKIP_ECW) QgsDebugMsg( "Skipping GDAL ECW drivers in server." ); QgsApplication::skipGdalDriver( "ECW" ); QgsApplication::skipGdalDriver( "JP2ECW" ); #endif QSettings settings; QgsNetworkAccessManager *nam = QgsNetworkAccessManager::instance(); QNetworkDiskCache *cache = new QNetworkDiskCache( 0 ); QString cacheDirectory = settings.value( "cache/directory", QgsApplication::qgisSettingsDirPath() + "cache" ).toString(); qint64 cacheSize = settings.value( "cache/size", 50 * 1024 * 1024 ).toULongLong(); QgsDebugMsg( QString( "setCacheDirectory: %1" ).arg( cacheDirectory ) ); QgsDebugMsg( QString( "setMaximumCacheSize: %1" ).arg( cacheSize ) ); cache->setCacheDirectory( cacheDirectory ); cache->setMaximumCacheSize( cacheSize ); QgsDebugMsg( QString( "cacheDirectory: %1" ).arg( cache->cacheDirectory() ) ); QgsDebugMsg( QString( "maximumCacheSize: %1" ).arg( cache->maximumCacheSize() ) ); nam->setCache( cache ); QDomImplementation::setInvalidDataPolicy( QDomImplementation::DropInvalidChars ); // Instantiate the plugin directory so that providers are loaded QgsProviderRegistry::instance( QgsApplication::pluginPath() ); QgsDebugMsg( "Prefix PATH: " + QgsApplication::prefixPath() ); QgsDebugMsg( "Plugin PATH: " + QgsApplication::pluginPath() ); QgsDebugMsg( "PkgData PATH: " + QgsApplication::pkgDataPath() ); QgsDebugMsg( "User DB PATH: " + QgsApplication::qgisUserDbFilePath() ); QgsDebugMsg( qgsapp.applicationDirPath() + "/qgis_wms_server.log" ); QgsApplication::createDB(); //init qgis.db (e.g. necessary for user crs) //create config cache and search for config files in the current directory. //These configurations are used if no mapfile parameter is present in the request QString defaultConfigFilePath; QFileInfo projectFileInfo = defaultProjectFile(); //try to find a .qgs file in the server directory if ( projectFileInfo.exists() ) { defaultConfigFilePath = projectFileInfo.absoluteFilePath(); QgsDebugMsg( "Using default project file: " + defaultConfigFilePath ); } else { QFileInfo adminSLDFileInfo = defaultAdminSLD(); if ( adminSLDFileInfo.exists() ) { defaultConfigFilePath = adminSLDFileInfo.absoluteFilePath(); } } //create cache for capabilities XML QgsCapabilitiesCache capabilitiesCache; //creating QgsMapRenderer is expensive (access to srs.db), so we do it here before the fcgi loop QgsMapRenderer* theMapRenderer = new QgsMapRenderer(); theMapRenderer->setLabelingEngine( new QgsPalLabeling() ); #ifdef QGSMSDEBUG QgsFontUtils::loadStandardTestFonts( QStringList() << "Roman" << "Bold" ); #endif while ( fcgi_accept() >= 0 ) { printRequestInfos(); //print request infos if in debug mode //use QgsGetRequestHandler in case of HTTP GET and QgsSOAPRequestHandler in case of HTTP POST QgsRequestHandler* theRequestHandler = 0; char* requestMethod = getenv( "REQUEST_METHOD" ); if ( requestMethod != NULL ) { if ( strcmp( requestMethod, "POST" ) == 0 ) { //QgsDebugMsg( "Creating QgsSOAPRequestHandler" ); //theRequestHandler = new QgsSOAPRequestHandler(); theRequestHandler = new QgsPostRequestHandler(); } else { QgsDebugMsg( "Creating QgsGetRequestHandler" ); theRequestHandler = new QgsGetRequestHandler(); } } else { QgsDebugMsg( "Creating QgsGetRequestHandler" ); theRequestHandler = new QgsGetRequestHandler(); } QMap<QString, QString> parameterMap; try { parameterMap = theRequestHandler->parseInput(); } catch ( QgsMapServiceException& e ) { QgsDebugMsg( "An exception was thrown during input parsing" ); theRequestHandler->sendServiceException( e ); continue; } QMap<QString, QString>::const_iterator paramIt; //set admin config file to wms server object QString configFilePath( defaultConfigFilePath ); QString projectFile = getenv( "QGIS_PROJECT_FILE" ); if ( !projectFile.isEmpty() ) { configFilePath = projectFile; } else { paramIt = parameterMap.find( "MAP" ); if ( paramIt == parameterMap.constEnd() ) { QgsDebugMsg( QString( "Using default configuration file path: %1" ).arg( defaultConfigFilePath ) ); } else { configFilePath = paramIt.value(); } } QgsConfigParser* adminConfigParser = QgsConfigCache::instance()->searchConfiguration( configFilePath ); if ( !adminConfigParser ) { QgsDebugMsg( "parse error on config file " + configFilePath ); theRequestHandler->sendServiceException( QgsMapServiceException( "", "Configuration file problem : perhaps you left off the .qgs extension?" ) ); continue; } //sld parser might need information about request parameters adminConfigParser->setParameterMap( parameterMap ); //request to WMS? QString serviceString; paramIt = parameterMap.find( "SERVICE" ); if ( paramIt == parameterMap.constEnd() ) { #ifndef QGISDEBUG serviceString = parameterMap.value( "SERVICE", "WMS" ); #else QgsDebugMsg( "unable to find 'SERVICE' parameter, exiting..." ); theRequestHandler->sendServiceException( QgsMapServiceException( "ServiceNotSpecified", "Service not specified. The SERVICE parameter is mandatory" ) ); delete theRequestHandler; continue; #endif } else { serviceString = paramIt.value(); } QgsWMSServer* theServer = 0; if ( serviceString == "WCS" ) { delete theServer; QgsWCSServer* theServer = 0; try { theServer = new QgsWCSServer( parameterMap ); } catch ( const QgsMapServiceException &e ) //admin.sld may be invalid { theRequestHandler->sendServiceException( e ); continue; } theServer->setAdminConfigParser( adminConfigParser ); //request type QString request = parameterMap.value( "REQUEST" ); if ( request.isEmpty() ) { //do some error handling QgsDebugMsg( "unable to find 'REQUEST' parameter, exiting..." ); theRequestHandler->sendServiceException( QgsMapServiceException( "OperationNotSupported", "Please check the value of the REQUEST parameter" ) ); delete theRequestHandler; delete theServer; continue; } if ( request.compare( "GetCapabilities", Qt::CaseInsensitive ) == 0 ) { QDomDocument capabilitiesDocument; try { capabilitiesDocument = theServer->getCapabilities(); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } QgsDebugMsg( "sending GetCapabilities response" ); theRequestHandler->sendGetCapabilitiesResponse( capabilitiesDocument ); delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "DescribeCoverage", Qt::CaseInsensitive ) == 0 ) { QDomDocument describeDocument; try { describeDocument = theServer->describeCoverage(); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } QgsDebugMsg( "sending GetCapabilities response" ); theRequestHandler->sendGetCapabilitiesResponse( describeDocument ); delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "GetCoverage", Qt::CaseInsensitive ) == 0 ) { QByteArray* coverageOutput; try { coverageOutput = theServer->getCoverage(); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } if ( coverageOutput ) { theRequestHandler->sendGetCoverageResponse( coverageOutput ); } delete theRequestHandler; delete theServer; continue; } } else if ( serviceString == "WFS" ) { delete theServer; QgsWFSServer* theServer = 0; try { theServer = new QgsWFSServer( parameterMap ); } catch ( const QgsMapServiceException &e ) //admin.sld may be invalid { theRequestHandler->sendServiceException( e ); continue; } theServer->setAdminConfigParser( adminConfigParser ); //request type QString request = parameterMap.value( "REQUEST" ); if ( request.isEmpty() ) { //do some error handling QgsDebugMsg( "unable to find 'REQUEST' parameter, exiting..." ); theRequestHandler->sendServiceException( QgsMapServiceException( "OperationNotSupported", "Please check the value of the REQUEST parameter" ) ); delete theRequestHandler; delete theServer; continue; } if ( request.compare( "GetCapabilities", Qt::CaseInsensitive ) == 0 ) { QDomDocument capabilitiesDocument; try { capabilitiesDocument = theServer->getCapabilities(); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } QgsDebugMsg( "sending GetCapabilities response" ); theRequestHandler->sendGetCapabilitiesResponse( capabilitiesDocument ); delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "DescribeFeatureType", Qt::CaseInsensitive ) == 0 ) { QDomDocument describeDocument; try { describeDocument = theServer->describeFeatureType(); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } QgsDebugMsg( "sending GetCapabilities response" ); theRequestHandler->sendGetCapabilitiesResponse( describeDocument ); delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "GetFeature", Qt::CaseInsensitive ) == 0 ) { //output format for GetFeature QString outputFormat = parameterMap.value( "OUTPUTFORMAT" ); try { theServer->getFeature( *theRequestHandler, outputFormat ); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); } delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "Transaction", Qt::CaseInsensitive ) == 0 ) { QDomDocument transactionDocument; try { transactionDocument = theServer->transaction( parameterMap.value( "REQUEST_BODY" ) ); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } QgsDebugMsg( "sending Transaction response" ); theRequestHandler->sendGetCapabilitiesResponse( transactionDocument ); delete theRequestHandler; delete theServer; continue; } return 0; } try { theServer = new QgsWMSServer( parameterMap, theMapRenderer ); } catch ( const QgsMapServiceException &e ) //admin.sld may be invalid { theRequestHandler->sendServiceException( e ); continue; } adminConfigParser->loadLabelSettings( theMapRenderer->labelingEngine() ); theServer->setAdminConfigParser( adminConfigParser ); //request type QString request = parameterMap.value( "REQUEST" ); if ( request.isEmpty() ) { //do some error handling QgsDebugMsg( "unable to find 'REQUEST' parameter, exiting..." ); theRequestHandler->sendServiceException( QgsMapServiceException( "OperationNotSupported", "Please check the value of the REQUEST parameter" ) ); delete theRequestHandler; delete theServer; continue; } QString version = parameterMap.value( "VERSION", "1.3.0" ); bool getProjectSettings = ( request.compare( "GetProjectSettings", Qt::CaseInsensitive ) == 0 ); if ( getProjectSettings ) { version = "1.3.0"; //getProjectSettings extends WMS 1.3.0 capabilities } if ( request.compare( "GetCapabilities", Qt::CaseInsensitive ) == 0 || getProjectSettings ) { const QDomDocument* capabilitiesDocument = capabilitiesCache.searchCapabilitiesDocument( configFilePath, getProjectSettings ? "projectSettings" : version ); if ( !capabilitiesDocument ) //capabilities xml not in cache. Create a new one { QgsDebugMsg( "Capabilities document not found in cache" ); QDomDocument doc; try { doc = theServer->getCapabilities( version, getProjectSettings ); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } capabilitiesCache.insertCapabilitiesDocument( configFilePath, getProjectSettings ? "projectSettings" : version, &doc ); capabilitiesDocument = capabilitiesCache.searchCapabilitiesDocument( configFilePath, getProjectSettings ? "projectSettings" : version ); } else { QgsDebugMsg( "Found capabilities document in cache" ); } if ( capabilitiesDocument ) { theRequestHandler->sendGetCapabilitiesResponse( *capabilitiesDocument ); } delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "GetMap", Qt::CaseInsensitive ) == 0 ) { QImage* result = 0; try { result = theServer->getMap(); } catch ( QgsMapServiceException& ex ) { QgsDebugMsg( "Caught exception during GetMap request" ); theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } if ( result ) { QgsDebugMsg( "Sending GetMap response" ); theRequestHandler->sendGetMapResponse( serviceString, result ); QgsDebugMsg( "Response sent" ); } else { //do some error handling QgsDebugMsg( "result image is 0" ); } delete result; delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "GetFeatureInfo", Qt::CaseInsensitive ) == 0 ) { QDomDocument featureInfoDoc; try { if ( theServer->getFeatureInfo( featureInfoDoc, version ) != 0 ) { delete theRequestHandler; delete theServer; continue; } } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } QString infoFormat = parameterMap.value( "INFO_FORMAT" ); theRequestHandler->sendGetFeatureInfoResponse( featureInfoDoc, infoFormat ); delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "GetContext", Qt::CaseInsensitive ) == 0 ) { try { QDomDocument doc = theServer->getContext(); theRequestHandler->sendGetStyleResponse( doc ); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); } delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "GetStyle", Qt::CaseInsensitive ) == 0 ) // GetStyle for compatibility with earlier QGIS versions { try { QDomDocument doc = theServer->getStyle(); theRequestHandler->sendGetStyleResponse( doc ); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); } delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "GetStyles", Qt::CaseInsensitive ) == 0 ) { // GetStyles is only defined for WMS1.1.1/SLD1.0 if ( version != "1.1.1" ) { theRequestHandler->sendServiceException( QgsMapServiceException( "OperationNotSupported", "GetStyles method is only available in WMS version 1.1.1" ) ); } else { try { QDomDocument doc = theServer->getStyles(); theRequestHandler->sendGetStyleResponse( doc ); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); } } delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "GetLegendGraphic", Qt::CaseInsensitive ) == 0 || request.compare( "GetLegendGraphics", Qt::CaseInsensitive ) == 0 ) // GetLegendGraphics for compatibility with earlier QGIS versions { QImage* result = 0; try { result = theServer->getLegendGraphics(); } catch ( QgsMapServiceException& ex ) { QgsDebugMsg( "Caught exception during GetLegendGraphic request" ); theRequestHandler->sendServiceException( ex ); } if ( result ) { QgsDebugMsg( "Sending GetLegendGraphic response" ); //sending is the same for GetMap and GetLegendGraphic theRequestHandler->sendGetMapResponse( serviceString, result ); QgsDebugMsg( "Response sent" ); } else { //do some error handling QgsDebugMsg( "result image is 0" ); } delete result; delete theRequestHandler; delete theServer; continue; } else if ( request.compare( "GetPrint", Qt::CaseInsensitive ) == 0 ) { QByteArray* printOutput = 0; try { printOutput = theServer->getPrint( theRequestHandler->format() ); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); } if ( printOutput ) { theRequestHandler->sendGetPrintResponse( printOutput ); } delete printOutput; delete theRequestHandler; delete theServer; continue; } else//unknown request { QgsMapServiceException e( "OperationNotSupported", "Operation " + request + " not supported" ); theRequestHandler->sendServiceException( e ); delete theRequestHandler; delete theServer; } } delete theMapRenderer; QgsDebugMsg( "************* all done ***************" ); return 0; }
void TestQgsWcsPublicServers::test( ) { QStringList versions; // It may happen that server supports 1.1.1, but does not accept 1.1 (http://zeus.pin.unifi.it/gi-wcs/http) versions << "" << "1.0.0" << "1.1.0"; // empty for default QStringList servers; // Some (first) coverages do not advertize any supportedCRS and sever gives // error both with native CRS (EPSG::561005) and EPSG:4326 // MOD* coverages work OK servers << "http://argon.geogr.uni-jena.de:8080/geoserver/ows"; servers << "http://demo.geonode.org/geoserver/wcs"; servers << "http://demo.mapserver.org/cgi-bin/wcs"; servers << "http://demo.opengeo.org/geoserver/wcs"; // geobrain.laits.gmu.edu servers are quite slow servers << "http://geobrain.laits.gmu.edu/cgi-bin/gbwcs-dem"; servers << "http://geobrain.laits.gmu.edu/cgi-bin/ows8/wcseo"; servers << "http://geobrain.laits.gmu.edu/cgi-bin/wcs110"; servers << "http://geobrain.laits.gmu.edu/cgi-bin/wcs-all"; servers << "http://iceds.ge.ucl.ac.uk/cgi-bin/icedswcs"; servers << "http://motherlode.ucar.edu:8080/thredds/wcs/fmrc/NCEP/DGEX/Alaska_12km/NCEP-DGEX-Alaska_12km_best.ncd"; servers << "http://navigator.state.or.us/ArcGIS/services/Framework/Imagery_Mosaic2009/ImageServer/WCSServer"; servers << "http://nsidc.org/cgi-bin/atlas_north"; servers << "http://sedac.ciesin.columbia.edu/geoserver/wcs"; // Big and slow //servers << "http://webmap.ornl.gov/ogcbroker/wcs"; servers << "http://ws.csiss.gmu.edu/cgi-bin/wcs-t"; // Big and slow //servers << "http://ws.laits.gmu.edu/cgi-bin/wcs-all"; // Currently very slow or down //servers << "http://www.sogeo.ch/geoserver/wcs"; // Slow and erroneous //servers << "http://zeus.pin.unifi.it/gi-wcs/http"; foreach ( QString server, servers ) { QStringList myServerLog; myServerLog << "server:" + server; QString myServerDirName = server; myServerDirName.replace( QRegExp( "[:/]+" ), "." ); myServerDirName.replace( QRegExp( "\\.$" ), "" ); QgsDebugMsg( "myServerDirName = " + myServerDirName ); QDir myServerDir( mCacheDir.absolutePath() + QDir::separator() + myServerDirName ); QString myServerLogPath = myServerDir.absolutePath() + QDir::separator() + "server.log"; if ( QFileInfo( myServerLogPath ).exists() ) { QgsDebugMsg( "cache exists " + myServerDir.absolutePath() ); continue; } if ( !myServerDir.exists() ) { mCacheDir.mkdir( myServerDirName ); } foreach ( QString version, versions ) { QgsDebugMsg( "server: " + server + " version: " + version ); QgsDataSourceURI myServerUri; myServerUri.setParam( "url", server ); if ( !version.isEmpty() ) { myServerUri.setParam( "version", version ); } QgsWcsCapabilities myCapabilities; myCapabilities.setUri( myServerUri ); if ( !myCapabilities.lastError().isEmpty() ) { QgsDebugMsg( myCapabilities.lastError() ); myServerLog << "error: (version: " + version + ") " + myCapabilities.lastError().replace( "\n", " " ); continue; } QVector<QgsWcsCoverageSummary> myCoverages; if ( !myCapabilities.supportedCoverages( myCoverages ) ) { QgsDebugMsg( "Cannot get list of coverages" ); myServerLog << "error: (version: " + version + ") Cannot get list of coverages"; continue; } int myCoverageCount = 0; int myStep = myCoverages.size() / mMaxCoverages; int myStepCount = -1; foreach ( QgsWcsCoverageSummary myCoverage, myCoverages ) { QgsDebugMsg( "coverage: " + myCoverage.identifier ); // Go in steps to get more success/errors if ( myStepCount == -1 || myStepCount > myStep ) { myStepCount = 0; } else { myStepCount++; continue; } myCoverageCount++; if ( myCoverageCount > mMaxCoverages ) break; QString myPath = myServerDir.absolutePath() + QDir::separator() + myCoverage.identifier; if ( !version.isEmpty() ) { myPath += "-" + version; } QString myLogPath = myPath + ".log"; if ( QFileInfo( myLogPath ).exists() ) { QMap<QString, QString> log = readLog( myLogPath ); if ( !log.value( "identifier" ).isEmpty() && log.value( "error" ).isEmpty() ) continue; } QStringList myLog; myLog << "identifier:" + myCoverage.identifier; myCapabilities.describeCoverage( myCoverage.identifier ); myCoverage = myCapabilities.coverage( myCoverage.identifier ); // get described QgsDataSourceURI myUri = myServerUri; myUri.setParam( "identifier", myCoverage.identifier ); if ( myCoverage.times.size() > 0 ) { myUri.setParam( "time", myCoverage.times.value( 0 ) ); } myLog << "version:" + version; myLog << "uri:" + myUri.encodedUri(); int myWidth = 100; int myHeight = 100; if ( myCoverage.hasSize ) { myHeight = static_cast<int>( qRound( 1.0 * myWidth * myCoverage.height / myCoverage.width ) ); } myLog << QString( "hasSize:%1" ).arg( myCoverage.hasSize ); QgsRasterLayer * myLayer = new QgsRasterLayer( myUri.encodedUri(), myCoverage.identifier, "wcs", true ); if ( myLayer->isValid() ) { int myBandCount = myLayer->dataProvider()->bandCount(); myLog << "bandCount:" + QString::number( myBandCount ); if ( myBandCount > 0 ) { myLog << "srcType:" + QString::number( myLayer->dataProvider()->srcDataType( 1 ) ); QgsRasterBandStats myStats = myLayer->dataProvider()->bandStatistics( 1, QgsRasterBandStats::All, QgsRectangle(), myWidth * myHeight ); myLog << "min:" + QString::number( myStats.minimumValue ); myLog << "max:" + QString::number( myStats.maximumValue ); } QgsMapRenderer myMapRenderer; QList<QgsMapLayer *> myLayersList; myLayersList.append( myLayer ); QgsMapLayerRegistry::instance()->addMapLayers( myLayersList, false ); QMap<QString, QgsMapLayer*> myLayersMap = QgsMapLayerRegistry::instance()->mapLayers(); myMapRenderer.setLayerSet( myLayersMap.keys() ); myMapRenderer.setExtent( myLayer->extent() ); QImage myImage( myWidth, myHeight, QImage::Format_ARGB32_Premultiplied ); myImage.fill( 0 ); myMapRenderer.setOutputSize( QSize( myWidth, myHeight ), myImage.logicalDpiX() ); QPainter myPainter( &myImage ); myMapRenderer.render( &myPainter ); // Save rendered image QString myPngPath = myPath + ".png"; QgsDebugMsg( "myPngPath = " + myPngPath ); myImage.save( myPngPath ); // Verify data QSet<QString> myValues; // cannot be QSet<double> void *myData = myLayer->dataProvider()->readBlock( 1, myLayer->extent(), myWidth, myHeight ); if ( myData ) { int myType = myLayer->dataProvider()->dataType( 1 ); for ( int row = 0; row < myHeight; row++ ) { for ( int col = 0; col < myWidth; col++ ) { double value = myLayer->dataProvider()->readValue( myData, myType, row * myWidth + col ); QString valueStr = QString::number( value ); if ( !myValues.contains( valueStr ) ) myValues.insert( valueStr ); } } free( myData ); } QgsDebugMsg( QString( "%1 values" ).arg( myValues.size() ) ); myLog << QString( "valuesCount:%1" ).arg( myValues.size() ); // Verify image colors QSet<QRgb> myColors; for ( int row = 0; row < myHeight; row++ ) { for ( int col = 0; col < myWidth; col++ ) { QRgb color = myImage.pixel( col, row ); if ( !myColors.contains( color ) ) myColors.insert( color ); } } QgsDebugMsg( QString( "%1 colors" ).arg( myColors.size() ) ); myLog << QString( "colorsCount:%1" ).arg( myColors.size() ); } else { QgsDebugMsg( "Layer is not valid" ); myLog << "error:Layer is not valid"; } QFile myLogFile( myLogPath ); myLogFile.open( QIODevice::WriteOnly | QIODevice::Text ); QTextStream myStream( &myLogFile ); myStream << myLog.join( "\n" ); myLogFile.close(); QgsMapLayerRegistry::instance()->removeAllMapLayers(); }
//when user clicks apply button void QgsProjectProperties::apply() { // Set the map units // Note. Qt 3.2.3 and greater have a function selectedId() that // can be used instead of the two part technique here QGis::UnitType mapUnit; if ( radMeters->isChecked() ) { mapUnit = QGis::Meters; } else if ( radFeet->isChecked() ) { mapUnit = QGis::Feet; } else { mapUnit = QGis::Degrees; } QgsMapRenderer* myRender = mMapCanvas->mapRenderer(); myRender->setMapUnits( mapUnit ); myRender->setProjectionsEnabled( cbxProjectionEnabled->isChecked() ); // Only change the projection if there is a node in the tree // selected that has an srid. This prevents error if the user // selects a top-level node rather than an actual coordinate // system long myCRSID = projectionSelector->selectedCrsId(); if ( myCRSID ) { QgsCoordinateReferenceSystem srs( myCRSID, QgsCoordinateReferenceSystem::InternalCrsId ); myRender->setDestinationSrs( srs ); // write the currently selected projections _proj string_ to project settings QgsDebugMsg( QString( "SpatialRefSys/ProjectCRSProj4String: %1" ).arg( projectionSelector->selectedProj4String() ) ); QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", projectionSelector->selectedProj4String() ); // Set the map units to the projected coordinates if we are projecting if ( isProjected() ) { // If we couldn't get the map units, default to the value in the // projectproperties dialog box (set above) if ( srs.mapUnits() != QGis::UnknownUnit ) myRender->setMapUnits( srs.mapUnits() ); } } // Set the project title QgsProject::instance()->title( title() ); // set the mouse display precision method and the // number of decimal places for the manual option // Note. Qt 3.2.3 and greater have a function selectedId() that // can be used instead of the two part technique here if ( radAutomatic->isChecked() ) QgsProject::instance()->writeEntry( "PositionPrecision", "/Automatic", true ); else QgsProject::instance()->writeEntry( "PositionPrecision", "/Automatic", false ); QgsProject::instance()->writeEntry( "PositionPrecision", "/DecimalPlaces", spinBoxDP->value() ); // Announce that we may have a new display precision setting emit displayPrecisionChanged(); //set the colour for selections QColor myColour = pbnSelectionColour->color(); QgsProject::instance()->writeEntry( "Gui", "/SelectionColorRedPart", myColour.red() ); QgsProject::instance()->writeEntry( "Gui", "/SelectionColorGreenPart", myColour.green() ); QgsProject::instance()->writeEntry( "Gui", "/SelectionColorBluePart", myColour.blue() ); QgsRenderer::setSelectionColor( myColour ); //set the colour for canvas myColour = pbnCanvasColor->color(); QgsProject::instance()->writeEntry( "Gui", "/CanvasColorRedPart", myColour.red() ); QgsProject::instance()->writeEntry( "Gui", "/CanvasColorGreenPart", myColour.green() ); QgsProject::instance()->writeEntry( "Gui", "/CanvasColorBluePart", myColour.blue() ); //write the digitizing settings int topologicalEditingEnabled = ( mEnableTopologicalEditingCheckBox->checkState() == Qt::Checked ) ? 1 : 0; QgsProject::instance()->writeEntry( "Digitizing", "/TopologicalEditing", topologicalEditingEnabled ); int avoidPolygonIntersectionsEnabled = ( mAvoidIntersectionsCheckBox->checkState() == Qt::Checked ) ? 1 : 0; QgsProject::instance()->writeEntry( "Digitizing", "/AvoidPolygonIntersections", avoidPolygonIntersectionsEnabled ); QMap<QString, LayerEntry>::const_iterator layerEntryIt; //store the layer snapping settings as string lists QStringList layerIdList; QStringList snapToList; QStringList toleranceList; QStringList enabledList; for ( layerEntryIt = mSnappingLayerSettings.constBegin(); layerEntryIt != mSnappingLayerSettings.constEnd(); ++layerEntryIt ) { layerIdList << layerEntryIt.key(); toleranceList << QString::number( layerEntryIt->tolerance, 'f' ); if ( layerEntryIt->checked ) { enabledList << "enabled"; } else { enabledList << "disabled"; } if ( layerEntryIt->snapTo == 0 ) { snapToList << "to_vertex"; } else if ( layerEntryIt->snapTo == 1 ) { snapToList << "to_segment"; } else //to vertex and segment { snapToList << "to_vertex_and_segment"; } } if ( mSnappingLayerSettings.size() > 0 ) { QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnappingList", layerIdList ); QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnapToList", snapToList ); QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnappingToleranceList", toleranceList ); QgsProject::instance()->writeEntry( "Digitizing", "/LayerSnappingEnabledList", enabledList ); } //todo XXX set canvas colour emit refresh(); }
QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *parent, Qt::WFlags fl ) : QDialog( parent, fl ), mMapCanvas( mapCanvas ) { setupUi( this ); connect( buttonBox, SIGNAL( accepted() ), this, SLOT( accept() ) ); connect( buttonBox, SIGNAL( rejected() ), this, SLOT( reject() ) ); connect( buttonBox->button( QDialogButtonBox::Apply ), SIGNAL( clicked() ), this, SLOT( apply() ) ); connect( this, SIGNAL( accepted() ), this, SLOT( apply() ) ); connect( projectionSelector, SIGNAL( sridSelected( QString ) ), this, SLOT( setMapUnitsToCurrentProjection() ) ); /////////////////////////////////////////////////////////// // Properties stored in map canvas's QgsMapRenderer // these ones are propagated to QgsProject by a signal QgsMapRenderer* myRender = mMapCanvas->mapRenderer(); QGis::UnitType myUnit = myRender->mapUnits(); setMapUnits( myUnit ); //see if the user wants on the fly projection enabled bool myProjectionEnabled = myRender->hasCrsTransformEnabled(); cbxProjectionEnabled->setChecked( myProjectionEnabled ); btnGrpMapUnits->setEnabled( !myProjectionEnabled ); long myCRSID = myRender->destinationSrs().srsid(); QgsDebugMsg( "Read project CRSID: " + QString::number( myCRSID ) ); projectionSelector->setSelectedCrsId( myCRSID ); /////////////////////////////////////////////////////////// // Properties stored in QgsProject title( QgsProject::instance()->title() ); // get the manner in which the number of decimal places in the mouse // position display is set (manual or automatic) bool automaticPrecision = QgsProject::instance()->readBoolEntry( "PositionPrecision", "/Automatic" ); if ( automaticPrecision ) { radAutomatic->setChecked( true ); spinBoxDP->setDisabled( true ); labelDP->setDisabled( true ); } else { radManual->setChecked( true ); } cbxAbsolutePath->setCurrentIndex( QgsProject::instance()->readBoolEntry( "Paths", "/Absolute", true ) ? 0 : 1 ); int dp = QgsProject::instance()->readNumEntry( "PositionPrecision", "/DecimalPlaces" ); spinBoxDP->setValue( dp ); //get the color selections and set the button color accordingly int myRedInt = QgsProject::instance()->readNumEntry( "Gui", "/SelectionColorRedPart", 255 ); int myGreenInt = QgsProject::instance()->readNumEntry( "Gui", "/SelectionColorGreenPart", 255 ); int myBlueInt = QgsProject::instance()->readNumEntry( "Gui", "/SelectionColorBluePart", 0 ); int myAlphaInt = QgsProject::instance()->readNumEntry( "Gui", "/SelectionColorAlphaPart", 255 ); QColor myColor = QColor( myRedInt, myGreenInt, myBlueInt, myAlphaInt ); pbnSelectionColor->setColor( myColor ); //get the color for map canvas background and set button color accordingly (default white) myRedInt = QgsProject::instance()->readNumEntry( "Gui", "/CanvasColorRedPart", 255 ); myGreenInt = QgsProject::instance()->readNumEntry( "Gui", "/CanvasColorGreenPart", 255 ); myBlueInt = QgsProject::instance()->readNumEntry( "Gui", "/CanvasColorBluePart", 255 ); myColor = QColor( myRedInt, myGreenInt, myBlueInt ); pbnCanvasColor->setColor( myColor ); QgsMapLayer* currentLayer = 0; QStringList noIdentifyLayerIdList = QgsProject::instance()->readListEntry( "Identify", "/disabledLayers" ); const QMap<QString, QgsMapLayer*> &mapLayers = QgsMapLayerRegistry::instance()->mapLayers(); twIdentifyLayers->setColumnCount( 3 ); twIdentifyLayers->horizontalHeader()->setVisible( true ); twIdentifyLayers->setHorizontalHeaderItem( 0, new QTableWidgetItem( tr( "Layer" ) ) ); twIdentifyLayers->setHorizontalHeaderItem( 1, new QTableWidgetItem( tr( "Type" ) ) ); twIdentifyLayers->setHorizontalHeaderItem( 2, new QTableWidgetItem( tr( "Identifiable" ) ) ); twIdentifyLayers->setRowCount( mapLayers.size() ); twIdentifyLayers->verticalHeader()->setResizeMode( QHeaderView::ResizeToContents ); int i = 0; for ( QMap<QString, QgsMapLayer*>::const_iterator it = mapLayers.constBegin(); it != mapLayers.constEnd(); it++, i++ ) { currentLayer = it.value(); QTableWidgetItem *twi = new QTableWidgetItem( QString::number( i ) ); twIdentifyLayers->setVerticalHeaderItem( i, twi ); twi = new QTableWidgetItem( currentLayer->name() ); twi->setData( Qt::UserRole, it.key() ); twi->setFlags( twi->flags() & ~Qt::ItemIsEditable ); twIdentifyLayers->setItem( i, 0, twi ); QString type; if ( currentLayer->type() == QgsMapLayer::VectorLayer ) { type = tr( "Vector" ); } else if ( currentLayer->type() == QgsMapLayer::RasterLayer ) { QgsRasterLayer *rl = qobject_cast<QgsRasterLayer *>( currentLayer ); if ( rl && rl->providerKey() == "wms" ) { type = tr( "WMS" ); } else { type = tr( "Raster" ); } } twi = new QTableWidgetItem( type ); twi->setFlags( twi->flags() & ~Qt::ItemIsEditable ); twIdentifyLayers->setItem( i, 1, twi ); QCheckBox *cb = new QCheckBox(); cb->setChecked( !noIdentifyLayerIdList.contains( currentLayer->getLayerID() ) ); twIdentifyLayers->setCellWidget( i, 2, cb ); } restoreState(); }
//when user clicks apply button void QgsProjectProperties::apply() { // Set the map units // Note. Qt 3.2.3 and greater have a function selectedId() that // can be used instead of the two part technique here QGis::UnitType mapUnit; if ( radMeters->isChecked() ) { mapUnit = QGis::Meters; } else if ( radFeet->isChecked() ) { mapUnit = QGis::Feet; } else if ( radDMS->isChecked() ) { mapUnit = QGis::DegreesMinutesSeconds; } else { mapUnit = QGis::Degrees; } QgsMapRenderer* myRender = mMapCanvas->mapRenderer(); myRender->setMapUnits( mapUnit ); myRender->setProjectionsEnabled( cbxProjectionEnabled->isChecked() ); // Only change the projection if there is a node in the tree // selected that has an srid. This prevents error if the user // selects a top-level node rather than an actual coordinate // system long myCRSID = projectionSelector->selectedCrsId(); if ( myCRSID ) { QgsCoordinateReferenceSystem srs( myCRSID, QgsCoordinateReferenceSystem::InternalCrsId ); myRender->setDestinationSrs( srs ); QgsDebugMsg( QString( "Selected CRS " ) + srs.description() ); // write the currently selected projections _proj string_ to project settings QgsDebugMsg( QString( "SpatialRefSys/ProjectCRSProj4String: %1" ).arg( projectionSelector->selectedProj4String() ) ); QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", projectionSelector->selectedProj4String() ); // Set the map units to the projected coordinates if we are projecting if ( isProjected() ) { // If we couldn't get the map units, default to the value in the // projectproperties dialog box (set above) if ( srs.mapUnits() != QGis::UnknownUnit ) myRender->setMapUnits( srs.mapUnits() ); } } // Set the project title QgsProject::instance()->title( title() ); // set the mouse display precision method and the // number of decimal places for the manual option // Note. Qt 3.2.3 and greater have a function selectedId() that // can be used instead of the two part technique here QgsProject::instance()->writeEntry( "PositionPrecision", "/Automatic", radAutomatic->isChecked() ); QgsProject::instance()->writeEntry( "PositionPrecision", "/DecimalPlaces", spinBoxDP->value() ); // Announce that we may have a new display precision setting emit displayPrecisionChanged(); QgsProject::instance()->writeEntry( "Paths", "/Absolute", cbxAbsolutePath->currentIndex() == 0 ); //set the color for selections QColor myColor = pbnSelectionColor->color(); QgsProject::instance()->writeEntry( "Gui", "/SelectionColorRedPart", myColor.red() ); QgsProject::instance()->writeEntry( "Gui", "/SelectionColorGreenPart", myColor.green() ); QgsProject::instance()->writeEntry( "Gui", "/SelectionColorBluePart", myColor.blue() ); QgsProject::instance()->writeEntry( "Gui", "/SelectionColorAlphaPart", myColor.alpha() ); QgsRenderer::setSelectionColor( myColor ); //set the color for canvas myColor = pbnCanvasColor->color(); QgsProject::instance()->writeEntry( "Gui", "/CanvasColorRedPart", myColor.red() ); QgsProject::instance()->writeEntry( "Gui", "/CanvasColorGreenPart", myColor.green() ); QgsProject::instance()->writeEntry( "Gui", "/CanvasColorBluePart", myColor.blue() ); QStringList noIdentifyLayerList; for ( int i = 0; i < twIdentifyLayers->rowCount(); i++ ) { QCheckBox *cb = qobject_cast<QCheckBox *>( twIdentifyLayers->cellWidget( i, 2 ) ); if ( cb && !cb->isChecked() ) { QString id = twIdentifyLayers->item( i, 0 )->data( Qt::UserRole ).toString(); noIdentifyLayerList << id; } } QgsProject::instance()->writeEntry( "Identify", "/disabledLayers", noIdentifyLayerList ); //todo XXX set canvas color emit refresh(); }
void QgsRubberBand::addGeometry( QgsGeometry* geom, QgsVectorLayer* layer ) { if ( !geom ) { return; } //maprender object of canvas QgsMapRenderer* mr = mMapCanvas->mapRenderer(); if ( !mr ) { return; } int idx = mPoints.size(); switch ( geom->wkbType() ) { case QGis::WKBPoint: case QGis::WKBPoint25D: { QgsPoint pt; if ( layer ) { pt = mr->layerToMapCoordinates( layer, geom->asPoint() ); } else { pt = geom->asPoint(); } addPoint( pt, false, idx ); } break; case QGis::WKBMultiPoint: case QGis::WKBMultiPoint25D: { QgsMultiPoint mpt = geom->asMultiPoint(); for ( int i = 0; i < mpt.size(); ++i, ++idx ) { QgsPoint pt = mpt[i]; if ( layer ) { addPoint( mr->layerToMapCoordinates( layer, pt ), false, idx ); } else { addPoint( pt, false, idx ); } } } break; case QGis::WKBLineString: case QGis::WKBLineString25D: { QgsPolyline line = geom->asPolyline(); for ( int i = 0; i < line.count(); i++ ) { if ( layer ) { addPoint( mr->layerToMapCoordinates( layer, line[i] ), false, idx ); } else { addPoint( line[i], false, idx ); } } } break; case QGis::WKBMultiLineString: case QGis::WKBMultiLineString25D: { mPoints.clear(); QgsMultiPolyline mline = geom->asMultiPolyline(); for ( int i = 0; i < mline.size(); ++i, ++idx ) { QgsPolyline line = mline[i]; if ( line.size() == 0 ) { --idx; } for ( int j = 0; j < line.size(); ++j ) { if ( layer ) { addPoint( mr->layerToMapCoordinates( layer, line[j] ), false, idx ); } else { addPoint( line[j], false, idx ); } } } } break; case QGis::WKBPolygon: case QGis::WKBPolygon25D: { QgsPolygon poly = geom->asPolygon(); QgsPolyline line = poly[0]; for ( int i = 0; i < line.count(); i++ ) { if ( layer ) { addPoint( mr->layerToMapCoordinates( layer, line[i] ), false, idx ); } else { addPoint( line[i], false, idx ); } } } break; case QGis::WKBMultiPolygon: case QGis::WKBMultiPolygon25D: { mPoints.clear(); QgsMultiPolygon multipoly = geom->asMultiPolygon(); for ( int i = 0; i < multipoly.size(); ++i, ++idx ) { QgsPolygon poly = multipoly[i]; QgsPolyline line = poly[0]; for ( int j = 0; j < line.count(); ++j ) { if ( layer ) { addPoint( mr->layerToMapCoordinates( layer, line[j] ), false, idx ); } else { addPoint( line[j], false, idx ); } } } } break; case QGis::WKBUnknown: default: return; } updateRect(); update(); }
QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *parent, Qt::WFlags fl ) : QDialog( parent, fl ), mMapCanvas( mapCanvas ) { setupUi( this ); connect( buttonBox, SIGNAL( accepted() ), this, SLOT( accept() ) ); connect( buttonBox, SIGNAL( rejected() ), this, SLOT( reject() ) ); connect( buttonBox->button( QDialogButtonBox::Apply ), SIGNAL( clicked() ), this, SLOT( apply() ) ); connect( this, SIGNAL( accepted() ), this, SLOT( apply() ) ); /////////////////////////////////////////////////////////// // Properties stored in map canvas's QgsMapRenderer // these ones are propagated to QgsProject by a signal QgsMapRenderer* myRender = mMapCanvas->mapRenderer(); QGis::UnitType myUnit = myRender->mapUnits(); setMapUnits( myUnit ); //see if the user wants on the fly projection enabled bool myProjectionEnabled = myRender->hasCrsTransformEnabled(); cbxProjectionEnabled->setChecked( myProjectionEnabled ); long myCRSID = myRender->destinationSrs().srsid(); QgsDebugMsg( "Read project CRSID: " + QString::number( myCRSID ) ); projectionSelector->setSelectedCrsId( myCRSID ); /////////////////////////////////////////////////////////// // Properties stored in QgsProject title( QgsProject::instance()->title() ); // get the manner in which the number of decimal places in the mouse // position display is set (manual or automatic) bool automaticPrecision = QgsProject::instance()->readBoolEntry( "PositionPrecision", "/Automatic" ); if ( automaticPrecision ) { radAutomatic->setChecked( true ); } else { radManual->setChecked( true ); } int dp = QgsProject::instance()->readNumEntry( "PositionPrecision", "/DecimalPlaces" ); spinBoxDP->setValue( dp ); //get the colour selections and set the button colour accordingly int myRedInt = QgsProject::instance()->readNumEntry( "Gui", "/SelectionColorRedPart", 255 ); int myGreenInt = QgsProject::instance()->readNumEntry( "Gui", "/SelectionColorGreenPart", 255 ); int myBlueInt = QgsProject::instance()->readNumEntry( "Gui", "/SelectionColorBluePart", 0 ); QColor myColour = QColor( myRedInt, myGreenInt, myBlueInt ); pbnSelectionColour->setColor( myColour ); //get the colour for map canvas background and set button colour accordingly (default white) myRedInt = QgsProject::instance()->readNumEntry( "Gui", "/CanvasColorRedPart", 255 ); myGreenInt = QgsProject::instance()->readNumEntry( "Gui", "/CanvasColorGreenPart", 255 ); myBlueInt = QgsProject::instance()->readNumEntry( "Gui", "/CanvasColorBluePart", 255 ); myColour = QColor( myRedInt, myGreenInt, myBlueInt ); pbnCanvasColor->setColor( myColour ); //read the digitizing settings int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 ); if ( topologicalEditing != 0 ) { mEnableTopologicalEditingCheckBox->setCheckState( Qt::Checked ); } else { mEnableTopologicalEditingCheckBox->setCheckState( Qt::Unchecked ); } int avoidPolygonIntersections = QgsProject::instance()->readNumEntry( "Digitizing", "/AvoidPolygonIntersections", 0 ); if ( avoidPolygonIntersections != 0 ) { mAvoidIntersectionsCheckBox->setCheckState( Qt::Checked ); } else { mAvoidIntersectionsCheckBox->setCheckState( Qt::Unchecked ); } bool ok; QStringList layerIdList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingList", &ok ); QStringList enabledList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingEnabledList", &ok ); QStringList toleranceList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingToleranceList", &ok ); QStringList snapToList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnapToList", &ok ); QStringList::const_iterator idIter = layerIdList.constBegin(); QStringList::const_iterator enabledIter = enabledList.constBegin(); QStringList::const_iterator tolIter = toleranceList.constBegin(); QStringList::const_iterator snapToIter = snapToList.constBegin(); QgsMapLayer* currentLayer = 0; //create the new layer entries for ( ; idIter != layerIdList.constEnd(); ++idIter, ++enabledIter, ++tolIter, ++snapToIter ) { currentLayer = QgsMapLayerRegistry::instance()->mapLayer( *idIter ); if ( currentLayer ) { LayerEntry newEntry; newEntry.layerName = currentLayer->name(); if (( *enabledIter ) == "enabled" ) { newEntry.checked = true; } else { newEntry.checked = false; } if (( *snapToIter ) == "to_vertex" ) { newEntry.snapTo = 0; } else if (( *snapToIter ) == "to_segment" ) { newEntry.snapTo = 1; } else //to vertex and segment { newEntry.snapTo = 2; } newEntry.tolerance = tolIter->toDouble(); mSnappingLayerSettings.insert( *idIter, newEntry ); } } }
int main( int argc, char * argv[] ) { #ifndef _MSC_VER qInstallMsgHandler( dummyMessageHandler ); #endif QgsApplication qgsapp( argc, argv, getenv( "DISPLAY" ) ); //Default prefix path may be altered by environment variable char* prefixPath = getenv( "QGIS_PREFIX_PATH" ); if ( prefixPath ) { QgsApplication::setPrefixPath( prefixPath, TRUE ); } #if !defined(Q_OS_WIN) else { // init QGIS's paths - true means that all path will be inited from prefix QgsApplication::setPrefixPath( CMAKE_INSTALL_PREFIX, TRUE ); } #endif QDomImplementation::setInvalidDataPolicy( QDomImplementation::DropInvalidChars ); // Instantiate the plugin directory so that providers are loaded QgsProviderRegistry::instance( QgsApplication::pluginPath() ); QgsDebugMsg( "Prefix PATH: " + QgsApplication::prefixPath() ); QgsDebugMsg( "Plugin PATH: " + QgsApplication::pluginPath() ); QgsDebugMsg( "PkgData PATH: " + QgsApplication::pkgDataPath() ); QgsDebugMsg( "User DB PATH: " + QgsApplication::qgisUserDbFilePath() ); QgsDebugMsg( qgsapp.applicationDirPath() + "/qgis_wms_server.log" ); //create config cache and search for config files in the current directory. //These configurations are used if no mapfile parameter is present in the request QString defaultConfigFilePath; QFileInfo projectFileInfo = defaultProjectFile(); //try to find a .qgs file in the server directory if ( projectFileInfo.exists() ) { defaultConfigFilePath = projectFileInfo.absoluteFilePath(); } else { QFileInfo adminSLDFileInfo = defaultAdminSLD(); if ( adminSLDFileInfo.exists() ) { defaultConfigFilePath = adminSLDFileInfo.absoluteFilePath(); } } //create cache for capabilities XML QgsCapabilitiesCache capabilitiesCache; //creating QgsMapRenderer is expensive (access to srs.db), so we do it here before the fcgi loop QgsMapRenderer* theMapRenderer = new QgsMapRenderer(); theMapRenderer->setLabelingEngine( new QgsPalLabeling() ); while ( fcgi_accept() >= 0 ) { printRequestInfos(); //print request infos if in debug mode //use QgsGetRequestHandler in case of HTTP GET and QgsSOAPRequestHandler in case of HTTP POST QgsRequestHandler* theRequestHandler = 0; char* requestMethod = getenv( "REQUEST_METHOD" ); if ( requestMethod != NULL ) { if ( strcmp( requestMethod, "POST" ) == 0 ) { //QgsDebugMsg( "Creating QgsSOAPRequestHandler" ); //theRequestHandler = new QgsSOAPRequestHandler(); theRequestHandler = new QgsPostRequestHandler(); } else { QgsDebugMsg( "Creating QgsGetRequestHandler" ); theRequestHandler = new QgsGetRequestHandler(); } } else { QgsDebugMsg( "Creating QgsGetRequestHandler" ); theRequestHandler = new QgsGetRequestHandler(); } QMap<QString, QString> parameterMap; try { parameterMap = theRequestHandler->parseInput(); } catch ( QgsMapServiceException& e ) { QgsDebugMsg( "An exception was thrown during input parsing" ); theRequestHandler->sendServiceException( e ); continue; } QMap<QString, QString>::const_iterator paramIt; //set admin config file to wms server object QString configFilePath( defaultConfigFilePath ); paramIt = parameterMap.find( "MAP" ); if ( paramIt == parameterMap.constEnd() ) { QgsDebugMsg( QString( "Using default configuration file path: %1" ).arg( defaultConfigFilePath ) ); } else { configFilePath = paramIt.value(); } QgsConfigParser* adminConfigParser = QgsConfigCache::instance()->searchConfiguration( configFilePath ); if ( !adminConfigParser ) { QgsDebugMsg( "parse error on config file " + configFilePath ); theRequestHandler->sendServiceException( QgsMapServiceException( "", "Configuration file problem : perhaps you left off the .qgs extension?" ) ); continue; } //sld parser might need information about request parameters adminConfigParser->setParameterMap( parameterMap ); //request to WMS? QString serviceString; paramIt = parameterMap.find( "SERVICE" ); if ( paramIt == parameterMap.constEnd() ) { #ifndef QGISDEBUG serviceString = parameterMap.value( "SERVICE", "WMS" ); #else QgsDebugMsg( "unable to find 'SERVICE' parameter, exiting..." ); theRequestHandler->sendServiceException( QgsMapServiceException( "ServiceNotSpecified", "Service not specified. The SERVICE parameter is mandatory" ) ); delete theRequestHandler; continue; #endif } else { serviceString = paramIt.value(); } QgsWMSServer* theServer = 0; if ( serviceString == "WFS" ) { delete theServer; QgsWFSServer* theServer = 0; try { theServer = new QgsWFSServer( parameterMap ); } catch ( QgsMapServiceException e ) //admin.sld may be invalid { theRequestHandler->sendServiceException( e ); continue; } theServer->setAdminConfigParser( adminConfigParser ); //request type QString request = parameterMap.value( "REQUEST" ); if ( request.isEmpty() ) { //do some error handling QgsDebugMsg( "unable to find 'REQUEST' parameter, exiting..." ); theRequestHandler->sendServiceException( QgsMapServiceException( "OperationNotSupported", "Please check the value of the REQUEST parameter" ) ); delete theRequestHandler; delete theServer; continue; } if ( request.toLower() == QString( "GetCapabilities" ).toLower() ) { QDomDocument capabilitiesDocument; try { capabilitiesDocument = theServer->getCapabilities(); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } QgsDebugMsg( "sending GetCapabilities response" ); theRequestHandler->sendGetCapabilitiesResponse( capabilitiesDocument ); delete theRequestHandler; delete theServer; continue; } else if ( request.toLower() == QString( "DescribeFeatureType" ).toLower() ) { QDomDocument describeDocument; try { describeDocument = theServer->describeFeatureType(); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } QgsDebugMsg( "sending GetCapabilities response" ); theRequestHandler->sendGetCapabilitiesResponse( describeDocument ); delete theRequestHandler; delete theServer; continue; } else if ( request.toLower() == QString( "GetFeature" ).toLower() ) { //output format for GetFeature QString outputFormat = parameterMap.value( "OUTPUTFORMAT" ); try { if ( theServer->getFeature( *theRequestHandler, outputFormat ) != 0 ) { delete theRequestHandler; delete theServer; continue; } else { delete theRequestHandler; delete theServer; continue; } } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } } else if ( request.toLower() == QString( "Transaction" ).toLower() ) { QDomDocument transactionDocument; try { transactionDocument = theServer->transaction( parameterMap.value( "REQUEST_BODY" ) ); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } QgsDebugMsg( "sending Transaction response" ); theRequestHandler->sendGetCapabilitiesResponse( transactionDocument ); delete theRequestHandler; delete theServer; continue; } return 0; } try { theServer = new QgsWMSServer( parameterMap, theMapRenderer ); } catch ( QgsMapServiceException e ) //admin.sld may be invalid { theRequestHandler->sendServiceException( e ); continue; } theServer->setAdminConfigParser( adminConfigParser ); //request type QString request = parameterMap.value( "REQUEST" ); if ( request.isEmpty() ) { //do some error handling QgsDebugMsg( "unable to find 'REQUEST' parameter, exiting..." ); theRequestHandler->sendServiceException( QgsMapServiceException( "OperationNotSupported", "Please check the value of the REQUEST parameter" ) ); delete theRequestHandler; delete theServer; continue; } QString version = parameterMap.value( "VERSION", "1.3.0" ); bool getProjectSettings = ( request.toLower() == QString( "GetProjectSettings" ).toLower() ); if ( getProjectSettings ) { version = "1.3.0"; //getProjectSettings extends WMS 1.3.0 capabilities } if ( request.toLower() == QString( "GetCapabilities" ).toLower() || getProjectSettings ) { const QDomDocument* capabilitiesDocument = capabilitiesCache.searchCapabilitiesDocument( configFilePath, getProjectSettings ? "projectSettings" : version ); if ( !capabilitiesDocument ) //capabilities xml not in cache. Create a new one { QgsDebugMsg( "Capabilities document not found in cache" ); QDomDocument doc; try { doc = theServer->getCapabilities( version, getProjectSettings ); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } capabilitiesCache.insertCapabilitiesDocument( configFilePath, getProjectSettings ? "projectSettings" : version, &doc ); capabilitiesDocument = capabilitiesCache.searchCapabilitiesDocument( configFilePath, getProjectSettings ? "projectSettings" : version ); } else { QgsDebugMsg( "Found capabilities document in cache" ); } if ( capabilitiesDocument ) { theRequestHandler->sendGetCapabilitiesResponse( *capabilitiesDocument ); } delete theRequestHandler; delete theServer; continue; } else if ( request.toLower() == QString( "GetMap" ).toLower() ) { QImage* result = 0; try { result = theServer->getMap(); } catch ( QgsMapServiceException& ex ) { QgsDebugMsg( "Caught exception during GetMap request" ); theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } if ( result ) { QgsDebugMsg( "Sending GetMap response" ); theRequestHandler->sendGetMapResponse( serviceString, result ); QgsDebugMsg( "Response sent" ); } else { //do some error handling QgsDebugMsg( "result image is 0" ); } delete result; delete theRequestHandler; delete theServer; continue; } else if ( request.toLower() == QString( "GetFeatureInfo" ).toLower() ) { QDomDocument featureInfoDoc; try { if ( theServer->getFeatureInfo( featureInfoDoc, version ) != 0 ) { delete theRequestHandler; delete theServer; continue; } } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); delete theRequestHandler; delete theServer; continue; } QString infoFormat = parameterMap.value( "INFO_FORMAT" ); theRequestHandler->sendGetFeatureInfoResponse( featureInfoDoc, infoFormat ); delete theRequestHandler; delete theServer; continue; } else if ( request.toLower() == QString( "GetStyles" ).toLower() || request.toLower() == QString( "GetStyle" ).toLower() ) // GetStyle for compatibility with earlier QGIS versions { try { QDomDocument doc = theServer->getStyle(); theRequestHandler->sendGetStyleResponse( doc ); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); } delete theRequestHandler; delete theServer; continue; } else if ( request.toLower() == QString( "GetLegendGraphic" ).toLower() || request.toLower() == QString( "GetLegendGraphics" ).toLower() ) // GetLegendGraphics for compatibility with earlier QGIS versions { QImage* result = 0; try { result = theServer->getLegendGraphics(); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); } if ( result ) { QgsDebugMsg( "Sending GetLegendGraphic response" ); //sending is the same for GetMap and GetLegendGraphic theRequestHandler->sendGetMapResponse( serviceString, result ); } else { //do some error handling QgsDebugMsg( "result image is 0" ); } delete result; delete theRequestHandler; delete theServer; continue; } else if ( request.toLower() == QString( "GetPrint" ).toLower() ) { QByteArray* printOutput = 0; try { printOutput = theServer->getPrint( theRequestHandler->format() ); } catch ( QgsMapServiceException& ex ) { theRequestHandler->sendServiceException( ex ); } if ( printOutput ) { theRequestHandler->sendGetPrintResponse( printOutput ); } delete printOutput; delete theRequestHandler; delete theServer; continue; } else//unknown request { QgsMapServiceException e( "OperationNotSupported", "Operation " + request + " not supported" ); theRequestHandler->sendServiceException( e ); delete theRequestHandler; delete theServer; } } delete theMapRenderer; QgsDebugMsg( "************* all done ***************" ); return 0; }
int main( int argc, char * argv[] ) { #ifndef _MSC_VER qInstallMsgHandler( dummyMessageHandler ); #endif QgsApplication qgsapp( argc, argv, getenv( "DISPLAY" ) ); //Default prefix path may be altered by environment variable QgsApplication::init(); #if !defined(Q_OS_WIN) // init QGIS's paths - true means that all path will be inited from prefix QgsApplication::setPrefixPath( CMAKE_INSTALL_PREFIX, TRUE ); #endif #if defined(MAPSERVER_SKIP_ECW) QgsDebugMsg( "Skipping GDAL ECW drivers in server." ); QgsApplication::skipGdalDriver( "ECW" ); QgsApplication::skipGdalDriver( "JP2ECW" ); #endif setupNetworkAccessManager(); QDomImplementation::setInvalidDataPolicy( QDomImplementation::DropInvalidChars ); // Instantiate the plugin directory so that providers are loaded QgsProviderRegistry::instance( QgsApplication::pluginPath() ); QgsDebugMsg( "Prefix PATH: " + QgsApplication::prefixPath() ); QgsDebugMsg( "Plugin PATH: " + QgsApplication::pluginPath() ); QgsDebugMsg( "PkgData PATH: " + QgsApplication::pkgDataPath() ); QgsDebugMsg( "User DB PATH: " + QgsApplication::qgisUserDbFilePath() ); QgsDebugMsg( qgsapp.applicationDirPath() + "/qgis_wms_server.log" ); QgsApplication::createDB(); //init qgis.db (e.g. necessary for user crs) QString defaultConfigFilePath; QFileInfo projectFileInfo = defaultProjectFile(); //try to find a .qgs file in the server directory if ( projectFileInfo.exists() ) { defaultConfigFilePath = projectFileInfo.absoluteFilePath(); QgsDebugMsg( "Using default project file: " + defaultConfigFilePath ); } else { QFileInfo adminSLDFileInfo = defaultAdminSLD(); if ( adminSLDFileInfo.exists() ) { defaultConfigFilePath = adminSLDFileInfo.absoluteFilePath(); } } //create cache for capabilities XML QgsCapabilitiesCache capabilitiesCache; //creating QgsMapRenderer is expensive (access to srs.db), so we do it here before the fcgi loop QgsMapRenderer* theMapRenderer = new QgsMapRenderer(); theMapRenderer->setLabelingEngine( new QgsPalLabeling() ); printRequestInfos(); #ifdef QGSMSDEBUG QgsFontUtils::loadStandardTestFonts( QStringList() << "Roman" << "Bold" ); #endif while ( fcgi_accept() >= 0 ) { printRequestInfos(); //print request infos if in debug mode //Request handler QgsRequestHandler* theRequestHandler = createRequestHandler(); QMap<QString, QString> parameterMap; try { parameterMap = theRequestHandler->parseInput(); } catch ( QgsMapServiceException& e ) { QgsDebugMsg( "An exception was thrown during input parsing" ); theRequestHandler->sendServiceException( e ); continue; } QMap<QString, QString>::const_iterator paramIt; //Config file path QString configFilePath = configPath( defaultConfigFilePath, parameterMap ); //Service parameter QString serviceString; paramIt = parameterMap.find( "SERVICE" ); if ( paramIt == parameterMap.constEnd() ) { theRequestHandler->sendServiceException( QgsMapServiceException( "ServiceNotSpecified", "Service not specified. The SERVICE parameter is mandatory" ) ); delete theRequestHandler; continue; } else { serviceString = paramIt.value(); } if ( serviceString == "WCS" ) { QgsWCSProjectParser* p = QgsConfigCache::instance()->wcsConfiguration( configFilePath ); if ( !p ) { //error handling } QgsWCSServer wcsServer( configFilePath, parameterMap, p, theRequestHandler ); wcsServer.executeRequest(); } else if ( serviceString == "WFS" ) { QgsWFSProjectParser* p = QgsConfigCache::instance()->wfsConfiguration( configFilePath ); if ( !p ) { //error handling } QgsWFSServer wfsServer( configFilePath, parameterMap, p, theRequestHandler ); wfsServer.executeRequest(); } else //WMS else { QgsWMSConfigParser* p = QgsConfigCache::instance()->wmsConfiguration( configFilePath, parameterMap ); if ( !p ) { //error handling } //adminConfigParser->loadLabelSettings( theMapRenderer->labelingEngine() ); QgsWMSServer wmsServer( configFilePath, parameterMap, p, theRequestHandler, theMapRenderer, &capabilitiesCache ); wmsServer.executeRequest(); } } delete theMapRenderer; return 0; }