14 votos

¿Existe una solución FOSS para analizar leyendas en un entorno de mapas web?

Nuestros requerimientos de mapas web son bastante estándar - algunas consultas básicas y la capacidad de imprimir el mapa resultante (o guardar la imagen). Normalmente hemos utilizado productos de ESRI en el pasado (actualmente estamos utilizando GeoCortex) pero aún no hemos podido resolver el problema de cómo analizar la información de la leyenda para que coincida con lo que realmente se muestra en el mapa. Por ejemplo, si hay cuatro polígonos que aparecen en el mapa, solo debería haber cuatro elementos de leyenda para los polígonos. ¿Existe una solución de código abierto para este problema?

EDICIÓN: Veamos si puedo aclarar esto más. Actualmente, tenemos una capa geológica con 33,000+ polígonos. La leyenda de esta capa es una imagen única y contiene varios cientos de elementos de leyenda (es decir, es la leyenda de toda la capa geológica, almacenada en un JPEG / PNG).

Normalmente, un usuario ampliará un área (como una sola hoja de mapa NTS, o incluso más pequeña) y por lo tanto se mostrará un subconjunto de polígonos geológicos en la pantalla. Luego guardarán el mapa como un documento impreso (PDF o imagen), que es generado por GeoCortex / ArcGIS Server. El documento impreso contendrá un encabezado, una imagen del mapa y una leyenda. Sin embargo, la leyenda para la capa geológica será la leyenda para toda la capa geológica, no lo que realmente se muestra en el mapa (es decir, un subconjunto mucho más pequeño).

Entonces, estoy buscando ver si hay una solución de código abierto para permitirme recortar o generar sobre la marcha un subconjunto de la leyenda geológica que refleje los elementos reales en pantalla / en el mapa, para acompañar al documento impreso. ¡Espero que aclare las cosas; pido disculpas si no lo hace!

29voto

Anthony Cramp Puntos 126

Definitivamente es posible hacer lo que quieres, dependiendo de ciertas condiciones. Echa un vistazo a esta aplicación Flex que desarrollé hace unos años atrás: http://india-wris.nrsc.gov.in/LULCApp.html.

La Leyenda y las Estadísticas cambian dependiendo de los datos visibles en la extensión actual. El Algoritmo requiere que cada clase tenga un color distinto. La Aplicación Flex conoce la clase y su color. En cada cambio de extensión, convierte la extensión de mapa actual a un mapa de bits, y luego encuentra los colores en él. Usando esto, puedes averiguar qué colores o clases están actualmente visibles. Basado en esta información, la leyenda se crea dinámicamente.

En ese momento había usado Flex, pero también es posible hacerlo utilizando el Canvas en HTML5. O puedes utilizar cualquier código del lado del servidor para hacer lo mismo a tu imagen de mapa y obtener tu leyenda creada dinámicamente.

5voto

FlySwat Puntos 61945

Según mi conocimiento, en FOSS4G o ESRI, necesitarás escribir código personalizado para generar esta capa.

No es tan difícil, pero te llevará más que unas cuantas líneas de código.

Para ArcMap, esto se logra utilizando un Elemento Personalizado. El sitio de ayuda de ESRI está lleno de ejemplos antiguos y ejemplos nuevos.

En el pasado, logré algo similar a lo que has descrito utilizando Elementos de Marco de Pagelayout.

Si nunca has trabajado con ArcObjects (pero sabes programar), el código de dibujo puede volverse un poco complicado, pero generalmente toma hacer uno para llegar a ese momento "¡ajá!".

El algoritmo es simple:

  • (1) Obtén el objeto Map del PageLayout que deseas utilizar como referencia para generar la leyenda... Puede que tengas que lidiar con varios marcos para llegar al mapa que deseas, debido a que un Pagelayout puede contener varios objetos de Map con diferentes extensiones, lo cual es un poco inusual si no has trabajado en programación personalizada de Pagelayout de ArcMap (piensa en los mapas pequeños que puedes tener).

  • (2) Obtén la Extensión Visible de la Vista Activa del mapa que deseas.

  • (3) Utiliza eso como tu geometría de filtro de consulta para recorrer y buscar a través de todas las capas en el mapa.

  • (4) Si la capa devuelve algún registro, tendrás que dibujarlo como se muestra en los ejemplos que te di anteriormente.

Lamento no poder ofrecerte una solución más sencilla, pero al menos de esta manera podrás hacer que luzca como desees, solo se requiere programación.

Actualización:

Dado que querías hacer esto en el contexto de una aplicación web, revisé la documentación y hay varias formas de hacerlo utilizando un algoritmo similar.

