Выполняет 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>