Eu tenho um conjunto de sites na casa dos milhares. Nem todos os usuários veem os mesmos sites no mapa - portanto, a ACL. Os dados são armazenados em um banco de dados não GIS (mssql, ora, etc) e agora são recuperados com uma consulta SQL padrão e retornados ao cliente (OpenLayers) com um JSP.
O código atual já está otimizado para fazer cluster do lado do cliente (menos bagunça no cliente, mas todos os dados estão lá), recuperação de caixa delimitadora (para um subconjunto de dados, mas é necessário ir ao servidor para todos os panorâmica / zoom para novos dados) e até cluster do lado do servidor (para reduzir os dados enviados ao cliente).
Em vez disso, gostaria de gerar imagens / blocos para todos os meus dados, semelhante à maneira como o Google Maps mostra toneladas de pequenos pontos vermelhos para todos os resultados - http://bit.ly/d73qrw [google maps search for "coffee"] e exibir no cliente. E quando clicado, faça uma chamada rápida ajax para um serviço WMS para obter informações. Essa é a ideia pelo menos.
Mas aqui está o problema - não posso simplesmente configurar um serviço WMS padrão na frente dos meus dados, porque nem todos os usuários veem os mesmos dados. Existe uma maneira de gerar esses blocos rapidamente ou tornar o WMS compatível com ACL?
edit - 22/09/2010 - Então eu descobri como o Google gera os blocos, ou melhor, a tecnologia por trás dele. Eles estão usando o Google Fusion Tables. Armazene N linhas em suas tabelas e, se os dados tiverem lat / lon, o produto Fusion Table poderá gerar os blocos rapidamente (!). Esse é o tipo de coisa que estou procurando - mapa de desempenho com toneladas de dados. Mas é claro que preciso que ele seja controlado pela ACL. Faz sentido escrever uma implementação leve e personalizada da especificação WMS ou modificar um produto existente? Embora o geoserver pareça muito "apenas" modificado para dar suporte à ACL.
edit - 27/09/2010 - Mais algumas informações desde a adição de recompensa. Meus dados estão no Oracle. Ora espacial não está ativado. No momento, os dados são extraídos no nível de negócios e convertidos em dados, enviados ao cliente onde o cliente coloca os "pontos" no mapa. A ACL é feita no nível da lógica de negócios, não no DB ou no ActivDir ou algo assim. A autenticação é simples, mas a Autorização não é e, portanto, teve que ser capturada no código. Gostaria de saber como criar melhor um serviço WMS para exibir milhares de "pontos" no mapa, onde cada usuário verá um subconjunto diferente de pontos. A resposta é um CQL_FILTER? Mas então como são definidos os parâmetros? Uma ideia que tenho agora é fazer um processo em duas etapas. Primeiro, execute a consulta interna para obter a lista de IDs que o usuário permitiu ver e, em seguida, crie uma string de solicitação WMS com esses IDs no parâmetro CQL_FILTER. Existe algo que simplifique esse processo? E se eu for com isso, como posso adicionar essa camada como uma camada "WMS" a um cliente Open Layers, já que para OL o ponto final é o meu código para obter IDs do DB e não o serviço WMS real, por exemplo, GeoServer?
Respostas:
Alguns projetos para serviços web GIS ACL
No foss4g 2010, veja em 09 de setembro, 11:00 no programa final http://2010.foss4g.org/program_print.php (apresentações não disponíveis no momento)
fonte
Eu acho que uma solução comum é criar um script de proxy ou wrapper que fica entre o cliente e o WMS. O proxy é usado para criar uma chamada WMS personalizada com base nos parâmetros do cliente.
Você não mencionou se o seu objetivo para esta configuração é segurança ou apenas personalização, ou quais informações o cliente terá para determinar qual 'visualização' personalizada dos dados o WMS deve produzir.
Se você estiver exibindo mais do que algumas centenas de pontos, convém manter um serviço baseado em imagem como o WMS. Dependendo de seus requisitos, você também pode colocar o MapServer atrás de um script de wrapper que faz solicitações de mapa personalizadas com base em parâmetros exclusivos de filtro ou expressão.
fonte
Eu tenho uma resposta que funcionou para nós após algumas tentativas e erros.
O Oracle Spatial + Oracle VPD faz o truque. Já estamos usando o Ora e o VPD, então esse foi o próximo passo lógico. O Ora Spacial possui um serviço WMS e pode ser personalizado para ser diferente para diferentes usuários, com base em seus direitos / ACL via VPD. Se outras pessoas estão procurando algo assim, percebo que nem todas as operações têm ou podem pagar pelo Oracle, mas se você tiver, está lá. Não sei se o MS SQL Server tem funcionalidade semelhante.
fonte
Outra idéia (não tenho certeza se isso é realmente prático). O que você precisa é de um mapeamento entre permissões de usuário e arquivos de mapa gerados. Então, por que não criar um hash a partir da permissão do usuário e do mapa solicitado / estender? Esse hash é mapeado para um bloco gerado. Se o mapa não estiver lá, ele obviamente precisará ser gerado, caso contrário, poderá ser recuperado do cache do mapa. Obviamente, essa abordagem não traz benefícios se cada usuário vê um conjunto de dados completamente diferente. Mas se todos os usuários pertencerem a um grupo limitado de conjuntos de permissões, isso deve realmente ajudar.
Daniel
fonte
Qual é o seu prazo? Em Geomajas, já temos as limitações de segurança / acesso a dados. Estamos trabalhando em cache / rasterização neste momento, o que resultará no tipo de sistema que você está procurando. Deve terminar em algumas semanas.
fonte
Um serviço de recursos da Web (WFS) seria mais eficiente?
http://openlayers.org/dev/examples/getfeatureinfo-popup.html
Apenas uma ideia.
fonte
Provavelmente essa solução é louca, mas aqui vamos nós.
Por que não um servidor WMS por usuário? Vamos supor que estamos usando o MapServer. A configuração do MapServer é armazenada em um arquivo .map (também conhecido como mapfile), mas nada proíbe o uso de vários mapfiles. Quando uma solicitação WMS é feita, um dos parâmetros específicos do fornecedor que o MapServer aceita é 'map', que é uma string que contém o caminho e o nome do arquivo de arquivo de mapa usado [1]. Se nas solicitações do WMS for enviado um mapfile diferente, dependendo da identificação do usuário que efetuou login anteriormente, você obterá os servidores WMS como usuários e apenas com uma instalação do MapServer.
No lado da segurança, você teria que verificar o arquivo de mapa usado em relação a um ID de sessão, tarefa que provavelmente seria realizada por um proxy entre os clientes e o MapServer. Um usuário que queira ver os mapas de outros usuários poderá alterar manualmente o URL, alterando o parâmetro 'map', e essa contramedida de verificação tornaria essas tentativas sem êxito.
A contra (loucura) desta solução é para cada usuário que um arquivo de mapa deve ser gerado. Obviamente, caso o número de usuários seja alto, essa solução não é prática, a menos que os mapfiles possam ser gerados e atualizados automaticamente, quando necessário, usando um script ou mecanismo semelhante.
[1] Se você estiver usando o MapServer, o parâmetro 'map' é realmente obrigatório.
fonte
Existem várias partes móveis aqui.
Primeiro, há a filtragem dos pontos: Isso deve ser feito no lado do servidor, imediatamente após ou durante sua consulta SQL.
Em seguida, os pontos filtrados precisam ser retornados ao cliente.
Essa é a parte simples. :) Eu recomendaria que você implementasse isso e depois testasse o desempenho e, idealmente, seria capaz de parar por aqui.
No entanto, se você tiver muitos pontos para exibir com eficiência no OpenLayers, obterá as otimizações que o Google parece fazer pelos pequenos pontos vermelhos:
Você precisa conectar um renderizador de blocos ao conjunto completo de resultados filtrados, produzindo blocos totalmente transparentes, exceto por um pequeno ponto por resultado. (Decisão do projeto: produza-os avidamente, ou somente sob demanda?)
O GeoServer, etc, exigirá código de 'gatilho', pois precisará de uma nova camada por consulta por usuário; À medida que você adiciona usuários, você precisa adicionar coisas novas para o GeoServer renderizar. (Além disso, você precisará produzir registros de resultados em um formato que possa ser consumido pela implementação da renderização). E com que frequência as peças antigas são renderizadas novamente?
Eu recomendaria um pequeno código de servidor que os proxies acessem o renderizador de blocos - dessa forma, alguém não poderá ver resultados que não são deles ao adivinhar um URL.
Em seguida, os resultados retornados ao navegador precisam ser particionados: Os primeiros n são resultados completos que recebem marcadores, enquanto o restante é enviado como coordenadas + URL de retorno de chamada. (Mesmo que não seja responsável por renderizá-los, o navegador precisa saber onde eles estão localizados para alterar o cursor, fornecer uma dica de ferramenta e realizar ações significativas com um clique!)
Depois, há o código JS no navegador para gerenciar interações com os pontos.
Até onde eu sei, que não é muito longe, ninguém escreveu o código "pronto para uso" para fazer o acima: Você está vendo vários códigos de integração de sistemas no back-end e algumas novas JS no a parte dianteira.
fonte
Se você tiver uma consulta que possa ser executada para informar quais IDs um usuário pode ver (como você diz na edição mais recente), a "melhor" solução provavelmente será codificar esse filtro como um filtro CQL ou OGC como parte do Solicitação WMS. Você pode achar que é necessário reorganizar os dados em uma exibição para tornar isso possível.
Antes de começar a usar os Tile Caches, eu construía a versão simples e veria se ela era rápida o suficiente e depois tornava-se complexa se e somente se você precisar de mais velocidade.
fonte