Страница 1 из 1
Фильры в SLD
Добавлено: 21 фев 2011, 12:40
drebedan
Привет.
Вывожу в <TextSymbolizer>:
Код: Выделить всё
<Label>
<ogc:PropertyName>streetdesc</ogc:PropertyName>
</Label>
Дело в том, что в "streetdesc" содержится строка типа "~[0x04]название" или "~[0x05]название".
Мне нужно вывести только "название", т.е. без "~[0x0*]". Подскажите, возможно ли это и как это сделать?
Может подскажите нормальные доки с примерами по ogc?
Re: Фильры в SLD
Добавлено: 21 фев 2011, 14:17
Mavka
Функции (functions) в спецификациях OGC определены только самые общие и мало. Реальные серверы часто дополняют их своими функциями. Поэтому напишу вариант для GeoServer, а вам придется адаптировать под свой продукт.
Попробуйте такой конструкт для GeoServer. Вырезает строку с заданной позиции:
Код: Выделить всё
<TextSymbolizer>
<Label>
<ogc:Function name="strSubstringStart">
<ogc:PropertyName>streetdesc</ogc:PropertyName>
<ogc:Literal>7</ogc:Literal>
</ogc:Function>
</Label>
...
</TextSymbolizer>
Есть еще strReplace с регэкспами (если у вас префикс переменной длины), но справка по ней приведена странная (вероятно, скопирована из предыдущей функции). Полный
список функций.
подскажите нормальные доки с примерами по ogc
Вот очень хороший справочник с картинками -
SLD Cookbook.
Re: Фильры в SLD
Добавлено: 21 фев 2011, 14:21
drebedan
Откопал такое решение:
Код: Выделить всё
<Label>
<ogc:Function name="strSubstring">
<ogc:PropertyName>streetdesc</ogc:PropertyName>
<ogc:Literal>7</ogc:Literal>
<ogc:Literal>11</ogc:Literal>
</ogc:Function>
</Label>
Но как быть, если строка длиннее 11 символов?
Нашел функцию strReplace, но не знаю как заставить ее работать.
Ну же, Гуру, где же вы?

Re: Фильры в SLD
Добавлено: 21 фев 2011, 14:22
drebedan
Mavka, спасибо за ответ. ты как всегда выручаешь

.
Re: Фильры в SLD
Добавлено: 21 фев 2011, 14:33
drebedan
Есть еще вопросы по этой теме.
Я пишу стиль, который применяется к нескольким слоям, но у одного из этих слоем нету поля "streetdesc", которое я вывожу в <Label>. Соответственно, при подключении этого слоя, все ломается и не работает. Как прописать в фильтре, что бы правило применялось только к слоям, у которых есть это поле?
Re: Фильры в SLD
Добавлено: 21 фев 2011, 15:36
Mavka
Расскажите подробнее, как вы пишете стиль для нескольких слоев сразу...
Re: Фильры в SLD
Добавлено: 21 фев 2011, 16:17
drebedan
Ну у меня несколько разных слоев есть, например два слоя - магистрали и развязки. для обоих слоев я хочу использовать один и тот же стиль. в геосервере задаю этот стиль обоим слоям. но проблема в том, что у слоя развязок нету поля "streetdesc", по которому делается выборка в SLD для отображения названия, поэтому данный стиль для слоя развязок не работает. Вот и хочется, что бы при рендеринге этого слоя геосервер не обращал внимания на правило в котором делается эта выборка.
Понятно, что можно создать отдельный файл стилей для каждого слоя, но если можно их объединить и не дублировать одинаковые правила, то лучше же так и сделать?

. да и для общего развития мне интересно как можно это реализовать.
Re: Фильры в SLD
Добавлено: 22 фев 2011, 10:11
Mavka
Мне видится только вариант, когда два набора данных можно различить по каким то другим атрибутам. Тогда в стиль вставить правило с фильтром:
Код: Выделить всё
<Rule>
<Filter xmlns:ogc="http://www.opengis.net/ogc">
<PropertyIsLessThan>
<PropertyName>diameter</PropertyName>
<Literal>1000</Literal>
</PropertyIsLessThan>
</Filter>
<TextSymbolizer>
<Label>
<Function name="strSubstringStart">
<PropertyName>streetdesc</PropertyName>
<Literal>7</Literal>
</Function>
</Label>
</TextSymbolizer>
</Rule>
Re: Фильры в SLD
Добавлено: 22 фев 2011, 19:33
drebedan
спасибо. к сожалению, такой вариант в моем случае не поможет. но, ничего страшного, сделал отдельный файл стилей для каждого слоя.