3.3. WFS(웹 피처 서비스)

QGIS 서버에 구현된 WFS 1.0.01.1.0 표준은 QGIS 프로젝트로부터 지리 피처를 쿼리할 수 있는 HTTP 인터페이스를 제공합니다. 전형적인 WFS 요청은 사용할 QGIS 프로젝트와 쿼리할 레이어를 정의합니다.

서비스 버전에 따른 사양 문서:

QGIS 서버가 제공하는 표준 요청:

요청

설명

GetCapabilities

서버에 대한 정보를 담은 XML 메타데이터를 반환

GetFeature

피처 집합을 반환

DescribeFeatureType

피처 유형 및 속성의 설명을 반환

Transaction

피처를 삽입, 업데이트, 삭제 가능

3.3.1. GetCapabilities

OGC WFS 1.0.0 및 1.1.0 사양에 따른 GetCapabilities 요청용 표준 파라미터:

파라미터

필수 여부

설명

SERVICE

Ο

서비스(WFS)의 이름

REQUEST

Ο

요청(GetCapabilities)의 이름

VERSION

서비스의 버전

표준 파라미터 이외에도, QGIS 서버는 다음과 같은 추가 파라미터를 지원합니다:

파라미터

필수 여부

설명

MAP

Ο

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 요청용 표준 파라미터:

파라미터

필수 여부

설명

SERVICE

Ο

서비스(WFS)의 이름

REQUEST

Ο

요청(GetFeature)의 이름

VERSION

서비스의 버전

TYPENAME

레이어명

FEATUREID

피처를 ID로 필터링

OUTPUTFORMAT

출력물 포맷

RESULTTYPE

산출물 유형

PROPERTYNAME

반환할 속성의 이름

MAXFEATURES

반환할 피처의 최대 개수

SRSNAME

좌표계

FILTER

OGC 필터 인코딩

BBOX

맵 범위

SORTBY

산출물 정렬

표준 파라미터 이외에도, QGIS 서버는 다음과 같은 추가 파라미터를 지원합니다:

파라미터

필수 여부

설명

MAP

Ο

QGIS 프로젝트 파일

STARTINDEX

페이지 번호 붙이기

GEOMETRYNAME

반환할 도형의 유형

EXP_FILTER

표현식 필터링

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

이 파라미터를 통해 응답 포맷을 설정할 수도 있습니다. VERSION1.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 요청용 표준 파라미터:

파라미터

필수 여부

설명

SERVICE

Ο

서비스(WFS)의 이름

REQUEST

Ο

요청(DescribeFeatureType)의 이름

VERSION

서비스의 버전

OUTPUTFORMAT

응답 포맷

TYPENAME

레이어명

표준 파라미터 이외에도, QGIS 서버는 다음과 같은 추가 파라미터를 지원합니다:

파라미터

필수 여부

설명

MAP

Ο

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 요청용 표준 파라미터:

파라미터

필수 여부

설명

SERVICE

Ο

서비스(WFS)의 이름

REQUEST

Ο

요청(Transaction)의 이름

VERSION

서비스의 버전

FILTER

OGC 필터 인코딩

BBOX

맵 범위

FEATUREID

피처를 ID로 필터링

TYPENAME

레이어명

표준 파라미터 이외에도, QGIS 서버는 다음과 같은 추가 파라미터를 지원합니다:

파라미터

필수 여부

설명

MAP

Ο

QGIS 프로젝트 파일

OPERATION

작업을 지정

EXP_FILTER

표현식 필터링

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>