Posso fazer um estilo personalizado no GeoServer


8

Quero usar o servidor GeoServer WMS para criar um estilo personalizado. Digamos que eu tenha uma área como polígono em um shapefile, mas não tenho a temperatura dessa área como um atributo. Em um serviço da web, coleto pontos de temperatura dentro dessa área. Agora, quero que o GeoServer colora essa área de acordo com esses pontos de temperatura dinâmicos.

Aqui está um exemplo:

Mapa de temperatura

Se possível, quero colocar essas bordas na imagem e algumas explicações sobre cores no lado direito. Como posso enviar esses pontos de temperatura para um GeoServer WMS. E posso fazer uma coloração personalizada de acordo com esses parâmetros dinâmicos?

Não sei como converter esses dados de ponto em cores da área.

Minha próxima pergunta é semelhante, mas sem pontos, posso colorir um polígono com atributos dinâmicos que não estão no shapefile.

Aqui está um exemplo que eu quero colorir esses polígonos de acordo com o tipo de produto, mas como pergunta anterior, esses tipos de produtos são reunidos dinamicamente.

insira a descrição da imagem aqui

Espero que isso seja possível.


A segunda opção funcionaria se você atribuir os polígonos corretamente - isso deve ser feito no banco de dados. O uso de um DLV (denominado descritor Camada) como o exemplo aqui - blog.geoserver.org/2010/04/09/sld-cookbook
Mapperz

o problema é que não tenho acesso de gravação ao db. então não posso adicionar um novo atributo para tipos de produtos na tabela. na verdade, existem muitos atributos que reuno dinamicamente que não estão na tabela original. portanto, criar uma nova coluna para cada um deles não é uma opção, eu acho. existe uma maneira dinâmica? ou se isso não for possível, preciso usar bibliotecas externas para esta operação? como sharpmap ou etc?
bahadir

tenha uma tabela intermediária à qual você tenha acesso de leitura / gravação. Se não criar seus próprios dados (postgis / postgres recomendado), você terá controle.
Mapperz

Respostas:


4

Na sua segunda pergunta :

Um SLD pode ser criado dinamicamente, o que significa que pode estilizar mapas usando dados dinâmicos. Para que isso funcione, é necessário conhecer os IDs dos polígonos que você está tentando estilizar e também alterar / expandir seu serviço da web.

Faça com que seu serviço web gere SLDs on-the-fly em vez de apenas retornar dados. Isso é bastante simples usando .NET, Java, PHP etc. O SLD que você gerar terá uma regra para cada faixa de cores que você deseja exibir. Cada regra identificará os polígonos aos quais a cor se aplica por seu ID. O bloco de filtro de cada regra conterá PropertyIsEqualTo 1 OR PropertyIsEqualTo 2 OR .... Cada regra estiliza seus polígonos com a cor que você escolheu para representar o valor. Você tem duas opções para dizer ao GeoServer para usar seu SLD dinâmico.

  1. Se o GeoServer tiver acesso HTTP ao seu serviço da web, você pode transmitir um URL codificado, por exemplo (JS) 'http://geoserver/wms?request=GetMap...&sld=' + encodeURIComponent('http://web-service/generateSLD?and=any-parameters-that-influence-sld-generation'). Quando o GeoServer recebe a solicitação do WMS, ele decodifica os parâmetros e consulta esse URL para o SLD. Da perspectiva do GeoServer, isso não é diferente de consultar um SLD estático mantido em um servidor de arquivos.
  2. Se o GeoServer não puder acessar seu serviço da Web, seu cliente deve primeiro solicitar ao SLD dinâmico o serviço da Web, depois passar o SLD para o GeoServer no parâmetro sld_body da solicitação do WMS. Cuidado com os limites de tamanho da URL impostos pelo seu cliente (por exemplo, um navegador) ou pelo seu servidor da web

Ambas as abordagens podem ser testadas usando um SLD estático criado para teste, para que você saiba o quão bem-sucedido isso é antes de se esforçar em seu serviço da web. As duas abordagens podem ser usadas para solicitar ao GeoServer o gráfico da legenda, que representará as mesmas regras (no entanto, se você usar a opção 1, é possível que os dados usados ​​para gerar seu SLD tenham mudado após a geração do mapa).

