Nuestros requisitos de mapeo web son bastante estándar: algunas consultas básicas y la capacidad de imprimir el mapa resultante (o guardar la imagen). Por lo general, hemos usado productos ESRI en el pasado (en este momento estamos usando 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?
EDITAR : Veamos si puedo aclarar esto más. Actualmente, tenemos una capa de geología con más de 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 de geología, almacenada en un archivo JPEG / PNG).
Por lo general, 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 de geología 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 de la capa de geología será la leyenda de toda la capa de geología, 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 software libre que me permita recortar o generar sobre la marcha un subconjunto de la leyenda de la geología que refleje los elementos reales en pantalla / en el mapa, para ir con el documento impreso . Espero que esto aclare las cosas; Pido disculpas si no es así!
fuente
Respuestas:
Definitivamente es posible hacer lo que quiera, dependiendo de ciertas condiciones. Eche un vistazo a esta aplicación Flex que había desarrollado hace un par de años: http://india-wris.nrsc.gov.in/LULCApp.html .
La leyenda y las estadísticas cambian según 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 del mapa actual en un mapa de bits y luego descubre los colores que contiene. Con esto, puede averiguar qué colores o clases están actualmente visibles. Según esta información, la leyenda se crea dinámicamente.
Había usado Flex en ese momento, pero esto también es posible usando el Canvas en HTML5. O puede usar cualquier código del lado del servidor para hacer lo mismo con su imagen del mapa para obtener su leyenda creada dinámicamente.
fuente
AFAIK, en FOSS4G o ESRI, necesitará escribir código personalizado para generar esta capa.
No es eso difícil, pero le tomará más de unas pocas 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, he logrado algo similar a lo que describiste usando Pagelayout Frame Elements .
Si nunca ha hecho ArcObjects (pero lo ha programado), el código de dibujo puede ser un poco complicado, pero generalmente se necesita hacer uno para alcanzar ese "¡ajá!" momento.
El algoritmo es simple:
(1) Obtenga el objeto Map del diseño de página que desea usar como referencia para generar la leyenda ... Puede que tenga que lidiar con varios marcos para llegar al mapa que desea, porque un Pagelayout puede contener varios objetos Map con diferentes extensiones que es un poco inusual si no ha realizado ninguna programación personalizada de ArcMap Pagelayout (piense en los pequeños mapas insertados que puede tener).
(2) Tome la extensión visible de ActiveView del mapa que desee.
(3) Use eso como su 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, debe dibujarla como se muestra en los ejemplos que le di antes.
Lo siento, no puedo ofrecerle una solución más fácil, pero al menos de esta manera podrá hacer que se vea como quiera, solo se requiere codificación.
Actualizar:
Como deseaba hacer esto en el contexto de una aplicación web, verifiqué 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 ArcGIS Server . Seguiría todos los pasos excepto (1) (no necesita preocuparse por la reproducción de página en este contexto). Exponer el resultado usando REST.
A partir de aquí, tiene varias opciones (basadas en si desea usar Flex o Javascript), pero la idea es la misma: en la actualización de la página, llame al servicio web REST que creó y dibuje la leyenda.
La ventaja de este enfoque en comparación con otros que se han sugerido es que puede usar cualquier simbología con sus características (y no se limita a colores distintos para la simbología de la característica). Puede usar su idioma web favorito para el código del lado del cliente. Los símbolos que genera para la leyenda se pueden generar automáticamente desde el mapa.
¡La desventaja es que necesitará escribir una Extensión de Objeto de Servidor! Afortunadamente, hay una muestra de ESRI que ya hace el 75% de lo que necesita y debería darle 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.
fuente
Cuando exporta a un PDF con Geocortex Essentials, la leyenda se genera mediante un subinforme en la plantilla de impresión. Este subinforme recibe todas las capas visibles que se usaron para crear la imagen del mapa y todas las muestras de leyenda producidas por ArcGIS Server. No emite ninguna consulta espacial para determinar si alguna capa de la leyenda se dibuja realmente en la extensión del área impresa.
Entonces, si desea cambiar el comportamiento de la leyenda, puede personalizar el subinforme de la leyenda o puede usar una imagen en lugar de un subinforme para colocar una leyenda en la plantilla de impresión. Si ya está generando una imagen de leyenda de alguna manera para usar en su visor, debería poder reutilizar ese servicio desde el motor de impresión.
La leyenda ya contiene algún código en línea incrustado que alterna 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. Puede ver el código en línea al cambiar a la pestaña "Secuencias de comandos" en el diseñador de informes.
(Trabajo en Latitude Geographics)
fuente
Acerca de "mapeo web" con "solución FOSS" completa ... Consideraciones:
Y consideración técnica: está utilizando "coberturas" (?), Por lo que un buen estándar OGC para recuperar su información espacial es el WMS .
Una solución simple compatible con OGC para su problema es utilizar los servicios GetCapabilities y GetLegendGraphic de WMS , que devuelve una descripción de leyenda estándar en un archivo XML y la imagen con leyendas.
ArcGIS 10+ tiene GetLegendGraphic , pero verifique si puede especificar BBOX para mostrar solo un subconjunto de leyenda.
Si desea construir un diseño de mapa con leyenda , hay otras piezas de esta "solución FOSS LEGO":
Cualquier servidor de mapas FOSS, como MapServer (y creo que las soluciones ESRI también), puede ofrecer una imagen JPEG como una solicitud de mapa WMS (sin mosaico): consulte el servicio GetMap de WMS .
PD: no es un estándar, pero quizás su servidor pueda configurarse para ofrecer un mapa con leyenda , mediante herramientas de plantilla, como MapServer.
Para crear un diseño de "mapa con leyenda", puede generar un HTML (o "archivo PDF sobre la marcha") con Javascript, PHP u otro idioma que realice las solicitudes del servicio web (REST) de mapa y leyenda.
Prefiero generar PDF a partir de HTML: puede usar wkHtmlToPdf , una solución FOSS para las conversiones de HTML a PDF. Para producir diseños más pobres, con "diseño JPEG sobre la marcha", puede usar un kit de herramientas estándar de FOSS, como imagemagick , en el servidor.
fuente