wiki:programmersguide/architecture/services/view

Version 3 (modified by vinicius.campanha, 9 years ago) (diff)

--

View Service

O objetivo do serviço é desenhar dados, vetoriais, pontuais ou GRADS, de acordo com a ordem e estilo cadastradas, possibilitando salvá-as em arquivo ou publicá-las no GeoServer?.

Dados contidos em uma View:

struct View
{
  std::string viewName                  = "";
  ViewId id                             = 0;    //!< View unique identification.
  ProjectId projectId                   = 0;    //!< Identification of the project owner of the view.
  ServiceInstanceId serviceInstanceId   = 0;    //!< View service instace where the view should be executed.

  bool active                           = false;//!< Flag if the view is active.

  std::vector< DataSeriesId > dataSeriesList;                                               //!< Ordened list of DataSeries ID that compose this view
  std::unordered_map< DataSeriesId, terrama2::core::Filter > filtersPerDataSeries;          //!< List of filters by DataSeries ID
  std::unordered_map< DataSeriesId, std::unique_ptr<te::se::Style> > stylesPerDataSeries;   //!< List of base styles by DataSeries ID.

  terrama2::core::Schedule schedule;  //!< terrama2::core::Schedule of execution of the view.

  // Parameters to generate a image
  std::string imageName           = "";
  te::map::ImageType imageType    = te::map::ImageType(1);
  uint32_t imageResolutionWidth   = 0;    //!< Width resolution of view in pixels
  uint32_t imageResolutionHeight  = 0;    //!< Height resolution of view in pixels

  uint32_t srid                   = 0;    //!< SRID to aplly in view

  // Parameter to register view in GeoServer
  te::core::URI maps_server_uri;
};

Modelo JSON da View:

{
  "class"                  : "View",
  "name"                   : "viewName",
  "id"                     : viewID,
  "project_id"             : projectId,
  "service_instance_id"    : serviceInstanceId,
  "active"                 : active,
  "dataseries_id"          : ID,
  "style"                  : "style",
  "legend": LEGEND
  "schedule"               : SCHEDULE

# Serão implementados no futuro:

  "imageName"               : "imageName",
  "imageType"               : imageType,
  "imageResolutionWidth"    : imageResolutionWidth,
  "imageResolutionHeight"   : imageResolutionHeight,  
  "srid"                    : srid
}

Modelo JSON da legenda:

{
  "class": "Legend",
  "column": string, // optional
  "styles":  Layer[]
  
}

Modelo JSON Layer:

{
  "nun_layer": int
  "colors": COLOR[]
}

Modelo JSON Cor:

{
  "title": string,
  "value": string,
  "color": string #Hex representation
}

Cadastro no GeoServer?

O serviço permite que os dados sejam cadastrados em um servidor GeoServer?. Para isso é necessário informar o endereço do servidor em geoserverURI.

Resposta do serviço de View

Quando o serviço de view termina de realizar um cadastro no GeoServer?, ele retorna infromações sobre o quê foi cadastrado e em que local.

A resposta vem em um JSON no seguinte formato:

{
  "class"             : "RegisteredViews",
  "view_id"           : viewID,
  "maps_server_uri"   : "URI",
  "workspace"         : "workspace",
  "style"             : "styleName",
  "layers_list"       : [
                          "layer1",
                          "layer2",
                          "..."
                        ]  
}

Geração de imagem

Para desenhar a TerraLib? utiliza o te::map::DataSetLayer?, mas ele requer um Data Source para buscar o dataset. Como o serviço já recebe o dataset, ele está usando duas outras classes para o desenho:

MemoryDataSetLayer?

Um layer que não depende de um Data Source, ele já contem o dataset que será desenhado.

MemoryDataSetRenderer?

Método draw utiliza o dataset já contido no MemoryDataSetLayer?, não precisa de consulta em um Data Source.

Estilo de desenho

Os estilos de desenhosão definidos em:

stylesPerDataSeries - Está definindo o estilo para cada dataset

Rules

