2013-12-06 4 views
4

Как мне по-разному накладывать разные элементы слоя, в зависимости от значения атрибута?Geotools условный стиль, основанный на атрибуте

Например, у меня есть данные часового пояса, которые включают в себя атрибут, связывающий целое число от 1 до 8 в каждый часовой пояс, с целью раскрашивания часовых поясов на карте. Как связать стиль с каждым значением атрибута и использовать его для окраски часовых поясов в разных цветах?

ответ

2

Этот ответ на GeoTools 9,2

Ниже приведен пример, который вы можете принять, смотрите ниже некоторые идеи, как применить его к вашим требованиям.

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

protected final StyleFactory styleFactory = 
    CommonFactoryFinder.getStyleFactory(GeoTools.getDefaultHints()); 
protected final FilterFactory2 filterFactory = 
    CommonFactoryFinder.getFilterFactory2(); 

protected Rule createLayerRule 
    (Color outlineColor 
    , float strokeWidth 
    , Color fillColor 
    , float opacity 
    , Filter filter 
    , double minScaleDenominator 
    , double maxScaleDenominator) 
{ 
    Stroke stroke = 
     outlineColor != null 
    ? styleFactory.createStroke 
     (filterFactory.literal(outlineColor) 
     , filterFactory.literal(strokeWidth) 
     , filterFactory.literal(opacity)) 
    : null;//Stroke.NULL; 
    Fill fill = 
     fillColor != null 
    ? styleFactory.createFill 
     (filterFactory.literal(fillColor) 
     , filterFactory.literal(opacity)) 
    : null;//Fill.NULL; 

    PolygonSymbolizer symbolizer = 
    styleFactory.createPolygonSymbolizer(stroke, fill, null); 

    return createRule(filter, minScaleDenominator, maxScaleDenominator, symbolizer); 
} 

// IDs of visible features, programmatically updated. 
protected final Set<FeatureId> visibleFeatureIDs = new HashSet<FeatureId>(); 

// IDs of selected features, programmatically updated. 
protected final Set<FeatureId> selectedFeatureIDs = new HashSet<FeatureId>(); 

protected Style createLayerStyle() 
{ 
    Filter selectionFilter = filterFactory.id(selectedFeatureIDs); 
    Filter visibilityFilter = filterFactory.and 
    (Arrays.asList 
     (filterFactory.not 
      (selectionFilter) 
     , filterFactory.id(visibleFeatureIDs) 
     ) 
    ); 
    FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle 
    (new Rule[] 
     { 
     // hope constants below are self explaining 
     createLayerRule 
      (SELECTED_OUTLINE_COLOR 
      , STROKE_WIDTH_LARGE_SCALE 
      , SELECTED_FILL_COLOR 
      , SELECTED_OPACITY 
      , selectionFilter 
      , STYLE_SCALE_LIMIT 
      , Double.NaN) 
     , createLayerRule 
      (UNSELECTED_OUTLINE_COLOR 
      , STROKE_WIDTH_LARGE_SCALE 
      , UNSELECTED_FILL_COLOR 
      , UNSELECTED_OPACITY 
      , visibilityFilter 
      , STYLE_SCALE_LIMIT 
      , Double.NaN) 
     , createLayerRule 
      (SELECTED_OUTLINE_COLOR 
      , STROKE_WIDTH_SMALL_SCALE 
      , SELECTED_FILL_COLOR 
      , SELECTED_OPACITY 
      , selectionFilter 
      , Double.NaN 
      , STYLE_SCALE_LIMIT) 
     , createLayerRule 
      (UNSELECTED_OUTLINE_COLOR 
      , STROKE_WIDTH_SMALL_SCALE 
      , UNSELECTED_FILL_COLOR 
      , UNSELECTED_OPACITY 
      , visibilityFilter 
      , Double.NaN 
      , STYLE_SCALE_LIMIT) 
     } 
    ); 

    Style style = styleFactory.createStyle(); 
    style.featureTypeStyles().add(fts); 

    return style; 
} 

// layer creation 
FeatureLayer someMethode() 
{ 
    ... 
    FeatureLayer layer = new FeatureLayer 
    (dataStore.getFeatureSource() 
    , createLayerStyle() 
    , "Zipcodes" 
    ); 
    ... 
    return layer; 
} 

// style update if visible or selected features have changed 
void someOtherMethod(FeatureLayer layer) 
{ 
    ... // update selectedFeatureIDs or visibleFeatureIDs 
    layer.setStyle(createLayerStyle()); 
} 

конечно же оптимизации возможны и приветствуются.

Для вашего требования следующее может помочь:

  1. Вам необходимы 8 правил (см createRule (..) выше), если вы хотите иметь один стиль для всех шкал (или 16 для малых и больших масштабов).
  2. Определить 8 фильтров с использованием FilterFactory.equals(Expression, Expression), где первое выражение имеет тип AttributeExpressionImpl и второго типа LiteralExpressionImpl
  3. иметь в виду, что существует еще один метод equal (без с) в FilterFactory2
+0

Благодаря. Сложный процесс для простой концепции! – OpenSauce

+0

@OpenSauce Это немного легче, если у вас одинаковый стиль для всех весов. Возможно, есть еще один способ сделать его еще более легким. Однако в конце вы должны классифицировать свои функции в группы, которые должны быть по-разному окрашены ... и это то, что делают фильтры. – Claude

Смежные вопросы