|
17 | 17 |
|
18 | 18 | #include "qgswfsprojectparser.h"
|
19 | 19 | #include "qgsconfigparserutils.h"
|
| 20 | +#include "qgsmaplayerregistry.h" |
20 | 21 | #include "qgsvectordataprovider.h"
|
21 | 22 |
|
22 | 23 | QgsWFSProjectParser::QgsWFSProjectParser( QDomDocument* xmlDoc, const QString& filePath ):
|
@@ -392,3 +393,205 @@ QStringList QgsWFSProjectParser::wfstDeleteLayers() const
|
392 | 393 | }
|
393 | 394 | return wfsList;
|
394 | 395 | }
|
| 396 | + |
| 397 | +void QgsWFSProjectParser::describeFeatureType( const QString& aTypeName, QDomElement& parentElement, QDomDocument& doc ) const |
| 398 | +{ |
| 399 | + const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements(); |
| 400 | + if ( projectLayerElements.size() < 1 ) |
| 401 | + { |
| 402 | + return; |
| 403 | + } |
| 404 | + |
| 405 | + QStringList wfsLayersId = mProjectParser.wfsLayers(); |
| 406 | + QStringList typeNameList; |
| 407 | + if ( aTypeName != "" ) |
| 408 | + { |
| 409 | + QStringList typeNameSplit = aTypeName.split( "," ); |
| 410 | + foreach ( const QString &str, typeNameSplit ) |
| 411 | + { |
| 412 | + if ( str.contains( ":" ) ) |
| 413 | + typeNameList << str.section( ":", 1, 1 ); |
| 414 | + else |
| 415 | + typeNameList << str; |
| 416 | + } |
| 417 | + } |
| 418 | + |
| 419 | + foreach ( const QDomElement &elem, projectLayerElements ) |
| 420 | + { |
| 421 | + QString type = elem.attribute( "type" ); |
| 422 | + if ( type == "vector" ) |
| 423 | + { |
| 424 | + //addJoinLayersForElement( elem ); //todo: fixme |
| 425 | + QgsMapLayer *mLayer = mProjectParser.createLayerFromElement( elem ); |
| 426 | + QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( mLayer ); |
| 427 | + if ( !layer ) |
| 428 | + continue; |
| 429 | + |
| 430 | + QString typeName = layer->name(); |
| 431 | + typeName = typeName.replace( " ", "_" ); |
| 432 | + |
| 433 | + if ( wfsLayersId.contains( layer->id() ) && ( aTypeName == "" || typeNameList.contains( typeName ) ) ) |
| 434 | + { |
| 435 | + //do a select with searchRect and go through all the features |
| 436 | + QgsVectorDataProvider* provider = layer->dataProvider(); |
| 437 | + if ( !provider ) |
| 438 | + { |
| 439 | + continue; |
| 440 | + } |
| 441 | + |
| 442 | + //hidden attributes for this layer |
| 443 | + const QSet<QString>& layerExcludedAttributes = layer->excludeAttributesWFS(); |
| 444 | + |
| 445 | + //xsd:element |
| 446 | + QDomElement elementElem = doc.createElement( "element"/*xsd:element*/ ); |
| 447 | + elementElem.setAttribute( "name", typeName ); |
| 448 | + elementElem.setAttribute( "type", "qgs:" + typeName + "Type" ); |
| 449 | + elementElem.setAttribute( "substitutionGroup", "gml:_Feature" ); |
| 450 | + parentElement.appendChild( elementElem ); |
| 451 | + |
| 452 | + //xsd:complexType |
| 453 | + QDomElement complexTypeElem = doc.createElement( "complexType"/*xsd:complexType*/ ); |
| 454 | + complexTypeElem.setAttribute( "name", typeName + "Type" ); |
| 455 | + parentElement.appendChild( complexTypeElem ); |
| 456 | + |
| 457 | + //xsd:complexType |
| 458 | + QDomElement complexContentElem = doc.createElement( "complexContent"/*xsd:complexContent*/ ); |
| 459 | + complexTypeElem.appendChild( complexContentElem ); |
| 460 | + |
| 461 | + //xsd:extension |
| 462 | + QDomElement extensionElem = doc.createElement( "extension"/*xsd:extension*/ ); |
| 463 | + extensionElem.setAttribute( "base", "gml:AbstractFeatureType" ); |
| 464 | + complexContentElem.appendChild( extensionElem ); |
| 465 | + |
| 466 | + //xsd:sequence |
| 467 | + QDomElement sequenceElem = doc.createElement( "sequence"/*xsd:sequence*/ ); |
| 468 | + extensionElem.appendChild( sequenceElem ); |
| 469 | + |
| 470 | + //xsd:element |
| 471 | + QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ ); |
| 472 | + geomElem.setAttribute( "name", "geometry" ); |
| 473 | + QGis::WkbType wkbType = layer->wkbType(); |
| 474 | + if ( wkbType != QGis::WKBNoGeometry ) |
| 475 | + { |
| 476 | + switch ( wkbType ) |
| 477 | + { |
| 478 | + case QGis::WKBPoint25D: |
| 479 | + case QGis::WKBPoint: |
| 480 | + geomElem.setAttribute( "type", "gml:PointPropertyType" ); |
| 481 | + break; |
| 482 | + case QGis::WKBLineString25D: |
| 483 | + case QGis::WKBLineString: |
| 484 | + geomElem.setAttribute( "type", "gml:LineStringPropertyType" ); |
| 485 | + break; |
| 486 | + case QGis::WKBPolygon25D: |
| 487 | + case QGis::WKBPolygon: |
| 488 | + geomElem.setAttribute( "type", "gml:PolygonPropertyType" ); |
| 489 | + break; |
| 490 | + case QGis::WKBMultiPoint25D: |
| 491 | + case QGis::WKBMultiPoint: |
| 492 | + geomElem.setAttribute( "type", "gml:MultiPointPropertyType" ); |
| 493 | + break; |
| 494 | + case QGis::WKBMultiLineString25D: |
| 495 | + case QGis::WKBMultiLineString: |
| 496 | + geomElem.setAttribute( "type", "gml:MultiLineStringPropertyType" ); |
| 497 | + break; |
| 498 | + case QGis::WKBMultiPolygon25D: |
| 499 | + case QGis::WKBMultiPolygon: |
| 500 | + geomElem.setAttribute( "type", "gml:MultiPolygonPropertyType" ); |
| 501 | + break; |
| 502 | + default: |
| 503 | + geomElem.setAttribute( "type", "gml:GeometryPropertyType" ); |
| 504 | + break; |
| 505 | + } |
| 506 | + geomElem.setAttribute( "minOccurs", "0" ); |
| 507 | + geomElem.setAttribute( "maxOccurs", "1" ); |
| 508 | + sequenceElem.appendChild( geomElem ); |
| 509 | + } |
| 510 | + |
| 511 | + //const QgsFields& fields = provider->fields(); |
| 512 | + const QgsFields& fields = layer->pendingFields(); |
| 513 | + for ( int idx = 0; idx < fields.count(); ++idx ) |
| 514 | + { |
| 515 | + |
| 516 | + QString attributeName = fields[idx].name(); |
| 517 | + //skip attribute if excluded from WFS publication |
| 518 | + if ( layerExcludedAttributes.contains( attributeName ) ) |
| 519 | + { |
| 520 | + continue; |
| 521 | + } |
| 522 | + |
| 523 | + //xsd:element |
| 524 | + QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ ); |
| 525 | + geomElem.setAttribute( "name", attributeName ); |
| 526 | + QVariant::Type attributeType = fields[idx].type(); |
| 527 | + if ( attributeType == QVariant::Int ) |
| 528 | + geomElem.setAttribute( "type", "integer" ); |
| 529 | + else if ( attributeType == QVariant::Double ) |
| 530 | + geomElem.setAttribute( "type", "double" ); |
| 531 | + else |
| 532 | + geomElem.setAttribute( "type", "string" ); |
| 533 | + |
| 534 | + sequenceElem.appendChild( geomElem ); |
| 535 | + |
| 536 | + QString alias = layer->attributeAlias( idx ); |
| 537 | + if ( !alias.isEmpty() ) |
| 538 | + { |
| 539 | + geomElem.setAttribute( "alias", alias ); |
| 540 | + } |
| 541 | + } |
| 542 | + } |
| 543 | + } |
| 544 | + } |
| 545 | + QgsMapLayerRegistry::instance()->removeAllMapLayers(); |
| 546 | + return; |
| 547 | +} |
| 548 | + |
| 549 | +QStringList QgsWFSProjectParser::wfsLayers() const |
| 550 | +{ |
| 551 | + return mProjectParser.wfsLayers(); |
| 552 | +} |
| 553 | + |
| 554 | +QList<QgsMapLayer*> QgsWFSProjectParser::mapLayerFromTypeName( const QString& aTypeName, bool useCache ) const |
| 555 | +{ |
| 556 | + QList<QgsMapLayer*> layerList; |
| 557 | + const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements(); |
| 558 | + |
| 559 | + if ( projectLayerElements.size() < 1 ) |
| 560 | + { |
| 561 | + return layerList; |
| 562 | + } |
| 563 | + QStringList wfsLayersId = wfsLayers(); |
| 564 | + |
| 565 | + QStringList typeNameList; |
| 566 | + if ( aTypeName != "" ) |
| 567 | + { |
| 568 | + QStringList typeNameSplit = aTypeName.split( "," ); |
| 569 | + foreach ( const QString &str, typeNameSplit ) |
| 570 | + { |
| 571 | + if ( str.contains( ":" ) ) |
| 572 | + typeNameList << str.section( ":", 1, 1 ); |
| 573 | + else |
| 574 | + typeNameList << str; |
| 575 | + } |
| 576 | + } |
| 577 | + |
| 578 | + foreach ( const QDomElement &elem, projectLayerElements ) |
| 579 | + { |
| 580 | + QString type = elem.attribute( "type" ); |
| 581 | + if ( type == "vector" ) |
| 582 | + { |
| 583 | + //addJoinLayersForElement( elem, useCache ); //todo: fixme |
| 584 | + QgsMapLayer *mLayer = mProjectParser.createLayerFromElement( elem ); |
| 585 | + QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( mLayer ); |
| 586 | + if ( !layer ) |
| 587 | + continue; |
| 588 | + |
| 589 | + QString typeName = layer->name(); |
| 590 | + typeName = typeName.replace( " ", "_" ); |
| 591 | + |
| 592 | + if ( wfsLayersId.contains( layer->id() ) && ( aTypeName == "" || typeNameList.contains( typeName ) ) ) |
| 593 | + layerList.push_back( mLayer ); |
| 594 | + } |
| 595 | + } |
| 596 | + return layerList; |
| 597 | +} |
0 commit comments