Skip to content

Commit ecefb84

Browse files
committedApr 5, 2019
[server] Allow WMS GetFeatureInfo on root layer and groups
cherry-picking commit 3c4b2a7 from master
1 parent eb88cc4 commit ecefb84

16 files changed

+4568
-15
lines changed
 

‎src/server/services/wms/qgswmsgetcapabilities.cpp

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,15 @@ namespace QgsWms
841841
layerParentElem.appendChild( treeNameElem );
842842
}
843843

844+
if ( hasQueryableChildren( projectLayerTreeRoot, QgsServerProjectUtils::wmsRestrictedLayers( *project ) ) )
845+
{
846+
layerParentElem.setAttribute( QStringLiteral( "queryable" ), QStringLiteral( "1" ) );
847+
}
848+
else
849+
{
850+
layerParentElem.setAttribute( QStringLiteral( "queryable" ), QStringLiteral( "0" ) );
851+
}
852+
844853
appendLayersFromTreeGroup( doc, layerParentElem, serverIface, project, version, request, projectLayerTreeRoot, projectSettings );
845854

846855
combineExtentAndCrsOfGroupChildren( doc, layerParentElem, project, true );
@@ -862,7 +871,7 @@ namespace QgsWms
862871
{
863872
bool useLayerIds = QgsServerProjectUtils::wmsUseLayerIds( *project );
864873
bool siaFormat = QgsServerProjectUtils::wmsInfoFormatSia2045( *project );
865-
QStringList restrictedLayers = QgsServerProjectUtils::wmsRestrictedLayers( *project );
874+
const QStringList restrictedLayers = QgsServerProjectUtils::wmsRestrictedLayers( *project );
866875

867876
QList< QgsLayerTreeNode * > layerTreeGroupChildren = layerTreeGroup->children();
868877
for ( int i = 0; i < layerTreeGroupChildren.size(); ++i )
@@ -929,6 +938,16 @@ namespace QgsWms
929938
layerElem.appendChild( treeNameElem );
930939
}
931940

941+
// Set queryable if any of the children are
942+
if ( hasQueryableChildren( treeNode, restrictedLayers ) )
943+
{
944+
layerElem.setAttribute( QStringLiteral( "queryable" ), QStringLiteral( "1" ) );
945+
}
946+
else
947+
{
948+
layerElem.setAttribute( QStringLiteral( "queryable" ), QStringLiteral( "0" ) );
949+
}
950+
932951
appendLayersFromTreeGroup( doc, layerElem, serverIface, project, version, request, treeGroupChild, projectSettings );
933952

934953
combineExtentAndCrsOfGroupChildren( doc, layerElem, project );
@@ -1857,6 +1876,26 @@ namespace QgsWms
18571876
}
18581877
}
18591878

1879+
bool hasQueryableChildren( const QgsLayerTreeNode *childNode, const QStringList &wmsRestrictedLayers )
1880+
{
1881+
if ( childNode->nodeType() == QgsLayerTreeNode::NodeGroup )
1882+
{
1883+
for ( int j = 0; j < childNode->children().size(); ++j )
1884+
{
1885+
if ( hasQueryableChildren( childNode->children().at( j ), wmsRestrictedLayers ) )
1886+
return true;
1887+
}
1888+
return false;
1889+
}
1890+
else if ( childNode->nodeType() == QgsLayerTreeNode::NodeLayer )
1891+
{
1892+
const auto treeLayer { static_cast<const QgsLayerTreeLayer *>( childNode ) };
1893+
const auto l { treeLayer->layer() };
1894+
return ! wmsRestrictedLayers.contains( l->name() ) && l->flags().testFlag( QgsMapLayer::Identifiable );
1895+
}
1896+
return false;
1897+
}
1898+
18601899

18611900
} // namespace QgsWms
18621901

‎src/server/services/wms/qgswmsgetcapabilities.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ namespace QgsWms
8282
QDomDocument getCapabilities( QgsServerInterface *serverIface, const QgsProject *project,
8383
const QString &version, const QgsServerRequest &request,
8484
bool projectSettings );
85+
86+
bool hasQueryableChildren( const QgsLayerTreeNode *childNode, const QStringList &wmsRestrictedLayers );
8587
} // namespace QgsWms
8688

8789
#endif

‎src/server/services/wms/qgswmsrenderer.cpp

