Можете ли вы повторно использовать фрагменты XML (в некотором роде переменных / ссылок)? - PullRequest
1 голос
/ 13 января 2009

Я использую SLD для стилевого вывода моего геосервера. У меня есть пара типов объектов для отображения. Каждый тип имеет разные значки, но текстовое описание генерируется из одной и той же информации (текстовое поле в базе данных). Я не могу использовать object_type в качестве имени изображения, потому что вы не можете использовать переменную в имени изображения (или я не знаю, как это сделать ...). Так что у меня SLD вроде (без неважных деталей):

<StyledLayerDescriptor>
  <NamedLayer>
    <UserStyle>
      <FeatureTypeStyle>
        <Rule>
          <Filter>
            <PropertyIsEqualTo>
              <PropertyName>object_type</PropertyName>
              <Literal>1</Literal>
            </PropertyIsEqualTo>
          </Filter>
          <PointSymbolizer>
            <Graphic>
              <ExternalGraphic>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/1.png" />
                <Format>image/png</Format>
              </ExternalGraphic>
              <Size>16</Size>
              <Opacity>1</Opacity>
            </Graphic>
          </PointSymbolizer>
          <TextSymbolizer>
            <Label>
              <ogc:PropertyName>name</ogc:PropertyName>
            </Label>
            <Font>
              <CssParameter name="font-family">Times New Roman</CssParameter>
              <CssParameter name="font-style">Normal</CssParameter>
              <CssParameter name="font-size">12</CssParameter>
            </Font>
            <Fill>
              <CssParameter name="fill">#110011</CssParameter>
              <CssParameter name="fill-opacity">1</CssParameter>
            </Fill>
            <Halo />
          </TextSymbolizer>
        </Rule>

        <Rule>
          <Filter>
            <PropertyIsEqualTo>
              <PropertyName>object_type</PropertyName>
              <Literal>2</Literal>
            </PropertyIsEqualTo>
          </Filter>
          <PointSymbolizer>
            <Graphic>
              <ExternalGraphic>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/2.png" />
                <Format>image/png</Format>
              </ExternalGraphic>
              <Size>16</Size>
              <Opacity>1</Opacity>
            </Graphic>
          </PointSymbolizer>
          <TextSymbolizer>
            <Label>
              <ogc:PropertyName>name</ogc:PropertyName>
            </Label>
            <Font>
              <CssParameter name="font-family">Times New Roman</CssParameter>
              <CssParameter name="font-style">Normal</CssParameter>
              <CssParameter name="font-size">12</CssParameter>
            </Font>
            <Fill>
              <CssParameter name="fill">#110011</CssParameter>
              <CssParameter name="fill-opacity">1</CssParameter>
            </Fill>
            <Halo />
          </TextSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

И я хотел бы написать один раз TextSymbolizer и использовать его в двух или более местах ... Я не слышал ничего подобного в XML, но, возможно, у вас есть? : -)

Одно решение, которое приходит ко мне, - это написать очень простой генератор (xml.erb?: P) и позволить ему генерировать XML ...

Ответы [ 3 ]

1 голос
/ 23 января 2009

XML включает в себя? http://www.xml.com/pub/a/2002/07/31/xinclude.html

1 голос
/ 29 сентября 2010

Расширение GeoServer «Dynamic Symbolizer» для SLD позволяет использовать свойства базы данных как все или часть URL-адресов значков. Вы можете даже выполнять вычисления и вызывать функции фильтра, если хотите (они используют встроенный CQL в URL.

Вот сообщение в блоге об этой функции: http://blog.geoserver.org/2008/12/08/dynamic-symbolizers-part-1/

1 голос
/ 13 января 2009

Вы пытались определить XML-схему или, необязательно, XML DTD для вашего XML, а затем использовать идентификаторы элементов http://www.w3.org/TR/xmlschema-0/#schemaConstraintsVsXML1, что-то вроде:



<StyledLayerDescriptor>
  <NamedLayer>
    <CommonStyles>
      <TextSymbolizer id="name_times_normal_12">
        <Label>
          <ogc:PropertyName>name</ogc:PropertyName>
        </Label>
        <Font>
          <CssParameter name="font-family">Times New Roman</CssParameter>
          <CssParameter name="font-style">Normal</CssParameter>
          <CssParameter name="font-size">12</CssParameter>
        </Font>
        <Fill>
          <CssParameter name="fill">#110011</CssParameter>
          <CssParameter name="fill-opacity">1</CssParameter>
        </Fill>
        <Halo />
      </TextSymbolizer>
    </CommonStyles>
    <UserStyle>
      <FeatureTypeStyle>
        <Rule>
          <Filter>
            <PropertyIsEqualTo>
              <PropertyName>object_type</PropertyName>
              <Literal>1</Literal>
            </PropertyIsEqualTo>
          </Filter>
          <PointSymbolizer>
            <Graphic>
              <ExternalGraphic>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/1.png" />
                <Format>image/png</Format>
              </ExternalGraphic>
              <Size>16</Size>
              <Opacity>1</Opacity>
            </Graphic>
          </PointSymbolizer>
          <TextSymbolizer ref="#name_times_normal_12" />
        </Rule>
        <Rule>
          <Filter>
            <PropertyIsEqualTo>
              <PropertyName>object_type</PropertyName>
              <Literal>2</Literal>
            </PropertyIsEqualTo>
          </Filter>
          <PointSymbolizer>
            <Graphic>
              <ExternalGraphic>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/2.png" />
                <Format>image/png</Format>
              </ExternalGraphic>
              <Size>16</Size>
              <Opacity>1</Opacity>
            </Graphic>
          </PointSymbolizer>
          <TextSymbolizer ref="#name_times_normal_12" />
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

...