3.3. WFS(웹 피처 서비스)
QGIS 서버에 구현된 WFS 1.0.0 및 1.1.0 표준은 QGIS 프로젝트로부터 지리 피처를 쿼리할 수 있는 HTTP 인터페이스를 제공합니다. 전형적인 WFS 요청은 사용할 QGIS 프로젝트와 쿼리할 레이어를 정의합니다.
서비스 버전에 따른 사양 문서:
QGIS 서버가 제공하는 표준 요청:
요청 |
설명 |
---|---|
서버에 대한 정보를 담은 XML 메타데이터를 반환 |
|
피처 집합을 반환 |
|
피처 유형 및 속성의 설명을 반환 |
|
피처를 삽입, 업데이트, 삭제 가능 |
3.3.1. GetCapabilities
OGC WFS 1.0.0 및 1.1.0 사양에 따른 GetCapabilities 요청용 표준 파라미터:
파라미터 |
필수 여부 |
설명 |
---|---|---|
Ο |
서비스(WFS)의 이름 |
|
Ο |
요청(GetCapabilities)의 이름 |
|
X |
서비스의 버전 |
표준 파라미터 이외에도, QGIS 서버는 다음과 같은 추가 파라미터를 지원합니다:
파라미터 |
필수 여부 |
설명 |
---|---|---|
Ο |
QGIS 프로젝트 파일 |
VERSION
이 파라미터는 사용할 서비스의 버전을 지정할 수 있습니다. VERSION
파라미터가 사용할 수 있는 값은 다음과 같습니다:
1.0.0
1.1.0
요청에서 버전을 지정하지 않을 경우, 1.1.0
을 기본값으로 사용합니다.
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&VERSION=1.1.0
&...
3.3.2. GetFeature
OGC WFS 1.0.0 및 1.1.0 사양에 따른 GetFeature 요청용 표준 파라미터:
파라미터 |
필수 여부 |
설명 |
---|---|---|
Ο |
서비스(WFS)의 이름 |
|
Ο |
요청(GetFeature)의 이름 |
|
X |
서비스의 버전 |
|
X |
레이어명 |
|
X |
피처를 ID로 필터링 |
|
X |
출력물 포맷 |
|
X |
산출물 유형 |
|
X |
반환할 속성의 이름 |
|
X |
반환할 피처의 최대 개수 |
|
X |
좌표계 |
|
X |
OGC 필터 인코딩 |
|
X |
맵 범위 |
|
X |
산출물 정렬 |
표준 파라미터 이외에도, QGIS 서버는 다음과 같은 추가 파라미터를 지원합니다:
파라미터 |
필수 여부 |
설명 |
---|---|---|
Ο |
QGIS 프로젝트 파일 |
|
X |
페이지 번호 붙이기 |
|
X |
반환할 도형의 유형 |
|
X |
표현식 필터링 |
TYPENAME
이 파라미터를 통해 레이어 이름을 지정할 수 있습니다. FEATUREID
파라미터를 설정하지 않은 경우 반드시 이 파라미터를 지정해줘야만 합니다.
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&VERSION=1.1.0
&REQUEST=GetFeature
&TYPENAME=countries
FEATUREID
이 파라미터를 통해 특정 피처의 ID를 지정할 수 있습니다. 파라미터 서식은 typename.fid,typename.fid,...
와 같습니다.
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&FEATUREID=countries.0,places.1
XML 응답 예시:
<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" xmlns:ows="http://www.opengis.net/ows" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qgs="http://www.qgis.org/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd http://www.qgis.org/gml http://192.168.1.15/qgisserver?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=countries,places&OUTPUTFORMAT=text/xml; subtype%3Dgml/3.1.1">
<gml:boundedBy>
...
</gml:boundedBy>
<gml:featureMember>
<qgs:countries gml:id="countries.1">
...
</qgs:countries>
</gml:featureMember>
<gml:featureMember>
<qgs:places gml:id="places.1">
...
</qgs:places>
</gml:featureMember>
</wfs:FeatureCollection>
OUTPUTFORMAT
이 파라미터를 통해 응답 포맷을 설정할 수도 있습니다. VERSION
이 1.1.0
이상인 경우, 기본 포맷은 GML3입니다. 그렇지 않다면 GML2를 사용합니다.
다음과 같은 값으로 설정할 수 있습니다:
gml2
text/xml; subtype=gml/2.1.2
gml3
text/xml; subtype=gml/3.1.1
geojson
application/vnd.geo+json
,application/vnd.geo json
application/geo+json
application/geo json
application/json
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&FEATUREID=countries.0
&OUTPUTFORMAT=geojson
GeoJSON 응답 예시:
{
"type":"FeatureCollection",
"bbox":[
-180,
-90,
180,
83.6236
],
"features":[
{
"bbox":[
-61.891113,
16.989719,
-61.666389,
17.724998
],
"geometry":{
"coordinates":[
"..."
],
"type":"MultiPolygon"
},
"id":"countries.1",
"properties":{
"id":1,
"name":"Antigua and Barbuda"
},
"type":"Feature"
}
]
}
RESULTTYPE
이 파라미터는 산출물의 종류를 지정할 수 있습니다. 사용할 수 있는 값은 다음과 같습니다:
results
: 기본 습성hits
: 피처 개수만 반환
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&VERSION=1.1.0
&REQUEST=GetFeature
&RESULTTYPE=hits
&...
PROPERTYNAME
이 파라미터를 통해 반환할 특정 속성을 지정할 수도 있습니다. 이때 속성을 TYPENAME
또는 FEATUREID
와 매핑시켜줘야 합니다:
무결한 URL의 예시:
http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&PROPERTYNAME=name
&TYPENAME=places
이와는 반대로, 다음 URL은 예외를 반환할 것입니다:
http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&PROPERTYNAME=name
&TYPENAME=places,countries
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.2.0">
<ServiceException code="RequestNotWellFormed">There has to be a 1:1 mapping between each element in a TYPENAME and the PROPERTYNAME list</ServiceException>
</ServiceExceptionReport>
MAXFEATURES
이 파라미터를 통해 요청이 반환하는 피처 개수를 제한할 수 있습니다.
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&TYPENAME=places
&MAXFEATURES=1000
참고
기저 벡터 레이어가 대용량인 경우 성능을 향상시키는 데 이 파라미터가 유용할 수도 있습니다.
SRSNAME
이 파라미터를 통해 응답 산출물의 공간좌표계는 물론 BBOX
좌표계를 지정할 수 있습니다. EPSG:XXXX
와 같은 서식이어야 합니다.
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&TYPENAME=places
&SRSNAME=EPSG:32620
FILTER
이 파라미터를 통해 OGC 필터 인코딩 표준 이 정의하는 필터 인코딩(Filter Encoding) 으로 응답을 필터링할 수 있습니다. 다음은 그 예시입니다:
http://localhost/qgisserver?
SERVICE=WFS&
REQUEST=GetFeature&
TYPENAME=places&
FILTER=<Filter><PropertyIsEqualTo><PropertyName>name</PropertyName><Literal>Paris</Literal></PropertyIsEqualTo></Filter>
TYPENAME
이 여러 개인 경우, 필터를 다음과 같이 괄호로 묶어줘야 합니다:
http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&TYPENAME=places,countries
&FILTER=(<Filter><PropertyIsEqualTo><PropertyName>name</PropertyName><Literal>Paris</Literal></PropertyIsEqualTo></Filter>)(<Filter><PropertyIsEqualTo><PropertyName>name</PropertyName><Literal>France</Literal></PropertyIsEqualTo></Filter>)
폴리곤과 교차하는 피처를 필터링합니다:
http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&VERSION=1.1.0
&TYPENAME=places
&FILTER=<Filter xmlns="http://www.opengis.net/ogc">
<Intersects>
<PropertyName>geometry</PropertyName>
<Polygon xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
<exterior>
<LinearRing>
<posList>
-0.6389 42.5922
10.2683 51.9106
14.5196 41.0320
-0.6389 42.5922
</posList>
</LinearRing>
</exterior>
</Polygon>
</Intersects>
</Filter>
BBOX
이 파라미터는 맵 범위를 현재 좌표계의 단위로 지정할 수 있습니다. 좌표를 쉼표로 구분해야 합니다.
SRSNAME
파라미터로 범위의 좌표계를 지정할 수도 있습니다. 좌표계를 지정하지 않을 경우, 레이어 좌표계를 사용합니다.
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&TYPENAME=places
&BBOX=-11.84,42.53,8.46,50.98
BBOX
파라미터는 FEATUREID
파라미터와 함께 사용할 수 없습니다. 어떻게 시도하더라도 예외가 발생할 것입니다:
<ServiceExceptionReport xmlns="http://www.opengis.net/ogc" version="1.2.0">
<ServiceException code="RequestNotWellFormed">FEATUREID FILTER and BBOX parameters are mutually exclusive</ServiceException>
</ServiceExceptionReport>
SORTBY
이 파라미터를 통해 반환 피처를 속성값에 따라 정렬할 수 있습니다. propertyname SORTRULE
과 같은 서식이어야 합니다.
내림차순으로 정렬하는 경우 SORTRULE
에 다음과 같은 값을 설정할 수 있습니다:
D
+D
DESC
+DESC
오름차순으로 정렬하는 경우 SORTRULE
에 다음과 같은 값을 설정할 수 있습니다:
A
+A
ASC
+ASC
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&TYPENAME=places
&PROPERTYNAME=name
&MAXFEATURES=3
&SORTBY=name DESC
다음은 이 예시에 대응하는 결과물입니다:
<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" xmlns:ows="http://www.opengis.net/ows" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qgs="http://www.qgis.org/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd http://www.qgis.org/gml http://192.168.1.15/qgisserver?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=places&OUTPUTFORMAT=text/xml; subtype%3Dgml/3.1.1">
<gml:boundedBy>
...
</gml:boundedBy>
<gml:featureMember>
<qgs:places gml:id="places.90">
<qgs:name>Zagreb</qgs:name>
</qgs:places>
</gml:featureMember>
<gml:featureMember>
<qgs:places gml:id="places.113">
<qgs:name>Yerevan</qgs:name>
</qgs:places>
</gml:featureMember>
<gml:featureMember>
<qgs:places gml:id="places.111">
<qgs:name>Yaounde</qgs:name>
</qgs:places>
</gml:featureMember>
</wfs:FeatureCollection>
GEOMETRYNAME
이 파라미터는 피처에 대해 반환할 도형의 종류를 지정할 수 있습니다. 사용할 수 있는 값은 다음과 같습니다:
extent
centroid
none
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&VERSION=1.1.0
&REQUEST=GetFeature
&GEOMETRYNAME=centroid
&...
STARTINDEX
WFS 2.0 버전에서는 이 파라미터가 표준이지만, WFS 1.0.0 버전에서는 확장 사양입니다.
실제로 이 파라미터를 통해 결과물 집합에서 몇몇 피처를 건너뛸 수 있으며, MAXFEATURES
파라미터와 함께 사용하면 결과물을 페이지 단위로 볼 수도 있습니다.
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&VERSION=1.1.0
&REQUEST=GetFeature
&STARTINDEX=2
&...
EXP_FILTER
이 파라미터를 통해 응답을 QGIS 표현식으로 필터링할 수 있습니다. TYPENAME
이 여러 개인 경우 ;
문자를 이용해서 필터를 구분합니다.
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&TYPENAME=places,countries
&EXP_FILTER="name"='Paris';"name"='France'
3.3.3. DescribeFeatureType
OGC WFS 1.0.0 및 1.1.0 사양에 따른 DescribeFeatureType 요청용 표준 파라미터:
파라미터 |
필수 여부 |
설명 |
---|---|---|
Ο |
서비스(WFS)의 이름 |
|
Ο |
요청(DescribeFeatureType)의 이름 |
|
X |
서비스의 버전 |
|
X |
응답 포맷 |
|
X |
레이어명 |
표준 파라미터 이외에도, QGIS 서버는 다음과 같은 추가 파라미터를 지원합니다:
파라미터 |
필수 여부 |
설명 |
---|---|---|
Ο |
QGIS 프로젝트 파일 |
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&VERSION=1.1.0
&REQUEST=DescribeFeatureType
&TYPENAME=countries
산출물 응답 예시:
<schema xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:qgs="http://www.qgis.org/gml" xmlns:gml="http://www.opengis.net/gml" targetNamespace="http://www.qgis.org/gml" version="1.0" elementFormDefault="qualified">
<import schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd" namespace="http://www.opengis.net/gml"/>
<element type="qgs:countriesType" substitutionGroup="gml:_Feature" name="countries"/>
<complexType name="countriesType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element minOccurs="0" type="gml:MultiPolygonPropertyType" maxOccurs="1" name="geometry"/>
<element type="long" name="id"/>
<element nillable="true" type="string" name="name"/>
</sequence>
</extension>
</complexContent>
</complexType>
</schema>
3.3.4. Transaction
이 요청은 XML 문서를 이용해서 하나 이상의 피처를 업데이트, 삭제, 또는 추가할 수 있습니다. 삭제 작업은 POST 요청은 물론 OPERATION 파라미터로 달성할 수도 있지만, 추가 및 업데이트 작업은 POST 요청을 통해서만 달성할 수 있습니다.
OGC WFS 1.0.0 및 1.1.0 사양에 따른 Transaction 요청용 표준 파라미터:
파라미터 |
필수 여부 |
설명 |
---|---|---|
Ο |
서비스(WFS)의 이름 |
|
Ο |
요청(Transaction)의 이름 |
|
X |
서비스의 버전 |
|
X |
OGC 필터 인코딩 |
|
X |
맵 범위 |
|
X |
피처를 ID로 필터링 |
|
X |
레이어명 |
표준 파라미터 이외에도, QGIS 서버는 다음과 같은 추가 파라미터를 지원합니다:
파라미터 |
필수 여부 |
설명 |
---|---|---|
Ο |
QGIS 프로젝트 파일 |
|
X |
작업을 지정 |
|
X |
표현식 필터링 |
OPERATION
이 파라미터는 POST 요청을 이용하지 않고 전용 XML 문서를 통해 피처를 삭제할 수 있습니다.
URL 예시:
http://localhost/qgisserver?
SERVICE=WFS
&VERSION=1.1.0
&REQUEST=Transaction
&OPERATION=DELETE
&FEATUREID=24
참고
FEATUREID
, BBOX
, 그리고 FILTER
파라미터는 상호 배타적이며 이 순서대로 우선합니다.
피처 추가
POST 요청의 예시:
wget --post-file=add.xml "http://localhost/qgisserver?SERVICE=WFS&REQUEST=Transaction"
add.xml 문서의 예시:
<?xml version="1.0" encoding="UTF-8"?>
<wfs:Transaction service="WFS" version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.opengis.net/wfs" updateSequence="0" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-capabilities.xsd" xmlns:gml="http://www.opengis.net/gml" xmlns:ows="http://www.opengis.net/ows">
<wfs:Insert idgen="GenerateNew">
<qgs:places>
<qgs:geometry>
<gml:Point srsDimension="2" srsName="http://www.opengis.net/def/crs/EPSG/0/4326">
<gml:coordinates decimal="." cs="," ts=" ">-4.6167,48.3833</gml:coordinates>
</gml:Point>
</qgs:geometry>
<qgs:name>Locmaria-Plouzané</qgs:name>
</qgs:places>
</wfs:Insert>
</wfs:Transaction>
피처 업데이트
POST 요청의 예시:
wget --post-file=update.xml "http://localhost/qgisserver?SERVICE=WFS&REQUEST=Transaction"
update.xml 문서의 예시:
<?xml version="1.0" encoding="UTF-8"?>
<wfs:Transaction service="WFS" version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.opengis.net/wfs" updateSequence="0" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-capabilities.xsd" xmlns:gml="http://www.opengis.net/gml" xmlns:ows="http://www.opengis.net/ows">
<wfs:Update typeName="places">
<wfs:Property>
<wfs:Name>name</wfs:Name>
<wfs:Value>Lutece</wfs:Value>
</wfs:Property>
<ogc:Filter>
<ogc:FeatureId fid="24"/>
</ogc:Filter>
</wfs:Update>
</wfs:Transaction>
피처 삭제
POST 요청의 예시:
wget --post-file=delete.xml "http://localhost/qgisserver?SERVICE=WFS&REQUEST=Transaction"
delete.xml 문서의 예시:
<?xml version="1.0" encoding="UTF-8"?>
<wfs:Transaction service="WFS" version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.opengis.net/wfs" updateSequence="0" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-capabilities.xsd" xmlns:gml="http://www.opengis.net/gml" xmlns:ows="http://www.opengis.net/ows">
<wfs:Delete typeName="places">
<ogc:Filter>
<ogc:FeatureId fid="24"/>
</ogc:Filter>
</wfs:Delete>
</wfs:Transaction>