Lines changed: 70 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,7 +1020,8 @@ namespace QgsWms
10201020
{
10211021
// Verifying Mandatory parameters
10221022
// The QUERY_LAYERS parameter is Mandatory
1023-
QStringList queryLayers = mWmsParameters.queryLayersNickname();
1023+
QStringList queryLayers = flattenedQueryLayers();
1024+
10241025
if ( queryLayers.isEmpty() )
10251026
{
10261027
QString msg = QObject::tr( "QUERY_LAYERS parameter is required for GetFeatureInfo" );
@@ -1319,7 +1320,8 @@ namespace QgsWms
13191320
QDomDocument QgsRenderer::featureInfoDocument( QList<QgsMapLayer *> &layers, const QgsMapSettings &mapSettings,
13201321
const QImage *outputImage, const QString &version ) const
13211322
{
1322-
QStringList queryLayers = mWmsParameters.queryLayersNickname();
1323+
1324+
const QStringList queryLayers = flattenedQueryLayers( );
13231325

13241326
bool ijDefined = ( !mWmsParameters.i().isEmpty() && !mWmsParameters.j().isEmpty() );
13251327

@@ -1502,8 +1504,40 @@ namespace QgsWms
15021504
}
15031505
else if ( ( validLayer && !queryableLayer ) || ( !validLayer && mLayerGroups.contains( queryLayer ) ) )
15041506
{
1505-
QString msg = QObject::tr( "Layer '%1' is not queryable" ).arg( queryLayer );
1506-
throw QgsBadRequestException( QStringLiteral( "LayerNotQueryable" ), msg );
1507+
auto queryLayerName { queryLayer };
1508+
// Check if this layer belongs to a group and the group has any queryable layers
1509+
bool hasGroupAndQueryable { false };
1510+
if ( ! mWmsParameters.queryLayersNickname().contains( queryLayer ) )
1511+
{
1512+
// Find which group this layer belongs to
1513+
const auto &constNicks { mWmsParameters.queryLayersNickname() };
1514+
for ( const auto &ql : constNicks )
1515+
{
1516+
if ( mLayerGroups.contains( ql ) )
1517+
{
1518+
const auto &constLayers { mLayerGroups[ql] };
1519+
for ( const auto &ml : constLayers )
1520+
{
1521+
if ( ( ! ml->shortName().isEmpty() && ml->shortName() == queryLayer ) || ( ml->name() == queryLayer ) )
1522+
{
1523+
queryLayerName = ql;
1524+
}
1525+
if ( ml->flags().testFlag( QgsMapLayer::Identifiable ) )
1526+
{
1527+
hasGroupAndQueryable = true;
1528+
break;
1529+
}
1530+
}
1531+
break;
1532+
}
1533+
}
1534+
}
1535+
// Only throw if it's not a group or the group has no queryable children
1536+
if ( ! hasGroupAndQueryable )
1537+
{
1538+
const QString msg { QObject::tr( "The layer '%1' is not queryable." ).arg( queryLayerName ) };
1539+
throw QgsBadRequestException( QStringLiteral( "LayerNotQueryable" ), msg );
1540+
}
15071541
}
15081542
}
15091543

@@ -2386,7 +2420,7 @@ namespace QgsWms
23862420
exporter.setAttributes( attributes );
23872421
exporter.setIncludeGeometry( withGeometry );
23882422

2389-
for ( const auto feature : features )
2423+
for ( const auto &feature : qgis::as_const( features ) )
23902424
{
23912425
if ( json.right( 1 ).compare( QStringLiteral( "}" ) ) == 0 )
23922426
{
@@ -2399,6 +2433,10 @@ namespace QgsWms
23992433
}
24002434
else // raster layer
24012435
{
2436+
if ( json.right( 1 ).compare( QStringLiteral( "}" ) ) == 0 )
2437+
{
2438+
json.append( QStringLiteral( "," ) );
2439+
}
24022440
json.append( QStringLiteral( "{" ) );
24032441
json.append( QStringLiteral( "\"type\":\"Feature\",\n" ) );
24042442
json.append( QStringLiteral( "\"id\":\"%1\",\n" ).arg( layer->name() ) );
@@ -3451,4 +3489,31 @@ namespace QgsWms
34513489
}
34523490
}
34533491

3492+
QStringList QgsRenderer::flattenedQueryLayers() const
3493+
{
3494+
QStringList result;
3495+
std::function <QStringList( const QString &name )> findLeaves = [ & ]( const QString & name ) -> QStringList
3496+
{
3497+
QStringList _result;
3498+
if ( mLayerGroups.contains( name ) )
3499+
{
3500+
for ( const auto &l : mLayerGroups[ name ] )
3501+
{
3502+
_result.append( findLeaves( l->shortName().isEmpty() ? l->name() : l->shortName() ) );
3503+
}
3504+
}
3505+
else
3506+
{
3507+
_result.append( name );
3508+
}
3509+
return _result;
3510+
};
3511+
for ( const auto &name : mWmsParameters.queryLayersNickname() )
3512+
{
3513+
result.append( findLeaves( name ) );
3514+
}
3515+
return result;
3516+
}
3517+
3518+
34543519
} // namespace QgsWms