Penso que esta é a sua melhor opção para a pergunta 2.

Na sua primeira pergunta :

Os pontos de temperatura sempre representam os mesmos locais? Se sim, você pode descobrir com antecedência quais polígonos esses pontos de temperatura se enquadram? Se sim, você pode simplesmente reutilizar a abordagem descrita acima, com seu script de geração SLD convertendo pontos em IDs de polígonos.

EDIT Acabei de ver isso referenciado em outra pergunta: http://pypi.python.org/pypi/python-sld/


obrigado, e para a minha primeira pergunta eu descobri o plugin de mapas de ácido para geoserver, você tem alguma experiência sobre esse plugin?
bahadir

infelizmente não, mas diz "você pode usar uma camada de pontos WMS para gerar um mapa AMS". Isso me diz que você não apenas precisa instalar um plug-in no GeoServer, mas também o GeoServer precisa acessar os dados dos seus pontos para fornecê-lo como uma camada. Pela sua pergunta, presumi que você não tem capacidade de alterar a configuração do GeoServer.
tomfumb

na verdade, não tenho acesso ao banco de dados subjacente. Eu posso alterar a configuração do servidor geográfico. Mas mesmo com mapas ácidos, acho que preciso adicionar uma tabela ao db para obter dados de pontos. não dinâmica maneira ainda
bahadir

você tem outra opção, mas pode não ser fácil - se você pode configurar o GeoServer, significa que pode criar uma nova loja que leia a partir do WFS. Novamente, isso exige que o GeoServer tenha acesso HTTP ao seu serviço da Web, mas você pode servir seu próprio WFS representando seus pontos de dados. Dependendo do número de pontos que precisam ser transferidos, isso pode ser bastante lento. Além disso, se você não tiver um servidor de mapas ao seu lado, isso pode significar a codificação manual das respostas GML, o que não é agradável.
tomfumb

e se eu puder acessar o banco de dados, preciso coletar dados de serviços da web, inserir no db e fazer com que o geoserver extraia dados recém-inseridos do banco de dados?
bahadir

1

A resposta curta é - sim, é muito possível! Na verdade, existem várias maneiras de solucionar esse problema. Aqui está uma dessas maneiras em que consigo pensar.

Há duas partes para sua pergunta aqui.

1) Representar dados estáticos e dinâmicos provenientes de fontes externas no GeoServer.

Crie um grupo de camadas, diga "Mapa Regional", com 2 camadas. A camada 1 (estática) é o "Mapa regional - fornecido pelo seu banco de dados somente leitura ou a camada 2 do Shapefile (dinâmico) é o" clima "- que pode servir dados dinâmicos por meio do WMS em cascata. ao seu GeoServer, e você pode fornecer temperatura ou outros atributos dinâmicos chamando serviços remotos usando o protocolo que você usa - REST, SOAP, TCP etc.

Dessa forma, você pode adicionar atributos às camadas dinamicamente no futuro, sem adicionar itens ao DB.

2) Execute um estilo personalizado ** Sua melhor aposta aqui é usar o ** SLD (Style Layer Descriptor) . Há muita documentação sobre como estilizar usando o SLD. É muito poderoso! Você pode controlar o estilo usando cores, níveis de zoom, limites de valor (> 40C é vermelho,> 35 é laranja) e tem regras baseadas em valores de vários atributos e rótulos. O estilo está disponível para a maioria das geometrias - ponto, linha, área etc. Você pode usar editores de estilo como Atlas ou o editor que acompanha o OpenGeo - GeoExplorer, para testar várias condições de dados.

A vantagem dessa abordagem é que você pode controlar o estilo das camadas 1 e 2 independentemente um do outro. Você pode fazer lendas na sua interface do usuário (JavaScript), fora do GeoServer. O GeoServer mesclará todas as regras de estilo para produzir a sobreposição correta. Dependendo do desempenho obtido da camada e do Styling, você também pode adicionar uma solução de cache de blocos como GeoWebCache ou HTTP Cache como Varnish.

Felicidades,

Ramesh


obrigado, mas não tenho chance de criar novas tabelas ou camadas no geoserver.
quer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.