Многоугольная метка повторяется для каждой плитки

10

Я использую автономный GeoWebCache для обслуживания тайлов с удаленного GeoServer. Моя проблема в том, что метка многоугольника добавляется к каждой из поданных плиток, а не только один раз в центроид многоугольника.

Я нашел пост, в котором обсуждается проблема:
http://osgeo-org.1560.n6.nabble.com/polygon-label-repeated-for-each-tile-td4995203.html

В первом ответе упоминается возможное решение:

«В общем, я предлагаю использовать движок рендеринга тайлов (GeoWebCache, MapProxy, TileCache) в любом случае, вместо того, чтобы запрашивать маленькое изображение из GeoServer, и чтобы потом рендеринг тайлов делал нарезку тайлов. У тебя будет меньше запросов к GeoServer ( 1 большое изображение вместо нескольких маленьких), что ускоряет общее время создания тайла ».

Проблема в том, что я не мог найти, как это сделать, ссылаясь на документацию GeoWebCache, и вышеупомянутый пост не объясняет, как это реализовать.

Я также нашел сообщение с ответом, которое ссылается на документацию GeoWebCache «Tiled» , но мой код уже использует все необходимые атрибуты, и все же метка появляется несколько раз:

var Layer_1874 = new OpenLayers.Layer.WMS(
    'Grundkort',
    '/wms10.ashx'
    , {
        format: 'image/png',
        srs: 'EPSG:25832',
        layers: 'ballerupkommune_grundkort_bk',
        tiled: true,
        tilesOrigin: '698804,6173460'
    }
    , {
        displayInLayerSwitcher: true,
        isBaseLayer: true,
        transitionEffect: 'resize',
        displayOutsideMaxExtent: true,
        visibility: false
    }
);

У кого-нибудь есть идея?

Ambran
источник
Можете ли вы показать нам файл SLD, который вы используете? Это определяет способ отображения меток на слое WMS.
катахдин

Ответы:

16

Ниже приведен пример правила SLD, которое размещает метку в центре геометрии объекта. При этом для размещения метки используется функция ogc: под названием «centroid». Вы можете прочитать больше о функциях SLD в документации GeoServer , и некоторые примеры приведены здесь .

<sld:Rule>
      <MaxScaleDenominator>5000</MaxScaleDenominator>
      <sld:TextSymbolizer>
        <sld:Geometry>
          <ogc:Function name="centroid">
            <ogc:PropertyName>the_geom</ogc:PropertyName>
          </ogc:Function>
        </sld:Geometry>
        <sld:Label>
          <ogc:PropertyName>LOT_NAME</ogc:PropertyName>
        </sld:Label>
        <sld:Font>
          <sld:CssParameter name="font-family">Arial</sld:CssParameter>
          <sld:CssParameter name="font-size">11</sld:CssParameter>
          <sld:CssParameter name="font-style">normal</sld:CssParameter>
          <sld:CssParameter name="font-weight">bold</sld:CssParameter>
        </sld:Font>
        <sld:LabelPlacement>
          <sld:PointPlacement>
            <sld:AnchorPoint>
              <sld:AnchorPointX>
                <ogc:Literal>0.0</ogc:Literal>
              </sld:AnchorPointX>
              <sld:AnchorPointY>
                <ogc:Literal>0.5</ogc:Literal>
              </sld:AnchorPointY>
            </sld:AnchorPoint>
            <sld:Rotation>
              <ogc:Literal>0</ogc:Literal>
            </sld:Rotation>
          </sld:PointPlacement>
        </sld:LabelPlacement>
        <sld:Halo>
          <sld:Radius>
            <ogc:Literal>1.0</ogc:Literal>
          </sld:Radius>
          <sld:Fill>
            <sld:CssParameter name="fill">#FFFFFF</sld:CssParameter>
          </sld:Fill>
        </sld:Halo>
        <sld:VendorOption name="conflictResolution">true</sld:VendorOption>
        <sld:VendorOption name="goodnessOfFit">0</sld:VendorOption>
        <sld:VendorOption name="autoWrap">60</sld:VendorOption>
      </sld:TextSymbolizer>
    </sld:Rule>

Кроме того, SLD Cookbook является отличным справочником. Одна вещь, которая может сбить вас с толку - это порядок тегов в SLD. Для правила TextSymbolizer, приведенного выше, вы можете увидеть необходимый порядок, посмотрев в определение схемы. Не волнуйся, это не так уж страшно! Просто найдите «textymbolizer» в этом файле .xsd, и вы легко найдете тег «sequence». Там вы обнаружите, что ссылки на элементы соответствуют порядку в моем примере. (Примечание: я не использовал атрибут «заливка» текстового символизатора, моя заливка относится только к гало.)

Katahdin
источник
1

Вычисление меток с разрешением коллизий (удаление меток или удаление меток с более низким приоритетом, чтобы они не перекрывались) требует знания каждой метки, которая может столкнуться с меткой, которую вы рисуете, каждой метки, которая может столкнуться с ними, и т. Д. , Итак, в общем, вам нужно либо вычислить все метки одновременно, просматривая каждую функцию, либо разбить карту на блоки с метками, вычисленными в каждом блоке.

По умолчанию GeoWebCache использует блок плиток 4x4, который называется «метафайл». Когда вы запрашиваете фрагмент, которого нет в кэше, GWC запрашивает весь метатиль как одно большое изображение из бэкэнда, а затем нарезает его на фрагменты, которые он кэширует. Вы можете отрегулировать коэффициент metatile при настройке слоя. Большие мета-метлы дают более привлекательные метки, но увеличивают задержку пропуска кэша. Если вы не используете разрешение коллизий меток на бэкэнде, вы можете установить метатилирование на 1x1.

Вы также можете указать GWC добавить желоб вокруг мета-элемента, который представляет собой дополнительное пространство, которое будет отрезано. Это рискованно делать, если у вас есть разрешение коллизий меток, так как метка может располагаться по-другому или даже полностью удаляться по другую сторону металической границы. Если у вас есть метки, которые полностью зафиксированы в положении и никогда не подавляются, чтобы избежать столкновения, вы можете использовать широкий желоб, чтобы метки могли пересекать границы листов. Это приведет к снижению производительности, так как GeoServer будет отображать большую плитку.

Вы можете установить метатилинг и водосток на вкладке Tile Layer конфигурации слоя, или значение по умолчанию, которое будет использоваться для новых слоев, может быть установлено на странице Caching Defaults.

Чтобы отключить разрешение конфликтов, вы можете использовать conflictResolutionопцию vendor в ваших стилях.

smithkm
источник