‎src/server/services/wms/qgswmsrenderer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,8 @@ namespace QgsWms
306306
QStringList mRestrictedLayers;
307307
QMap<QString, QgsMapLayer *> mNicknameLayers;
308308
QMap<QString, QList<QgsMapLayer *> > mLayerGroups;
309-
QList<QgsMapLayer *> mTemporaryLayers;
309+
QList<QgsMapLayer *> mTemporaryLayers;
310+
QStringList flattenedQueryLayers() const;
310311

311312
public:
312313

‎tests/src/python/test_qgsserver_wms_getfeatureinfo.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,117 @@ def testGetFeatureInfoPostgresTypes(self):
591591
attribute.get('value')), {
592592
'c': 4.0, 'd': 5.0})
593593

594+
def testGetFeatureInfoGroupedLayers(self):
595+
"""Test that we can get feature info from the top and group layers"""
596+
597+
# areas+and+symbols (not nested)
598+
self.wms_request_compare('GetFeatureInfo',
599+
'&BBOX=52.44095517977704901,10.71171069440170776,52.440955186258563,10.71171070552261817' +
600+
'&CRS=EPSG:4326' +
601+
'&WIDTH=2&HEIGHT=2' +
602+
'&QUERY_LAYERS=areas+and+symbols' +
603+
'&INFO_FORMAT=application/json' +
604+
'&I=0&J=1' +
605+
'&FEATURE_COUNT=10',
606+
'wms_getfeatureinfo_group_name_areas',
607+
'test_project_wms_grouped_layers.qgs')
608+
609+
# areas+and+symbols (nested)
610+
self.wms_request_compare('GetFeatureInfo',
611+
'&BBOX=52.44095517977704901,10.71171069440170776,52.440955186258563,10.71171070552261817' +
612+
'&CRS=EPSG:4326' +
613+
'&WIDTH=2&HEIGHT=2' +
614+
'&QUERY_LAYERS=areas+and+symbols' +
615+
'&INFO_FORMAT=application/json' +
616+
'&I=0&J=1' +
617+
'&FEATURE_COUNT=10',
618+
'wms_getfeatureinfo_group_name_areas',
619+
'test_project_wms_grouped_nested_layers.qgs')
620+
621+
# as-areas-short-name
622+
self.wms_request_compare('GetFeatureInfo',
623+
'&BBOX=52.44095517977704901,10.71171069440170776,52.440955186258563,10.71171070552261817' +
624+
'&CRS=EPSG:4326' +
625+
'&WIDTH=2&HEIGHT=2' +
626+
'&QUERY_LAYERS=as-areas-short-name' +
627+
'&INFO_FORMAT=application/json' +
628+
'&I=0&J=1' +
629+
'&FEATURE_COUNT=10',
630+
'wms_getfeatureinfo_group_name_areas',
631+
'test_project_wms_grouped_nested_layers.qgs')
632+
633+
# Top level: QGIS Server - Grouped Layer
634+
self.wms_request_compare('GetFeatureInfo',
635+
'&BBOX=52.44095517977704901,10.71171069440170776,52.440955186258563,10.71171070552261817' +
636+
'&CRS=EPSG:4326' +
637+
'&WIDTH=2&HEIGHT=2' +
638+
'&QUERY_LAYERS=QGIS+Server+-+Grouped Nested Layer' +
639+
'&INFO_FORMAT=application/json' +
640+
'&I=0&J=1' +
641+
'&FEATURE_COUNT=10',
642+
'wms_getfeatureinfo_group_name_top',
643+
'test_project_wms_grouped_nested_layers.qgs')
644+
645+
# Multiple matches from 2 layer groups
646+
self.wms_request_compare('GetFeatureInfo',
647+
'&BBOX=52.44095517977704901,10.71171069440170776,52.440955186258563,10.71171070552261817' +
648+
'&CRS=EPSG:4326' +
649+
'&WIDTH=2&HEIGHT=2' +
650+
'&QUERY_LAYERS=areas+and+symbols,city+and+district+boundaries' +
651+
'&INFO_FORMAT=application/json' +
652+
'&I=0&J=1' +
653+
'&FEATURE_COUNT=10',
654+
'wms_getfeatureinfo_group_name_areas_cities',
655+
'test_project_wms_grouped_nested_layers.qgs')
656+
657+
# no_query group (nested)
658+
self.wms_request_compare('GetFeatureInfo',
659+
'&BBOX=52.44095517977704901,10.71171069440170776,52.440955186258563,10.71171070552261817' +
660+
'&CRS=EPSG:4326' +
661+
'&WIDTH=2&HEIGHT=2' +
662+
'&QUERY_LAYERS=no_query' +
663+
'&INFO_FORMAT=application/json' +
664+
'&I=0&J=1' +
665+
'&FEATURE_COUNT=10',
666+
'wms_getfeatureinfo_group_no_query',
667+
'test_project_wms_grouped_nested_layers.qgs')
668+
669+
# query_child group (nested)
670+
self.wms_request_compare('GetFeatureInfo',
671+
'&BBOX=52.44095517977704901,10.71171069440170776,52.440955186258563,10.71171070552261817' +
672+
'&CRS=EPSG:4326' +
673+
'&WIDTH=2&HEIGHT=2' +
674+
'&QUERY_LAYERS=query_child' +
675+
'&INFO_FORMAT=application/json' +
676+
'&I=0&J=1' +
677+
'&FEATURE_COUNT=10',
678+
'wms_getfeatureinfo_group_query_child',
679+
'test_project_wms_grouped_nested_layers.qgs')
680+
681+
# child_ok group (nested)
682+
self.wms_request_compare('GetFeatureInfo',
683+
'&BBOX=52.44095517977704901,10.71171069440170776,52.440955186258563,10.71171070552261817' +
684+
'&CRS=EPSG:4326' +
685+
'&WIDTH=2&HEIGHT=2' +
686+
'&QUERY_LAYERS=child_ok' +
687+
'&INFO_FORMAT=application/json' +
688+
'&I=0&J=1' +
689+
'&FEATURE_COUNT=10',
690+
'wms_getfeatureinfo_group_query_child',
691+
'test_project_wms_grouped_nested_layers.qgs')
692+
693+
# as_areas_query_copy == as-areas-short-name-query-copy (nested)
694+
self.wms_request_compare('GetFeatureInfo',
695+
'&BBOX=52.44095517977704901,10.71171069440170776,52.440955186258563,10.71171070552261817' +
696+
'&CRS=EPSG:4326' +
697+
'&WIDTH=2&HEIGHT=2' +
698+
'&QUERY_LAYERS=as-areas-short-name-query-copy' +
699+
'&INFO_FORMAT=application/json' +
700+
'&I=0&J=1' +
701+
'&FEATURE_COUNT=10',
702+
'wms_getfeatureinfo_group_query_child',
703+
'test_project_wms_grouped_nested_layers.qgs')
704+
594705

