¿Puedo hacer un estilo personalizado en GeoServer?

8

Quiero usar el servidor GeoServer WMS para un estilo personalizado. Digamos que tengo un área como polígono en un archivo de forma, pero no tengo la temperatura de esta área como un atributo. Desde un servicio web obtengo puntos de temperatura dentro de esa área. Ahora quiero que GeoServer coloree esta área de acuerdo con estos puntos de temperatura dinámicos.

Aquí hay un ejemplo:

Mapa de temperatura

Si es posible, incluso quiero colocar estos bordes en la imagen y algunas explicaciones sobre los colores en el lado derecho. ¿Cómo puedo enviar estos puntos de temperatura a un GeoServer WMS? ¿Y puedo hacer un color personalizado de acuerdo con estos parámetros dinámicos?

No sé cómo convertir estos datos de puntos a colores de área.

Mi siguiente pregunta es similar pero sin puntos, ¿puedo colorear un polígono con atributos dinámicos que no está en el archivo de forma.

Aquí hay un ejemplo que quiero colorear estos polígonos de acuerdo con su tipo de producto, pero como pregunta anterior, estos tipos de productos se recopilan dinámicamente.

ingrese la descripción de la imagen aquí

Espero que esto sea posible.

bahadir
fuente
La segunda opción funcionaría si atribuye los polígonos correctamente, esto debe hacerse en la base de datos. El uso de un SLD (Descriptor de capa con estilo) como el ejemplo aquí - blog.geoserver.org/2010/04/09/sld-cookbook
Mapperz
El problema es que no tengo acceso de escritura a DB. así que no puedo agregar un nuevo atributo para los tipos de productos a la tabla. En realidad, hay muchos atributos que recopilo dinámicamente que no están en la tabla original. Supongo que crear una nueva columna para cada uno de ellos no es una opción. ¿hay una forma dinámica? o si esto no es posible, ¿necesito usar bibliotecas externas para esta operación? como Sharpmap o etc.
bahadir
tener una tabla de etapas en la que tenga acceso de lectura / escritura. Si no crea sus propios databae (se recomiendan postgis / postgres), entonces tiene el control.
Mapperz

Respuestas:

4

En su segunda pregunta :

Un SLD se puede crear dinámicamente, lo que significa que puede diseñar mapas utilizando datos dinámicos. Para que esto funcione, necesitará conocer las ID de los polígonos que está tratando de diseñar y también debe alterar / expandir su servicio web.

Haga que su servicio web genere SLD sobre la marcha en lugar de simplemente devolver datos. Esto es bastante simple usando .NET, Java, PHP, etc. El SLD que genere tendrá una regla para cada banda de color que desee mostrar. Cada regla identificará los polígonos a los que se aplica el color por su ID. El bloque de filtro de cada regla contendrá PropertyIsEqualTo 1 OR PropertyIsEqualTo 2 OR .... Cada regla aplica estilos a sus polígonos con el color que haya elegido para representar el valor. Luego tiene dos opciones para decirle a GeoServer que use su SLD dinámica.

  1. Si GeoServer tiene acceso HTTP a su servicio web, puede pasar una URL codificada, por ejemplo (JS) 'http://geoserver/wms?request=GetMap...&sld=' + encodeURIComponent('http://web-service/generateSLD?and=any-parameters-that-influence-sld-generation'). Cuando GeoServer recibe la solicitud WMS, decodificará los parámetros y consultará esta URL para el SLD. Desde la perspectiva de GeoServer, esto no es diferente a consultar un SLD estático en un servidor de archivos.
  2. Si GeoServer no puede acceder a su servicio web, su cliente primero debe solicitarle al servicio web el SLD dinámico, luego pasar el SLD a GeoServer en el parámetro sld_body de la solicitud WMS. Tenga cuidado con los límites de longitud de URL impuestos por su cliente (por ejemplo, un navegador) o su servidor web

Ambos enfoques se pueden probar utilizando un SLD estático que cree para probar, para que sepa qué tan exitoso es esto antes de esforzarse en su servicio web. Ambos enfoques podrían usarse para pedirle a GeoServer el gráfico de la leyenda, que luego representará las mismas reglas (sin embargo, si usa la opción 1, es posible que los datos utilizados para generar su SLD hayan cambiado después de generar el mapa).

