30.000 pontos de dados ... isso pode ser servido razoavelmente usando openlayers?

8

Estou tentando resolver um problema de GIS da web e preciso descobrir a melhor estratégia. Eu tenho um mapa com 30.000 células, formando uma grade para a província de Alberta. Eu tenho uma lista de pontos de dados para cada célula - cerca de 50 campos e valores de indicadores para cada célula. Por exemplo, um valor pode ser a população humana, portanto cada célula teria um valor para a população humana para essa célula. Quero fazer um mapa interativo que possa mostrar esses valores visualmente com quadrados para as células ou com uma aparência de tipo de mapa térmico misto. Além disso, eu gostaria de poder fazer cálculos compostos em todos os pontos de dados e usá-los para fazer mapas adicionais. Levando em consideração os cálculos, existem aproximadamente 300.000 permutações no mapa. Ainda por cima, também é temporal; existem 16 fatias de tempo diferentes.

Minha estratégia até agora:

1) No lado do servidor, calcule os valores da célula dinamicamente no tempo de execução e envie os valores para o cliente (todos os 30.000 deles). Isso se traduz em aproximadamente um valor para cada quadrado de 3x3 pixel em uma imagem de 525px x 525px na tela.

2) No lado do cliente com camadas abertas, use um png de 1px que possa ser redimensionado e tenha o valor alfa ajustado conforme necessário para mostrar o gradiente de cores diferente correspondente ao valor dos dados para cada célula. O png seria redimensionado conforme o mapa aumentasse ou diminuísse o zoom. Teoricamente, eles seriam posicionados precisamente para formar uma cobertura geral do mapa como quadrados ou, usando a abordagem do mapa de calor, eles se sobreporiam o suficiente para formar uma cobertura geral.

A questão:

É razoável calcular esses valores de célula dinamicamente no servidor e depois enviar para uma interface OpenLayers em tempo real? Estou confiante de que o servidor pode executar os cálculos, mas o OpenLayers pode exibir razoavelmente 30.000 pontos de dados por vez em um mapa? É razoável esperar poder criar uma cobertura geral usando dados de pontos? Acho que estou tentando criar o equivalente a um mapa vetorial com 30.000 formas, oferecendo 100% de cobertura geral do mapa, mas usando dados pontuais para simplificá-lo.

As estratégias alternativas em minha mente são:

a) gerar os mapas em tempo real no servidor e enviar como camadas rasterizadas ao cliente

b) gerar todas as permutações antecipadamente e armazená-las no servidor como mapas rasterizados

Alguma ideia? Minha abordagem está longe e latindo na árvore errada? Algum conselho sobre um método melhor?

Eu certamente apreciaria quaisquer pensamentos sobre o assunto! Se você estiver interessado, posso até contratar um desenvolvedor para ajudá-lo.

Muito obrigado!

Noé

Noah Purves-Smith
fonte
Estou pesquisando mais e posso estar tomando o caminho errado total ... que tal usar Rendering Transformations com GeoServer ... com que rapidez o GeoServer pode produzir uma transformação com 30.000 pontos de dados?
Noah Purves-Smith
Use o cluster no Openlayers - exemplo do flickr dev.openlayers.org/releases/OpenLayers-2.12/examples/…
Mapperz
Obrigado pelo comentário Mapperz ... infelizmente, o agrupamento não resolve realmente o que precisamos.
Noah Purves-Smith

Respostas:

13

Esta pergunta foi feita várias vezes. 30 mil pontos, em linha reta, não funcionarão em um mapa OL. Ou mesmo em um mapa Flash / Silverlight.

Números aproximados (aproximados!) De magnitude para lembrar - 100 pontos em um mapa JS (openlayers), 1.000 pontos em um mapa Flash (por exemplo, ArcGIS Flash ou Silverlight), 10.000 pontos em um aplicativo de desktop (ArcGIS Desktop) são o seu bom desempenho níveis. Esses são pontos "reais", não ocultos ou falsificados, conforme descrito abaixo.