595706
if __name__ == '__main__':
596707
unittest.main()

‎tests/testdata/qgis_server/db.gpkg

0 Bytes
Binary file not shown.

‎tests/testdata/qgis_server/getprojectsettings.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ Content-Type: text/xml; charset=utf-8
283283
<Attribute precision="0" type="QString" editType="TextEdit" typeName="String" name="utf8nameè" comment="" length="13"/>
284284
</Attributes>
285285
</Layer>
286-
<Layer mutuallyExclusive="0" visible="1">
286+
<Layer mutuallyExclusive="0" visible="1" queryable="1">
287287
<Name>group_name</Name>
288288
<Title>Group title</Title>
289289
<Abstract>Group abstract</Abstract>
@@ -329,7 +329,7 @@ Content-Type: text/xml; charset=utf-8
329329
</Attributes>
330330
</Layer>
331331
</Layer>
332-
<Layer mutuallyExclusive="0" visible="1">
332+
<Layer mutuallyExclusive="0" queryable="0" visible="1">
333333
<Name>groupwithoutshortname</Name>
334334
<Title>groupwithoutshortname</Title>
335335
<CRS>CRS:84</CRS>

‎tests/testdata/qgis_server/test_project_wms_grouped_nested_layers.qgs

Lines changed: 4127 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
*****
1+
Content-Length: 254
22
Content-Type: text/xml; charset=utf-8
33