Una de ellas es a través de una Extensión de Objeto de Servidor ArcGIS. Realizarías todos los pasos excepto (1) (no es necesario preocuparse por Pagelayout en este contexto). Expon el resultado utilizando REST.

A partir de aquí, tienes varias opciones (dependiendo de si deseas utilizar Flex o Javascript), pero la idea es la misma: al actualizar la página, llamar al servicio web REST que creaste y dibujar la leyenda.

La ventaja de este enfoque en comparación con otras sugerencias es que puedes utilizar cualquier simbología con tus elementos (y no estás limitado a colores distintos para la simbología del elemento). Puedes utilizar tu lenguaje web favorito para el código del lado del cliente. Los símbolos que generes para la leyenda pueden ser creados automáticamente a partir del mapa.

La desventaja es que necesitarás escribir una Extensión de Objeto de Servidor. Afortunadamente, hay un ejemplo de ESRI que hace el 75% de lo que necesitas y debería darte una idea clara de cómo continuar con los comentarios que hice anteriormente.

Actualización 2:

En cuanto a una solución FOSS4G para esto, el mismo enfoque también funcionaría con cualquiera de los servidores FOSS, aunque la API es ligeramente diferente para cada uno.

4voto

Ryan Ahearn Puntos 3829

Cuando exportas a un PDF con Geocortex Essentials, la leyenda es generada por un subinforme en la plantilla de impresión. Este subinforme recibe todas las capas visibles que se utilizaron para crear la imagen del mapa, y todas las muestras de leyenda producidas por ArcGIS Server. No emite consultas espaciales para determinar si alguna capa en la leyenda realmente se dibuja en la extensión del área impresa.

Entonces, si deseas cambiar el comportamiento de la leyenda, puedes personalizar el subinforme de la leyenda, o puedes usar una imagen en lugar de un subinforme para colocar una leyenda en la plantilla de impresión. Si ya estás generando de alguna manera una imagen de leyenda para usar en tu visor, deberías poder reutilizar ese servicio desde el motor de impresión.

La leyenda ya contiene algo de código en línea incrustado que cambia el formato del texto de la leyenda en función de si la muestra es para una capa o para una clase en la capa. Puedes ver el código en línea al cambiar a la pestaña "Scripting" en el diseñador de informes.

(Trabajo en Latitude Geographics)

1voto

Iznogood Puntos 143

Acerca del "mapeo web" con una solución "FOSS" completa... Consideraciones:

  • La solución "FOSS" debe ser "popular" (tener una comunidad grande y organizada) para ser segura, estable, etc.
  • Un concepto clave en FOSS y GIS es estandarización: las mejores soluciones adoptan estándares, como los de OGC.
  • Hoy en día las soluciones "web" populares son OpenLayers, Mapserver, GeoServer, PostGIS, etc. Todos tienen un núcleo compatible con OGC. La solución "GeoCortex / ArcGIS Server" no es FOSS, pero quizás sea compatible con OGC.

Y una consideración técnica: estás utilizando "coberturas" (?), por lo que un buen estándar OGC para recuperar tu información espacial es el WMS.


Una solución simple compatible con OGC para tu problema, es usar los servicios WMS GetCapabilities y GetLegendGraphic, que devuelven una descripción de leyenda estándar en un archivo XML y la imagen con leyendas.

NOTA: cuando piensas en alguna solución GIS/FOSS, primero piensa en los estándares, luego el problema se reduce a un problema de "piezas de LEGO bien conocidas", y las piezas vienen de cualquier proveedor.

ArcGIS 10+ tiene GetLegendGraphic, pero verifica si puedes especificar BBOX para mostrar solo un subconjunto de leyenda.


Si deseas construir un diseño de mapa con leyenda, hay otras piezas de esta solución "LEGO FOSS":

Cualquier servidor de mapas FOSS, como MapServer (y creo que también las soluciones de ESRI), puede ofrecer una imagen JPEG como solicitud de mapa WMS (no en mosaico) -- consulta el servicio GetMap de WMS.

PD: no es un estándar, pero tal vez tu servidor puede configurarse para ofrecer mapa con leyenda, mediante herramientas de plantilla, como MapServer.

Para construir un diseño de "mapa con leyenda" puedes generar un HTML (o "archivo PDF al vuelo") con Javascript, PHP u otro lenguaje que realice las solicitudes de servicios web de (REST) para mapa y leyenda.

Prefiero generar PDF a partir de HTML: puedes usar wkHtmlToPdf, una solución FOSS para conversiones de HTML a PDF. Para producir diseños más simples, con un "diseño JPEG al vuelo", puedes usar un conjunto de herramientas FOSS estándar, como imagemagick, en el servidor.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X