Com o te::se::Rule é possível configurar, além do estilo padrão, estilos baseados em valores de uma propriedade do layer.

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<StyledLayerDescriptor version="1.1.0"
	xmlns="http://www.opengis.net/sld"
	xmlns:ogc="http://www.opengis.net/ogc"
	xmlns:se="http://www.opengis.net/se"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd">
	<NamedLayer>
		<se:Name>Layer</se:Name>
		<UserStyle>
			<se:Name>Style</se:Name>
			<se:FeatureTypeStyle version="1.1.0">
				<se:Name>Style 1</se:Name>
				<se:Rule>
					<se:PolygonSymbolizer version="1.1.0">
						<se:Fill>
							<se:SvgParameter name="fill">
								<ogc:Literal>#00c290</ogc:Literal>
							</se:SvgParameter>
							<se:SvgParameter name="fill-opacity">
								<ogc:Literal>0.9</ogc:Literal>
							</se:SvgParameter>
						</se:Fill>
						<se:Stroke>
							<se:SvgParameter name="stroke">
								<ogc:Literal>#000000</ogc:Literal>
							</se:SvgParameter>
							<se:SvgParameter name="stroke-width">
								<ogc:Literal>1</ogc:Literal>
							</se:SvgParameter>
						</se:Stroke>
					</se:PolygonSymbolizer>
				</se:Rule>
				<se:Rule>
					<ogc:Filter>
						<ogc:PropertyIsEqualTo>
							<ogc:PropertyName>RESULT</ogc:PropertyName>
							<ogc:Literal>1</ogc:Literal>
						</ogc:PropertyIsEqualTo>
					</ogc:Filter>
					<se:PolygonSymbolizer version="1.1.0">
						<se:Fill>
							<se:SvgParameter name="fill">
								<ogc:Literal>#000080</ogc:Literal>
							</se:SvgParameter>
							<se:SvgParameter name="fill-opacity">
								<ogc:Literal>0.9</ogc:Literal>
							</se:SvgParameter>
						</se:Fill>
						<se:Stroke>
							<se:SvgParameter name="stroke">
								<ogc:Literal>#000000</ogc:Literal>
							</se:SvgParameter>
							<se:SvgParameter name="stroke-width">
								<ogc:Literal>1</ogc:Literal>
							</se:SvgParameter>
						</se:Stroke>
					</se:PolygonSymbolizer>
				</se:Rule>
				<se:Rule>
					<ogc:Filter>
						<ogc:PropertyIsEqualTo>
							<ogc:PropertyName>RESULT</ogc:PropertyName>
							<ogc:Literal>2</ogc:Literal>
						</ogc:PropertyIsEqualTo>
					</ogc:Filter>
					<se:PolygonSymbolizer version="1.1.0">
						<se:Fill>
							<se:SvgParameter name="fill">
								<ogc:Literal>#fdcc00</ogc:Literal>
							</se:SvgParameter>
							<se:SvgParameter name="fill-opacity">
								<ogc:Literal>0.9</ogc:Literal>
							</se:SvgParameter>
						</se:Fill>
						<se:Stroke>
							<se:SvgParameter name="stroke">
								<ogc:Literal>#000000</ogc:Literal>
							</se:SvgParameter>
							<se:SvgParameter name="stroke-width">
								<ogc:Literal>1</ogc:Literal>
							</se:SvgParameter>
						</se:Stroke>
					</se:PolygonSymbolizer>
				</se:Rule>
				<se:Rule>
					<ogc:Filter>
						<ogc:PropertyIsEqualTo>
							<ogc:PropertyName>RESULT</ogc:PropertyName>
							<ogc:Literal>3</ogc:Literal>
						</ogc:PropertyIsEqualTo>
					</ogc:Filter>
					<se:PolygonSymbolizer version="1.1.0">
						<se:Fill>
							<se:SvgParameter name="fill">
								<ogc:Literal>#ff7400</ogc:Literal>
							</se:SvgParameter>
							<se:SvgParameter name="fill-opacity">
								<ogc:Literal>0.9</ogc:Literal>
							</se:SvgParameter>
						</se:Fill>
						<se:Stroke>
							<se:SvgParameter name="stroke">
								<ogc:Literal>#000000</ogc:Literal>
							</se:SvgParameter>
							<se:SvgParameter name="stroke-width">
								<ogc:Literal>1</ogc:Literal>
							</se:SvgParameter>
						</se:Stroke>
					</se:PolygonSymbolizer>
				</se:Rule>
				<se:Rule>
					<ogc:Filter>
						<ogc:PropertyIsEqualTo>
							<ogc:PropertyName>RESULT</ogc:PropertyName>
							<ogc:Literal>4</ogc:Literal>
						</ogc:PropertyIsEqualTo>
					</ogc:Filter>
					<se:PolygonSymbolizer version="1.1.0">
						<se:Fill>
							<se:SvgParameter name="fill">
								<ogc:Literal>#FF0000</ogc:Literal>
							</se:SvgParameter>
							<se:SvgParameter name="fill-opacity">
								<ogc:Literal>0.9</ogc:Literal>
							</se:SvgParameter>
						</se:Fill>
						<se:Stroke>
							<se:SvgParameter name="stroke">
								<ogc:Literal>#000000</ogc:Literal>
							</se:SvgParameter>
							<se:SvgParameter name="stroke-width">
								<ogc:Literal>1</ogc:Literal>
							</se:SvgParameter>
						</se:Stroke>
					</se:PolygonSymbolizer>
				</se:Rule>
			</se:FeatureTypeStyle>
		</UserStyle>
	</NamedLayer>
</StyledLayerDescriptor>

Grouping