4-
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.3.0">
5-
<ServiceException code="LayerNotQueryable">Layer 'group_name' is not queryable</ServiceException>
6-
</ServiceExceptionReport>
4+
<GetFeatureInfoResponse>
5+
<Layer name="testlayer2">
6+
<Feature id="2">
7+
<Attribute value="3" name="id"/>
8+
<Attribute value="three" name="name"/>
9+
<Attribute value="three èé↓" name="utf8nameè"/>
10+
</Feature>
11+
</Layer>
12+
</GetFeatureInfoResponse>

‎tests/testdata/qgis_server/wms_getfeatureinfo-groupwithoutshortname-notqueryable.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
Content-Type: text/xml; charset=utf-8
33

44
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.3.0">
5-
<ServiceException code="LayerNotQueryable">Layer 'groupwithoutshortname' is not queryable</ServiceException>
5+
<ServiceException code="LayerNotQueryable">The layer 'groupwithoutshortname' is not queryable.</ServiceException>
66
</ServiceExceptionReport>

‎tests/testdata/qgis_server/wms_getfeatureinfo-testlayer3-notqueryable.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
Content-Type: text/xml; charset=utf-8
33

44
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.3.0">
5-
<ServiceException code="LayerNotQueryable">Layer 'testlayer3' is not queryable</ServiceException>
5+
<ServiceException code="LayerNotQueryable">The layer 'testlayer3' is not queryable.</ServiceException>
66
</ServiceExceptionReport>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
Content-Length: 753
2+
Content-Type: application/json; charset=utf-8
3+
4+
{"type": "FeatureCollection",
5+
"features":[
6+
{
7+
"type":"Feature",
8+
"id":"as_areas.18",
9+
"geometry":null,
10+
"properties":{
11+
"fid":18,
12+
"gid":34,
13+
"datum":"2013-06-11",
14+
"bearbeiter":"scholle-b",
15+
"veranstaltung":"",
16+
"beschriftung":"",
17+
"name":"",
18+
"flaechentyp":"Schraffur",
19+
"farbe":"255 0 0",
20+
"schraff_width":"2",
21+
"schraff_width_prt":"6.00",
22+
"schraff_size":"10",
23+
"schraff_size_prt":"30.00",
24+
"schraff_winkel":"45",
25+
"umrissfarbe":"0 0 0",
26+
"umrisstyp":"durchgezogen",
27+
"umrissstaerke":"1",
28+
"umrissstaerke_prt":"3.00",
29+
"umfang":758.4703,
30+
"flaeche":12879,
31+
"bemerkung":"",
32+
"last_change":"2013-06-11 10:03:45.52301+02"
33+
}
34+
}]}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
Content-Length: 992
2+
Content-Type: application/json; charset=utf-8
3+
4+
{"type": "FeatureCollection",
5+
"features":[
6+
{
7+
"type":"Feature",
8+
"id":"as_areas.18",
9+
"geometry":null,
10+
"properties":{
11+
"fid":18,
12+
"gid":34,
13+
"datum":"2013-06-11",
14+
"bearbeiter":"scholle-b",
15+
"veranstaltung":"",
16+
"beschriftung":"",
17+
"name":"",
18+
"flaechentyp":"Schraffur",
19+
"farbe":"255 0 0",
20+
"schraff_width":"2",
21+
"schraff_width_prt":"6.00",
22+
"schraff_size":"10",
23+
"schraff_size_prt":"30.00",
24+
"schraff_winkel":"45",
25+
"umrissfarbe":"0 0 0",
26+
"umrisstyp":"durchgezogen",
27+
"umrissstaerke":"1",
28+
"umrissstaerke_prt":"3.00",
29+
"umfang":758.4703,
30+
"flaeche":12879,
31+
"bemerkung":"",
32+
"last_change":"2013-06-11 10:03:45.52301+02"
33+
}
34+
},{
35+
"type":"Feature",
36+
"id":"cdb_lines.13",
37+
"geometry":null,
38+
"properties":{
39+
"fid":13,
40+
"id":12,
41+
"typ":"Ortsteil",
42+
"name":"Fallersleben",
43+
"ortsrat":"Fallersleben\/Sülfeld",
44+
"id_long":null
45+
}
46+
}]}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
Content-Length: 1124
2+
Content-Type: application/json; charset=utf-8
3+
4+
{"type": "FeatureCollection",
5+
"features":[
6+
{
7+
"type":"Feature",
8+
"id":"cdb_lines.13",
9+
"geometry":null,
10+
"properties":{
11+
"fid":13,
12+
"id":12,
13+
"typ":"Ortsteil",
14+
"name":"Fallersleben",
15+
"ortsrat":"Fallersleben\/Sülfeld",
16+
"id_long":null
17+
}
18+
},{
19+
"type":"Feature",
20+
"id":"as_areas.18",
21+
"geometry":null,
22+
"properties":{
23+
"fid":18,
24+
"gid":34,
25+
"datum":"2013-06-11",
26+
"bearbeiter":"scholle-b",
27+
"veranstaltung":"",
28+
"beschriftung":"",
29+
"name":"",
30+
"flaechentyp":"Schraffur",
31+
"farbe":"255 0 0",
32+
"schraff_width":"2",
33+
"schraff_width_prt":"6.00",
34+
"schraff_size":"10",
35+
"schraff_size_prt":"30.00",
36+
"schraff_winkel":"45",
37+
"umrissfarbe":"0 0 0",
38+
"umrisstyp":"durchgezogen",
39+
"umrissstaerke":"1",
40+
"umrissstaerke_prt":"3.00",
41+
"umfang":758.4703,
42+
"flaeche":12879,
43+
"bemerkung":"",
44+
"last_change":"2013-06-11 10:03:45.52301+02"
45+
}
46+
},{
47+
"type":"Feature",
48+
"id":"as_areas_query_copy.18",
49+
"geometry":null,
50+
"properties":{
51+
"fid":18,
52+
"gid":34,
53+
"datum":"2013-06-11",
54+
"bearbeiter":"scholle-b",
55+
"veranstaltung":"",
56+
"beschriftung":"",
57+
"name":"",
58+
"flaechentyp":"Schraffur",
59+
"farbe":"255 0 0",
60+
"schraff_width":"2",
61+
"schraff_width_prt":"6.00",
62+
"schraff_size":"10",
63+
"schraff_size_prt":"30.00",
64+
"schraff_winkel":"45",
65+
"umrissfarbe":"0 0 0",
66+
"umrisstyp":"durchgezogen",
67+
"umrissstaerke":"1",
68+
"umrissstaerke_prt":"3.00",
69+
"umfang":758.4703,
70+
"flaeche":12879,
71+
"bemerkung":"",
72+
"last_change":"2013-06-11 10:03:45.52301+02"
73+
}
74+
},{"type":"Feature",
75+
"id":"osm",
76+
"properties":{
77+
"Band 1": "255",
78+
"Band 2": "255",
79+
"Band 3": "255",
80+
"Band 4": "255"
81+
}
82+
}]}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
*****
2+
Content-Type: text/xml; charset=utf-8
3+
4+
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.3.0">
5+
<ServiceException code="LayerNotQueryable">The layer 'no_query' is not queryable.</ServiceException>
6+
</ServiceExceptionReport>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
*****
2+
Content-Type: application/json; charset=utf-8
3+
4+
{"type": "FeatureCollection",
5+
"features":[
6+
{
7+
"type":"Feature",
8+
"id":"as_areas_query_copy.18",
9+
"geometry":null,
10+
"properties":{
11+
"fid":18,
12+
"gid":34,
13+
"datum":"2013-06-11",
14+
"bearbeiter":"scholle-b",
15+
"veranstaltung":"",
16+
"beschriftung":"",
17+
"name":"",
18+
"flaechentyp":"Schraffur",
19+
"farbe":"255 0 0",
20+
"schraff_width":"2",
21+
"schraff_width_prt":"6.00",
22+
"schraff_size":"10",
23+
"schraff_size_prt":"30.00",
24+
"schraff_winkel":"45",
25+
"umrissfarbe":"0 0 0",
26+
"umrisstyp":"durchgezogen",
27+
"umrissstaerke":"1",
28+
"umrissstaerke_prt":"3.00",
29+
"umfang":758.4703,
30+
"flaeche":12879,
31+
"bemerkung":"",
32+
"last_change":"2013-06-11 10:03:45.52301+02"
33+
}
34+
}]}

0 commit comments

Comments
 (0)
Please sign in to comment.