Creo que esta es tu mejor opción para la pregunta 2.

En tu primera pregunta :

¿Los puntos de temperatura siempre representan los mismos lugares? En caso afirmativo, ¿puede averiguar de antemano en qué polígonos se encuentran esos puntos de temperatura? En caso afirmativo, simplemente puede reutilizar el enfoque descrito anteriormente, con su secuencia de comandos de generación SLD traduciendo puntos en ID de polígono.

EDITAR Acabo de ver esto referenciado en otra pregunta: http://pypi.python.org/pypi/python-sld/

tonto
fuente
gracias, y para mi primera pregunta descubrí el complemento de mapas ácidos para geoserver, ¿tienes alguna experiencia sobre ese complemento?
bahadir
desafortunadamente no, pero dice "puedes usar una capa de puntos WMS para generar un mapa AMS". Esto me dice que no solo necesita instalar un complemento en GeoServer, sino que también GeoServer necesita acceso a sus datos de puntos para proporcionarlo como una capa. Por su pregunta, asumí que no tiene la capacidad de alterar la configuración de GeoServer.
tomfumb
En realidad, no tengo acceso a la base de datos subyacente. Puedo alterar la configuración del geoservidor. Pero incluso con los mapas ácidos, supongo que necesito agregar una tabla a db para obtener datos de puntos. no hay forma dinámica todavía
bahadir
tiene otra opción, pero puede que no sea fácil: si puede configurar GeoServer, eso significa que puede crear una nueva tienda que lea desde WFS. Nuevamente, esto requiere que GeoServer tenga acceso HTTP a su servicio web, pero luego podría servir su propio WFS que representa sus puntos de datos. Dependiendo del número de puntos que deben transferirse, esto podría ser bastante lento. Además, si no tiene un servidor de mapas a su lado, esto podría significar codificar manualmente las respuestas GML, lo que no es agradable.
tomfumb
¿y si puedo acceder a la base de datos, necesito recopilar datos de los servicios web, insertarlos en db y hacer que geoserver extraiga datos recién insertados de la base de datos?
bahadir
1

La respuesta corta es: sí, ¡es muy posible! En realidad, hay una variedad de formas en que puede abordar este problema. Aquí hay una de esas formas en las que puedo pensar.

Hay 2 partes para su pregunta aquí.

1) Representar datos estáticos y dinámicos provenientes de fuentes externas en GeoServer.

Cree un grupo de capas que diga "Mapa regional" con 2 capas. La capa 1 (estática) es el "Mapa regional, servido desde su base de datos de solo lectura o el Shapefile Layer 2 (dinámico) es el" clima ", que puede servir datos dinámicos a través de la cascada WMS. a su GeoServer, y puede servir la temperatura u otros atributos dinámicos llamando a servicios remotos utilizando cualquier protocolo que use: REST, SOAP, TCP, etc.

De esta manera, puede agregar atributos a las capas dinámicamente en el futuro sin agregar cosas a la base de datos.

2) Realice un estilo personalizado ** Su mejor opción aquí es usar ** Style Layer Descriptor (SLD) . Hay mucha documentación sobre cómo diseñar usando SLD. ¡Es muy poderoso! Puede controlar el estilo utilizando colores, niveles de zoom, umbrales de valores (> 40C es rojo,> 35 es naranja) y tener reglas basadas en valores de múltiples atributos y etiquetas. El estilo está disponible para la mayoría de las geometrías: punto, línea, área, etc. Puede usar editores de estilo como Atlas o el editor que viene con OpenGeo - GeoExplorer, para probar varias condiciones de datos.

La belleza de este enfoque es que puede controlar el estilo de Layer1 y Layer2 independientemente uno del otro. Puedes hacer leyendas en tu interfaz de usuario (JavaScript), fuera de GeoServer. GeoServer fusionará todas las reglas de estilo para producir la superposición correcta. Dependiendo del rendimiento que obtenga de su capa y estilo, también podría considerar agregar una solución de almacenamiento en caché de mosaicos como GeoWebCache o HTTP Cache como Varnish.

Salud,

Ramesh

Ramesh Elaiyavalli
fuente
gracias, pero no tengo oportunidad de crear nuevas tablas o capas en geoserver.
bahadir