Não é só isso, não é muito bom interagir com 30 mil pontos. Como acesso o marcador "aquele" atrás de outro marcador?

Você tem 2 opções:

1) Crie raster, como você mencionou, no servidor. Atenda um serviço WMS e, quando o usuário clicar / passar o mouse sobre um ponto, volte ao servidor para obter os dados

2) Reduza o número de pontos que você exibe. Principalmente pelo agrupamento SERVER-SIDE e também pelo corte da caixa delimitadora. O agrupamento no lado do cliente é "ok" e "atraente", mas não ajuda em 30 mil pontos. Vai ser lento. Assim, você configura sua camada com a estratégia bbox e o OL fará chamadas para o servidor no modo panorâmico / zoom para você, e você retornará um novo conjunto de dados que será cortado no ponto em que você retornará menos de 100 a 300 pontos.

Vadim
fonte
Bata-me para isso! O número 1 é expandido em minha resposta.
Michael Markieta
Obrigado pela resposta Vadim. Acho que não expliquei muito bem o problema, mas também acho que estava procurando a solução errada. Eu acho que criar uma varredura no servidor é definitivamente o caminho certo a seguir, agora que eu examinei mais detalhadamente. Você pode dizer que eu sou um novato nisso!
Noah Purves-Smith
@Noah - não há problema. Você está no caminho certo :) O WMS é a melhor maneira de obter muitíssimos dados, a menos que você possa condensá-los.
Vadim
Boa resposta. Minha solução foi semelhante à sua sugestão nº 2 e foi capaz de suportar um conjunto de dados de um milhão de pontos de dados.
precisa saber é o seguinte
6

Do ponto de vista da interface do usuário e do UX, 30.000 pontos individuais em um mapa não são exatamente a melhor representação dos seus dados.

Você também pode optar por usar grades UTF8 sobre os dados de pontos rasterizados. No entanto, as resoluções da sua grade e a quantidade de pontos definitivamente tornarão a seleção de dados muito imprevisível e não o melhor UX. http://mapbox.com/developers/utfgrid/

Uma combinação de clusters OL com grades UTF8 seria interessante. Isso pode ser feito por um cluster de dados de tamanho de servidor que retorna clusters de varredura que podem ser selecionados através do uso de UTF8 Grids. Sua escolha de manipulação após esse ponto pode ser a ampliação adicional (como nos métodos clássicos de agrupamento de vetores do lado do cliente, como no OL). Você também pode processar alguns dados, como calcular o valor médio dentro desse cluster e apresentá-lo ao usuário.

Michael Markieta
fonte
2

Como já mencionado, 30.000 recursos através do OL são uma péssima idéia. Eu gerenciei 10.000 pontos usando a renderização de tela no Chrome e isso funcionou bem, mas a mudança para um marcador gráfico (.png) causou o rastreamento.

Eu só queria fornecer uma sugestão para sua abordagem do lado do servidor. Obviamente, você não pode pré-gerar todas as 300.000 permutações com antecedência e seu escopo provavelmente aumentará. Se você deseja usar um WMS com SLD, pode usar a seguinte abordagem para gerar qualquer mapa.

O cliente (por exemplo, OpenLayers) faz uma solicitação de imagem WMS ao servidor. O URL da solicitação inclui um parâmetro ...&SLD=http://app-server/sld?time=2010&measure=population...- aqui o parâmetro SLD é um URL (que precisaria ser codificado em URL) para gerar um SLD em tempo real. Quando o servidor WMS recebe sua solicitação, ele consulta seu servidor de aplicativos em busca de um SLD exclusivo e obtém uma resposta XML. Em seguida, gera a permutação solicitada pelo usuário.

Fiz isso com o GeoServer para WMS e PHP, gerando SLDs e o desempenho foi bom (mas não tive nenhuma razão para não ser, sua situação pode ser diferente).

tomfumb
fonte