3.3. خدمة المعالم على الويب Web Feature Service (WFS)

يوفر معيارا WFS 1.0.0 و 1.1.0 المطبَّقان في QGIS Server واجهة HTTP للاستعلام عن المعالم الجغرافية من مشروع QGIS. يحدد طلب WFS النموذجي مشروع QGIS المراد استخدامه والطبقة المراد الاستعلام عنها.

مستندات المواصفات بحسب رقم إصدار الخدمة:

الطلبات القياسية التي يوفرها QGIS Server:

الطلب

وصف

GetCapabilities

يُرجع بيانات وصفية بصيغة XML تتضمن معلومات عن الخادم

GetFeature

يُرجع مجموعة مختارة من المعالم

DescribeFeatureType

يُرجع وصفًا لأنواع المعالم وخصائصها

Transaction

يتيح إدراج المعالم أو تحديثها أو حذفها

3.3.1. GetCapabilities

المعاملات القياسية للطلب GetCapabilities وفق مواصفات OGC WFS 1.0.0 و 1.1.0:

المعامل

إلزامي

وصف

SERVICE

نعم

اسم الخدمة (WFS)

REQUEST

نعم

اسم الطلب (GetCapabilities)

VERSION

لا

إصدار الخدمة

إضافة إلى المعاملات القياسية، يدعم QGIS Server المعاملات الإضافية التالية:

المعامل

إلزامي

وصف

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

المعاملات القياسية للطلب GetFeature وفق مواصفات OGC WFS 1.0.0 و 1.1.0:

المعامل

إلزامي

وصف

SERVICE

نعم

اسم الخدمة (WFS)

REQUEST

نعم

اسم الطلب (GetFeature)

VERSION

لا

إصدار الخدمة

TYPENAME

لا

أسماء الطبقات

FEATUREID

لا

تصفية المعالم حسب المعرّفات

OUTPUTFORMAT

لا

صيغة المخرجات

RESULTTYPE

لا

نوع النتيجة

PROPERTYNAME

لا

أسماء الخصائص المراد إرجاعها

MAXFEATURES

لا

الحد الأقصى لعدد المعالم المراد إرجاعها

SRSNAME

لا

نظام الإحداثيات المرجعي

FILTER

لا

ترميز المرشِّحات OGC Filter Encoding

BBOX

لا

امتداد الخريطة

SORTBY

لا

ترتيب النتائج

إضافة إلى المعاملات القياسية، يدعم QGIS Server المعاملات الإضافية التالية:

المعامل

إلزامي

وصف

MAP

نعم

ملف مشروع QGIS

STARTINDEX

لا

ترقيم الصفحات

GEOMETRYNAME

لا

نوع الشكل الهندسي المراد إرجاعه

EXP_FILTER

لا

التصفية بالتعبيرات

TYPENAME

يتيح هذا المعامل تحديد أسماء الطبقات، وهو إلزامي إذا لم يُضبط FEATUREID.

مثال على عنوان URL:

http://localhost/qgisserver?
SERVICE=WFS
&VERSION=1.1.0
&REQUEST=GetFeature
&TYPENAME=countries

FEATUREID

يتيح هذا المعامل تحديد معرّف معلم معين، ويُكتب بالشكل 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

يتيح هذا المعامل تصفية الاستجابة بلغة Filter Encoding المعرَّفة في معيار OGC Filter Encoding. على سبيل المثال:

http://localhost/qgisserver?
SERVICE=WFS&
REQUEST=GetFeature&
TYPENAME=places&
FILTER=<Filter><PropertyIsEqualTo><PropertyName>name</PropertyName><Literal>Paris</Literal></PropertyIsEqualTo></Filter>

في حالة تعدد أسماء الأنواع (typenames)، يجب وضع المرشِّحات بين أقواس:

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

لا يمكن استخدام المعامل FEATUREID مع BBOX. وأي محاولة لذلك ستؤدي إلى استثناء:

<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. ويُستخدم المحرف ; للفصل بين المرشِّحات في حالة تعدد أسماء الأنواع.

مثال على عنوان URL:

http://localhost/qgisserver?
SERVICE=WFS
&REQUEST=GetFeature
&TYPENAME=places,countries
&EXP_FILTER="name"='Paris';"name"='France'

3.3.3. DescribeFeatureType

المعاملات القياسية للطلب DescribeFeatureType وفق مواصفات OGC WFS 1.0.0 و 1.1.0:

المعامل

إلزامي

وصف

SERVICE

نعم

اسم الخدمة (WFS)

REQUEST

نعم

اسم الطلب (DescribeFeatureType)

VERSION

لا

إصدار الخدمة

OUTPUTFORMAT

لا

صيغة الاستجابة

TYPENAME

لا

أسماء الطبقات

إضافة إلى المعاملات القياسية، يدعم QGIS Server المعاملات الإضافية التالية:

المعامل

إلزامي

وصف

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.

المعاملات القياسية للطلب Transaction وفق مواصفات OGC WFS 1.0.0 و 1.1.0:

المعامل

إلزامي

وصف

SERVICE

نعم

اسم الخدمة (WFS)

REQUEST

نعم

اسم الطلب (Transaction)

VERSION

لا

إصدار الخدمة

FILTER

لا

ترميز المرشِّحات OGC Filter Encoding

BBOX

لا

امتداد الخريطة

FEATUREID

لا

تصفية المعالم حسب المعرّفات

TYPENAME

لا

أسماء الطبقات

إضافة إلى المعاملات القياسية، يدعم QGIS Server المعاملات الإضافية التالية:

المعامل

إلزامي

وصف

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>