|
25 | 25 | #include "qgsrasterlayer.h"
|
26 | 26 | #include "qgsrenderer.h"
|
27 | 27 | #include "qgsvectorlayer.h"
|
| 28 | +#include "qgsvectordataprovider.h" |
28 | 29 |
|
29 | 30 | #include "qgscomposition.h"
|
30 | 31 | #include "qgscomposerarrow.h"
|
@@ -206,6 +207,151 @@ void QgsProjectParser::featureTypeList( QDomElement& parentElement, QDomDocument
|
206 | 207 | return;
|
207 | 208 | }
|
208 | 209 |
|
| 210 | +void QgsProjectParser::describeFeatureType( const QString& aTypeName, QDomElement& parentElement, QDomDocument& doc ) const |
| 211 | +{ |
| 212 | + if ( mProjectLayerElements.size() < 1 ) |
| 213 | + { |
| 214 | + return; |
| 215 | + } |
| 216 | + |
| 217 | + QStringList wfsLayersId = wfsLayers(); |
| 218 | + QMap< QString, QMap< int, QString > > aliasInfo = layerAliasInfo(); |
| 219 | + QMap< QString, QSet<QString> > hiddenAttrs = hiddenAttributes(); |
| 220 | + |
| 221 | + foreach( const QDomElement &elem, mProjectLayerElements ) |
| 222 | + { |
| 223 | + QString type = elem.attribute( "type" ); |
| 224 | + if ( type == "vector" ) |
| 225 | + { |
| 226 | + QgsMapLayer *mLayer = createLayerFromElement( elem ); |
| 227 | + QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( mLayer ); |
| 228 | + if ( layer && wfsLayersId.contains( layer->id() ) && ( aTypeName == "" || layer->name() == aTypeName ) ) |
| 229 | + { |
| 230 | + //do a select with searchRect and go through all the features |
| 231 | + QgsVectorDataProvider* provider = layer->dataProvider(); |
| 232 | + if ( !provider ) |
| 233 | + { |
| 234 | + continue; |
| 235 | + } |
| 236 | + |
| 237 | + //is there alias info for this vector layer? |
| 238 | + QMap< int, QString > layerAliasInfo; |
| 239 | + QMap< QString, QMap< int, QString > >::const_iterator aliasIt = aliasInfo.find( mLayer->id() ); |
| 240 | + if ( aliasIt != aliasInfo.constEnd() ) |
| 241 | + { |
| 242 | + layerAliasInfo = aliasIt.value(); |
| 243 | + } |
| 244 | + |
| 245 | + //hidden attributes for this layer |
| 246 | + QSet<QString> layerHiddenAttributes; |
| 247 | + QMap< QString, QSet<QString> >::const_iterator hiddenIt = hiddenAttrs.find( mLayer->id() ); |
| 248 | + if ( hiddenIt != hiddenAttrs.constEnd() ) |
| 249 | + { |
| 250 | + layerHiddenAttributes = hiddenIt.value(); |
| 251 | + } |
| 252 | + |
| 253 | + QString typeName = layer->name(); |
| 254 | + typeName = typeName.replace( QString( " " ), QString( "_" ) ); |
| 255 | + |
| 256 | + //xsd:element |
| 257 | + QDomElement elementElem = doc.createElement( "element"/*xsd:element*/ ); |
| 258 | + elementElem.setAttribute( "name", typeName ); |
| 259 | + elementElem.setAttribute( "type", "qgs:" + typeName + "Type" ); |
| 260 | + elementElem.setAttribute( "substitutionGroup", "gml:_Feature" ); |
| 261 | + parentElement.appendChild( elementElem ); |
| 262 | + |
| 263 | + //xsd:complexType |
| 264 | + QDomElement complexTypeElem = doc.createElement( "complexType"/*xsd:complexType*/ ); |
| 265 | + complexTypeElem.setAttribute( "name", typeName + "Type" ); |
| 266 | + parentElement.appendChild( complexTypeElem ); |
| 267 | + |
| 268 | + //xsd:complexType |
| 269 | + QDomElement complexContentElem = doc.createElement( "complexContent"/*xsd:complexContent*/ ); |
| 270 | + complexTypeElem.appendChild( complexContentElem ); |
| 271 | + |
| 272 | + //xsd:extension |
| 273 | + QDomElement extensionElem = doc.createElement( "extension"/*xsd:extension*/ ); |
| 274 | + extensionElem.setAttribute( "base", "gml:AbstractFeatureType" ); |
| 275 | + complexContentElem.appendChild( extensionElem ); |
| 276 | + |
| 277 | + //xsd:sequence |
| 278 | + QDomElement sequenceElem = doc.createElement( "sequence"/*xsd:sequence*/ ); |
| 279 | + extensionElem.appendChild( sequenceElem ); |
| 280 | + |
| 281 | + //xsd:element |
| 282 | + QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ ); |
| 283 | + geomElem.setAttribute( "name", "geometry" ); |
| 284 | + QGis::WkbType wkbType = layer->wkbType(); |
| 285 | + switch ( wkbType ) |
| 286 | + { |
| 287 | + case QGis::WKBPoint25D: |
| 288 | + case QGis::WKBPoint: |
| 289 | + geomElem.setAttribute( "type", "gml:PointPropertyType" ); |
| 290 | + break; |
| 291 | + case QGis::WKBLineString25D: |
| 292 | + case QGis::WKBLineString: |
| 293 | + geomElem.setAttribute( "type", "gml:LineStringPropertyType" ); |
| 294 | + break; |
| 295 | + case QGis::WKBPolygon25D: |
| 296 | + case QGis::WKBPolygon: |
| 297 | + geomElem.setAttribute( "type", "gml:PolygonPropertyType" ); |
| 298 | + break; |
| 299 | + case QGis::WKBMultiPoint25D: |
| 300 | + case QGis::WKBMultiPoint: |
| 301 | + geomElem.setAttribute( "type", "gml:MultiPointPropertyType" ); |
| 302 | + break; |
| 303 | + case QGis::WKBMultiLineString25D: |
| 304 | + case QGis::WKBMultiLineString: |
| 305 | + geomElem.setAttribute( "type", "gml:MultiLineStringPropertyType" ); |
| 306 | + break; |
| 307 | + case QGis::WKBMultiPolygon25D: |
| 308 | + case QGis::WKBMultiPolygon: |
| 309 | + geomElem.setAttribute( "type", "gml:MultiPolygonPropertyType" ); |
| 310 | + break; |
| 311 | + default: |
| 312 | + geomElem.setAttribute( "type", "gml:GeometryPropertyType" ); |
| 313 | + break; |
| 314 | + } |
| 315 | + geomElem.setAttribute( "minOccurs", "0" ); |
| 316 | + geomElem.setAttribute( "maxOccurs", "1" ); |
| 317 | + sequenceElem.appendChild( geomElem ); |
| 318 | + |
| 319 | + const QgsFieldMap& fields = provider->fields(); |
| 320 | + for ( QgsFieldMap::const_iterator it = fields.begin(); it != fields.end(); ++it ) |
| 321 | + { |
| 322 | + |
| 323 | + QString attributeName = it.value().name(); |
| 324 | + //skip attribute if it has edit type 'hidden' |
| 325 | + if ( layerHiddenAttributes.contains( attributeName ) ) |
| 326 | + { |
| 327 | + continue; |
| 328 | + } |
| 329 | + |
| 330 | + //xsd:element |
| 331 | + QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ ); |
| 332 | + geomElem.setAttribute( "name", attributeName ); |
| 333 | + if ( it.value().type() == 2 ) |
| 334 | + geomElem.setAttribute( "type", "integer" ); |
| 335 | + else if ( it.value().type() == 6 ) |
| 336 | + geomElem.setAttribute( "type", "double" ); |
| 337 | + else |
| 338 | + geomElem.setAttribute( "type", "string" ); |
| 339 | + |
| 340 | + sequenceElem.appendChild( geomElem ); |
| 341 | + |
| 342 | + //check if the attribute name should be replaced with an alias |
| 343 | + QMap<int, QString>::const_iterator aliasIt = layerAliasInfo.find( it.key() ); |
| 344 | + if ( aliasIt != layerAliasInfo.constEnd() ) |
| 345 | + { |
| 346 | + geomElem.setAttribute( "alias", aliasIt.value() ); |
| 347 | + } |
| 348 | + } |
| 349 | + } |
| 350 | + } |
| 351 | + } |
| 352 | + return; |
| 353 | +} |
| 354 | + |
209 | 355 | void QgsProjectParser::addLayers( QDomDocument &doc,
|
210 | 356 | QDomElement &parentElem,
|
211 | 357 | const QDomElement &legendElem,
|
|
0 commit comments