Страница 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
спасибо. к сожалению, такой вариант в моем случае не поможет. но, ничего страшного, сделал отдельный файл стилей для каждого слоя.