Utilizando o te::map::Grouping foi possível criar estilos separados, baseados no valor de uma propriedade do layer. Mas, ao serializá-lo, suas tags não foram aceitas pelo GeoServer?.

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<te_map:Grouping
	xmlns:te_map="http://www.w3.org/2000/xmlns/se"
	xmlns:ogc="http://www.opengis.net/ogc"
	xmlns:se="http://www.opengis.net/se">
	<te_map:PropertyName>RESULT</te_map:PropertyName>
	<te_map:PropertyDataType>-187566072</te_map:PropertyDataType>
	<te_map:Type>EQUAL_STEPS</te_map:Type>
	<te_map:Precision>6</te_map:Precision>
	<te_map:Summary>AVERAGE</te_map:Summary>
	<te_map:GroupingItem>
		<te_map:Title>-1 - 1</te_map:Title>
		<te_map:From>-1</te_map:From>
		<te_map:To>1</te_map:To>
		<se:PolygonSymbolizer version="1.1.0">
			<se:Fill>
				<se:SvgParameter name="fill">
					<ogc:Literal>#f08080</ogc:Literal>
				</se:SvgParameter>
				<se:SvgParameter name="fill-opacity">
					<ogc:Literal>1.0</ogc:Literal>
				</se:SvgParameter>
			</se:Fill>
			<se:Stroke>
				<se:SvgParameter name="stroke">
					<ogc:Literal>#000000</ogc:Literal>
				</se:SvgParameter>
				<se:SvgParameter name="stroke-width">
					<ogc:Literal>1</ogc:Literal>
				</se:SvgParameter>
			</se:Stroke>
		</se:PolygonSymbolizer>
	</te_map:GroupingItem>
	<te_map:GroupingItem>
		<te_map:Title>1 - 2</te_map:Title>
		<te_map:From>1</te_map:From>
		<te_map:To>2</te_map:To>
		<se:PolygonSymbolizer version="1.1.0">
			<se:Fill>
				<se:SvgParameter name="fill">
					<ogc:Literal>#174a63</ogc:Literal>
				</se:SvgParameter>
				<se:SvgParameter name="fill-opacity">
					<ogc:Literal>1.0</ogc:Literal>
				</se:SvgParameter>
			</se:Fill>
			<se:Stroke>
				<se:SvgParameter name="stroke">
					<ogc:Literal>#000000</ogc:Literal>
				</se:SvgParameter>
				<se:SvgParameter name="stroke-width">
					<ogc:Literal>1</ogc:Literal>
				</se:SvgParameter>
			</se:Stroke>
		</se:PolygonSymbolizer>
	</te_map:GroupingItem>
	<te_map:GroupingItem>
		<te_map:Title>2 - 2</te_map:Title>
		<te_map:From>2</te_map:From>
		<te_map:To>2</te_map:To>
		<se:PolygonSymbolizer version="1.1.0">
			<se:Fill>
				<se:SvgParameter name="fill">
					<ogc:Literal>#ffa700</ogc:Literal>
				</se:SvgParameter>
				<se:SvgParameter name="fill-opacity">
					<ogc:Literal>1.0</ogc:Literal>
				</se:SvgParameter>
			</se:Fill>
			<se:Stroke>
				<se:SvgParameter name="stroke">
					<ogc:Literal>#000000</ogc:Literal>
				</se:SvgParameter>
				<se:SvgParameter name="stroke-width">
					<ogc:Literal>1</ogc:Literal>
				</se:SvgParameter>
			</se:Stroke>
		</se:PolygonSymbolizer>
	</te_map:GroupingItem>
	<te_map:GroupingItem>
		<te_map:Title>2 - 3</te_map:Title>
		<te_map:From>2</te_map:From>
		<te_map:To>3</te_map:To>
		<se:PolygonSymbolizer version="1.1.0">
			<se:Fill>
				<se:SvgParameter name="fill">
					<ogc:Literal>#ff0066</ogc:Literal>
				</se:SvgParameter>
				<se:SvgParameter name="fill-opacity">
					<ogc:Literal>1.0</ogc:Literal>
				</se:SvgParameter>
			</se:Fill>
			<se:Stroke>
				<se:SvgParameter name="stroke">
					<ogc:Literal>#000000</ogc:Literal>
				</se:SvgParameter>
				<se:SvgParameter name="stroke-width">
					<ogc:Literal>1</ogc:Literal>
				</se:SvgParameter>
			</se:Stroke>
		</se:PolygonSymbolizer>
	</te_map:GroupingItem>
	<te_map:GroupingItem>
		<te_map:Title>3 - 5</te_map:Title>
		<te_map:From>3</te_map:From>
		<te_map:To>5</te_map:To>
		<se:PolygonSymbolizer version="1.1.0">
			<se:Fill>
				<se:SvgParameter name="fill">
					<ogc:Literal>#9500d8</ogc:Literal>
				</se:SvgParameter>
				<se:SvgParameter name="fill-opacity">
					<ogc:Literal>1.0</ogc:Literal>
				</se:SvgParameter>
			</se:Fill>
			<se:Stroke>
				<se:SvgParameter name="stroke">
					<ogc:Literal>#000000</ogc:Literal>
				</se:SvgParameter>
				<se:SvgParameter name="stroke-width">
					<ogc:Literal>1</ogc:Literal>
				</se:SvgParameter>
			</se:Stroke>
		</se:PolygonSymbolizer>
	</te_map:GroupingItem>
</te_map:Grouping>