Фильры в SLD

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
drebedan
Интересующийся
Сообщения: 22
Зарегистрирован: 25 дек 2010, 19:43
Репутация: 0

Фильры в SLD

Сообщение drebedan » 21 фев 2011, 12:40

Привет.
Вывожу в <TextSymbolizer>:

Код: Выделить всё

<Label>
  <ogc:PropertyName>streetdesc</ogc:PropertyName>
</Label>
Дело в том, что в "streetdesc" содержится строка типа "~[0x04]название" или "~[0x05]название".
Мне нужно вывести только "название", т.е. без "~[0x0*]". Подскажите, возможно ли это и как это сделать?

Может подскажите нормальные доки с примерами по ogc?

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: Фильры в SLD

Сообщение Mavka » 21 фев 2011, 14:17

Функции (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.
Последний раз редактировалось Mavka 21 фев 2011, 14:29, всего редактировалось 1 раз.
лангольеры под окном жрали время ом-ном-ном

drebedan
Интересующийся
Сообщения: 22
Зарегистрирован: 25 дек 2010, 19:43
Репутация: 0

Re: Фильры в SLD

Сообщение drebedan » 21 фев 2011, 14:21

Откопал такое решение:

Код: Выделить всё

			<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, но не знаю как заставить ее работать.
Ну же, Гуру, где же вы? :)

drebedan
Интересующийся
Сообщения: 22
Зарегистрирован: 25 дек 2010, 19:43
Репутация: 0

Re: Фильры в SLD

Сообщение drebedan » 21 фев 2011, 14:22

Mavka, спасибо за ответ. ты как всегда выручаешь :).

drebedan
Интересующийся
Сообщения: 22
Зарегистрирован: 25 дек 2010, 19:43
Репутация: 0

Re: Фильры в SLD

Сообщение drebedan » 21 фев 2011, 14:33

Есть еще вопросы по этой теме.

Я пишу стиль, который применяется к нескольким слоям, но у одного из этих слоем нету поля "streetdesc", которое я вывожу в <Label>. Соответственно, при подключении этого слоя, все ломается и не работает. Как прописать в фильтре, что бы правило применялось только к слоям, у которых есть это поле?

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: Фильры в SLD

Сообщение Mavka » 21 фев 2011, 15:36

Расскажите подробнее, как вы пишете стиль для нескольких слоев сразу...
лангольеры под окном жрали время ом-ном-ном

drebedan
Интересующийся
Сообщения: 22
Зарегистрирован: 25 дек 2010, 19:43
Репутация: 0

Re: Фильры в SLD

Сообщение drebedan » 21 фев 2011, 16:17

Ну у меня несколько разных слоев есть, например два слоя - магистрали и развязки. для обоих слоев я хочу использовать один и тот же стиль. в геосервере задаю этот стиль обоим слоям. но проблема в том, что у слоя развязок нету поля "streetdesc", по которому делается выборка в SLD для отображения названия, поэтому данный стиль для слоя развязок не работает. Вот и хочется, что бы при рендеринге этого слоя геосервер не обращал внимания на правило в котором делается эта выборка.

Понятно, что можно создать отдельный файл стилей для каждого слоя, но если можно их объединить и не дублировать одинаковые правила, то лучше же так и сделать? :). да и для общего развития мне интересно как можно это реализовать.

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: Фильры в SLD

Сообщение Mavka » 22 фев 2011, 10:11

Мне видится только вариант, когда два набора данных можно различить по каким то другим атрибутам. Тогда в стиль вставить правило с фильтром:

Код: Выделить всё

<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> 
лангольеры под окном жрали время ом-ном-ном

drebedan
Интересующийся
Сообщения: 22
Зарегистрирован: 25 дек 2010, 19:43
Репутация: 0

Re: Фильры в SLD

Сообщение drebedan » 22 фев 2011, 19:33

спасибо. к сожалению, такой вариант в моем случае не поможет. но, ничего страшного, сделал отдельный файл стилей для каждого слоя.

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя