LayerExecSQL (ZWS)

Выполняет SQL запрос к слою или нескольким слоям ZuluGIS.

Для выполнения SQL-запросов, требующих взаимодействия с несколькими слоями (например, для пространственных запросов), в команде LayerExecSQL предусмотрен специальный синтаксис для указания слоев внутри запроса. Для указания слоев в тексте SQL-запроса используются плейсхолдеры вида:

${layer[пространство_имен:имя_слоя]}

В таком случае, имена слоев указывается вместе с пространством имен в формате namespace:layername (пространство_имен:имя_слоя).

Схема запроса

<xs:complexType name="typeLayerExecSQL">
    <xs:all>
        <xs:element name="Layer" type="typeLayer" minOccurs="0"/>
        <xs:element name="Query" type="xs:string"/>
        <xs:element name="CRS" type="typeCRS" minOccurs="0" maxOccurs="1" default="EPSG:3857"/>
    </xs:all>
</xs:complexType>

Схема ответа

<xs:complexType name="typeLayerExecSQLResponse">
    <xs:sequence>
        <xs:element name="Records" type="typeRecords" minOccurs="0"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="typeField">
    <xs:sequence>
        <xs:element name="Name" type="xs:string"/>
        <xs:element name="Value" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="typeRecord">
    <xs:sequence>
        <xs:element name="Field" type="typeField" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="typeRecords">
    <xs:sequence>
        <xs:element name="Record" type="typeRecord" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>     

Примеры запросов и ответов

Пример 1

Запрос к слою, например "Найти в слое riga:teplo объекты с идентификатором 143 и 3378, и для каждого из них вернуть его ID и геометрию в текстовом формате":

<?xml version="1.0" encoding="UTF-8"?>
<zulu-server service="zws" version="1.0.0">
    <Command>
        <LayerExecSql>
            <!-- 1. Указываем слой -->
            <Layer>riga:teplo</Layer>
            
            <!-- 2. SQL-запрос без FROM, он неявно относится к слою из тега <Layer> -->
            <Query>
                SELECT Sys, Geometry.AsText() 
                WHERE Sys=143 OR Sys=3378
            </Query>
        </LayerExecSql>
    </Command>
</zulu-server>
   

Где:

  • Layer — имя созданного слоя вместе с пространством имен. Указывается в формате namespace:layername (пространство_имен:имя_слоя).

  • Query — текст SQL запроса.

    [Примечание]Примечание

    Обратите внимание, в этом запросе отсутствует указание слоя с помощью FROM.

В результате выполнения этого запроса вы получите две записи (если объекты с такими ID существуют), каждая из которых будет содержать ID и координаты в виде текста.

Результат:

<zwsResponse>
    <LayerExecSql>
        <Records>
            <!-- Первая найденная запись (объект с Sys=143) -->
            <Record>
                <Field>
                    <Name>Sys</Name>
                    <Value>143</Value>
                </Field>
                <Field>
                    <Name>Geometry</Name>
                    <Value>POINT(56.95237683334503 24.03602916212978)</Value>
                </Field>
            </Record>
            
            <!-- Вторая найденная запись (объект с Sys=3378) -->
            <Record>
                <Field>
                    <Name>Sys</Name>
                    <Value>3378</Value>
                </Field>
                <Field>
                    <Name>Geometry</Name>
                    <Value>LINESTRING(56.96114198632733 24.03543016538373, ...)</Value>
                </Field>
            </Record>
        </Records>
    </LayerExecSql>
    
    <!-- Общее количество найденных записей -->
    <RetVal>2</RetVal> 
</zwsResponse>

Где:

  • Layer — имя созданного слоя вместе с пространством имен. Возвращается в формате namespace:layername (пространство_имен:имя_слоя).

  • RetValкод ответа со статусом выполнения операции или количеством записей в ответе:

    • значение меньше 0ошибка.

    • 0 — операция выполнена успешно, но количество записей в результате запроса равно 0.

    • значение больше 0 — количество полученных записей.

Пример 2 с несколькими слоями

Например, у вас есть несколько слоев: здания (riga:buildings) и теплосети (riga:teplo), и вы хотите найти все здания, через которые проходит конкретный участок теплотрассы (объект с Sys=143 из слоя riga:teplo).

<?xml version="1.0" encoding="UTF-8"?>
<zulu-server service="zws" version="1.0.0">
    <Command>
        <LayerExecSql>
            <!-- 
                Слои 'riga:buildings' и 'riga:teplo' определяются прямо в запросе.
                'B' и 'T' — это SQL-алиасы для удобства.
            -->
            <Query>
                SELECT 
                    B.Sys AS BuildingSys, 
                    B.Address, 
                    T.Sys AS TeploSys
                FROM 
                    ${layer[riga:buildings]} AS B, 
                    ${layer[riga:teplo]} AS T
                WHERE 
                    T.Sys = 143 
                    AND B.geometry.Intersects(T.geometry)
            </Query>
            <CRS>EPSG:4326</CRS>
        </LayerExecSql>
    </Command>
</zulu-server>

Где:

  • Query — текст SQL запроса.

  • CRS — система координат (Coordinate Reference System) слоя или слоев.

В результате выполнения такого запроса мы получим список всех зданий, которые пересекает теплотрасса с ID 143.

<?xml version="1.0" encoding="UTF-8"?>
<zwsResponse>
    <LayerExecSql>
        <Records>
            <!-- Первое здание -->
            <Record>
                <Field><Name>BuildingSys</Name><Value>501</Value></Field>
                <Field><Name>Address</Name><Value>Улица Пирога, 12</Value></Field>
                <Field><Name>TeploSys</Name><Value>143</Value></Field>
            </Record>
            <!-- Второе здание -->
            <Record>
                <Field><Name>BuildingSys</Name><Value>502</Value></Field>
                <Field><Name>Address</Name><Value>Улица Пирога, 14</Value></Field>
                <Field><Name>TeploSys</Name><Value>143</Value></Field>
            </Record>
        </Records>
    </LayerExecSql>
    <RetVal>2</RetVal> <!-- Найдено 2 здания -->
</zwsResponse>