Tengo un conjunto de sitios en los miles. No todos los usuarios ven los mismos Sitios en el mapa, por lo tanto, ACL. Los datos se almacenan en una base de datos no GIS (mssql, ora, etc.) y ahora se recuperan con una consulta SQL estándar y se devuelven al cliente (OpenLayers) con un JSP.
El código actual ya está optimizado para hacer clusters del lado del cliente (por lo que es menos desordenado para el cliente, pero todos los datos están ahí), recuperación del cuadro delimitador (por lo tanto, un subconjunto de datos pero tiene que ir al servidor para cada paneo / zoom para nuevos datos) e incluso clustering del lado del servidor (para reducir los datos enviados al cliente).
Lo que me gustaría en su lugar es generar imágenes / mosaicos para todos mis datos, de forma similar a cómo Google Maps muestra toneladas de pequeños puntos rojos para todos los resultados: http://bit.ly/d73qrw [búsqueda de Google Maps para "café"] y mostrar en el cliente. Y cuando haga clic en él, haga una llamada rápida ajax a un servicio WMS para obtener información. Esa es la idea al menos.
Pero aquí está el problema: no puedo configurar un servicio WMS estándar frente a mis datos porque no todos los usuarios ven los mismos datos. ¿Hay alguna manera de generar estos mosaicos sobre la marcha o hacer que WMS sea compatible con ACL?
edit - 9/22/2010 - Entonces descubrí cómo google genera los mosaicos, o más bien la tecnología detrás de ellos. Están utilizando las tablas de Google Fusion. Almacene N filas en sus tablas y luego, si los datos tienen conocimiento de lat / lon, el producto Fusion Table puede generar los mosaicos sobre la marcha (!). Este es el tipo de cosas que estoy buscando: un mapa eficaz con toneladas de datos. Pero, por supuesto, necesito que sea controlado por ACL. ¿Tiene sentido escribir una implementación ligera y personalizada de la especificación WMS o modificar un producto existente? Aunque geoserver parece mucho "simplemente" modificar para admitir ACL.
edit - 9/27/2010 - Alguna información más desde la adición de la recompensa. Mis datos están en Oracle. Ora espacial no está habilitado. En este momento, los datos se extraen a nivel empresarial y se convierten en datos, enviados al cliente donde el cliente coloca los "puntos" en el mapa. ACL se realiza en el nivel de lógica de negocios, no DB o ActivDir o algo así. La autenticación es simple, pero la Autorización no lo es, por lo que tuvo que ser capturada en el código. Me gustaría saber cómo crear mejor un servicio WMS para servir hasta miles de "puntos" en el mapa donde cada usuario verá un subconjunto diferente de puntos. ¿Es la respuesta un CQL_FILTER? Pero entonces, ¿cómo se configuran los parámetros? Una idea que tengo ahora es hacer un proceso de 2 pasos. Primero ejecute la consulta interna para obtener una lista de ID que el usuario permitió ver, luego cree una cadena de solicitud WMS con esas ID en el parámetro CQL_FILTER. ¿Hay algo que simplifique este proceso? Y si sigo con esto, ¿cómo puedo agregar esta capa como una capa "WMS" a un cliente Open Layers ya que para OL el punto final es mi código para obtener ID de DB y no del servicio WMS real en, por ejemplo, GeoServer?
Respuestas:
Algunos proyectos para servicios web SIG ACL
En foss4g 2010, ver el 09 de septiembre a las 11:00 en el programa final http://2010.foss4g.org/program_print.php (las presentaciones no están disponibles por el momento)
fuente
Creo que una solución común es crear una secuencia de comandos proxy o wrapper que se encuentre entre el cliente y WMS. El proxy se utiliza para crear una llamada WMS personalizada basada en parámetros del cliente.
No ha mencionado si su propósito para esta configuración es la seguridad o solo la personalización, o qué información tendrá el cliente para determinar qué 'vista' personalizada de los datos debe producir el WMS.
Si va a mostrar más de unos pocos cientos de puntos, querrá atenerse a un servicio basado en imágenes como WMS. Dependiendo de sus requisitos, también podría simplemente colocar MapServer detrás de un script de envoltura que realiza solicitudes de mapas personalizadas basadas en filtros únicos o parámetros de expresión.
fuente
Tengo una respuesta que funcionó para nosotros después de algunas pruebas y errores.
Oracle Spatial + Oracle VPD hace el truco. Ya estamos usando Ora y VPD, por lo que este fue el siguiente paso lógico. Ora Space tiene un servicio WMS y se puede personalizar para que sea diferente para diferentes usuarios en función de sus derechos / ACL a través de VPD. Si otros buscan algo como esto, me doy cuenta de que no todas las operaciones tienen o pueden permitirse Oracle, pero si lo tienen, está ahí. No sé si MS SQL Server tiene una funcionalidad similar.
fuente
Otra idea (no estoy seguro si esto es realmente práctico). Lo que necesita es una asignación entre los permisos de usuario y los archivos de mapas generados. Entonces, ¿por qué no crear un hash a partir del permiso del usuario y el mosaico / extensión del mapa solicitado? Este hash se asigna a un mosaico generado. Si el mapa no está allí, obviamente debe generarse, de lo contrario, puede recuperarse de la caché del mapa. Por supuesto, este enfoque no trae ningún beneficio si cada usuario ve un conjunto de datos completamente diferente. Pero si todos los usuarios pertenecen a un grupo limitado de conjuntos de permisos, esto realmente debería ayudar.
Daniel
fuente
¿Cuál es tu fecha límite? En Geomajas, ya tenemos las limitaciones de seguridad / acceso a datos. Estamos trabajando en el almacenamiento en caché / rasterización en este momento, lo que dará como resultado el tipo de sistema que está buscando. Debería estar terminado en un par de semanas.
fuente
¿Sería más eficiente un servicio de características web (WFS)?
http://openlayers.org/dev/examples/getfeatureinfo-popup.html
Solo una idea.
fuente
Probablemente esta solución es una locura, pero aquí vamos.
¿Por qué no un servidor WMS por usuario? Supongamos que estamos usando MapServer. La configuración de MapServer se almacena en un archivo .map (también conocido como mapfile), pero nada prohíbe usar varios mapfiles. Cuando se realiza una solicitud WMS, uno de los parámetros específicos del proveedor que MapServer aceptará es 'map', que es una cadena que contiene la ruta y el nombre de archivo del mapfile utilizado [1]. Si en sus solicitudes WMS se envía un archivo de mapa diferente dependiendo de la identificación del usuario que inició sesión anteriormente, obtendrá los servidores WMS como usuarios, y solo con una instalación de MapServer.
En el lado de la seguridad, tendría que verificar el archivo de mapas usado contra una identificación de sesión, tarea que probablemente sería realizada por un proxy entre clientes y MapServer. Un usuario que desee ver los mapas de otros usuarios podría alterar manualmente la URL cambiando el parámetro 'mapa', y esta contramedida de verificación haría que tales intentos no tuvieran éxito.
La contra (locura) de esta solución es que para cada usuario se debe generar un archivo de mapa. Obviamente, en caso de que el número de usuarios sea alto, esta solución no es práctica, a menos que los archivos de mapas se puedan generar y actualizar automáticamente, cuando sea necesario, mediante el uso de un script o mecanismo similar.
[1] Si usa MapServer, el parámetro 'map' es realmente obligatorio.
fuente
Hay varias partes móviles aquí.
Primero, hay que filtrar los puntos: esto debe hacerse en el lado del servidor, inmediatamente después o durante su consulta SQL.
Luego, los puntos filtrados deben devolverse al cliente.
Esa es la parte simple. :) Recomiendo que implemente esto y luego pruebe el rendimiento, e idealmente podría detenerse aquí.
Sin embargo, si tiene demasiados puntos para mostrar de manera eficiente en OpenLayers, entonces obtiene las optimizaciones que Google parece hacer para los pequeños puntos rojos:
Debe conectar un renderizador de mosaico al conjunto completo de resultados filtrados, produciendo mosaicos completamente transparentes, excepto por un pequeño punto por resultado. (Decisión de diseño: ¿producir estos con entusiasmo o solo bajo demanda?)
GeoServer, etc., requerirá un código 'disparador' ya que necesitarán una nueva capa por consulta por usuario; a medida que agrega usuarios, deberá agregar cosas nuevas para que GeoServer las represente. (Además, deberá producir registros de resultados en un formato que pueda ser consumido por la implementación de representación). ¿Y con qué frecuencia se vuelven a representar los mosaicos antiguos?
Recomendaría una pequeña porción de código de servidor que representa el acceso al renderizador de teselas, de esa manera alguien no podrá ver resultados que no son suyos al adivinar una URL.
A continuación, los resultados que se devuelven al navegador deben dividirse: los primeros n son resultados completos que colocan marcadores, mientras que el resto se envía como coordenadas + URL de devolución de llamada. (¡Incluso si no se encarga de representarlos, el navegador necesita saber dónde están ubicados para cambiar el cursor, proporcionar información sobre herramientas y realizar acciones significativas con un clic!)
Luego está el código JS en el navegador para administrar las interacciones con los puntos.
Hasta donde yo sé, que no está muy lejos, nadie ha escrito el código 'listo para usar' para hacer lo anterior: estás viendo un montón de código de integración de sistemas en el backend y un poco de JS nuevo en el Interfaz.
fuente
Si tiene una consulta que se puede ejecutar para indicarle qué ID puede ver un usuario (como usted dice en la última edición), entonces la "mejor" solución será codificar ese filtro como un filtro CQL u OGC como parte del Solicitud de WMS. Es posible que sea necesario reorganizar los datos en una vista para que esto sea factible.
Antes de comenzar a usar Tile Caches, construiría la versión simple y vería si es lo suficientemente rápida, y luego me volveré complejo si y solo si necesita más velocidad.
fuente