Como simplificar (reduzir o número de pontos) no KML?
-
08-07-2019 - |
Pergunta
Eu tenho um problema semelhante a esta postagem. Preciso exibir até 1000 polígonos em um mapa do Google incorporado. Os polígonos estão em um banco de dados SQL, e eu posso renderizar cada um como um único arquivo KML em tempo real usando um httphandler personalizado (em asp.net), como este http://alpha.foresttransparency.org/concession.1.kml .
Mesmo na minha máquina de desenvolvimento (muito rápida), leva um tempo para carregar até algumas dezenas de formas. Então, duas perguntas, realmente:
Qual seria uma boa estratégia para torná -los como marcadores em vez de sobreposições quando estiver além de um certo nível de zoom?
Existe um algoritmo disponível ao público para simplificar um polígono (reduzindo o número de pontos) para que não esteja mostrando mais pontos do que fazer sentido em um certo nível de zoom?
Solução
Para sua segunda pergunta: você precisa do Algoritmo de generalização de Douglas-Peucker
Outras dicas
Para sua primeira pergunta, você poderia calcular a área de um polígono específico e relacionar cada nível de zoom a uma área mínima específica; portanto, à medida que o zoom dentro ou para fora do polígono desaparece e os marcadores aparecem dependendo do nível de zoom.
Para a segunda pergunta, eu usaria a sugestão de Mark Bessey.
Não conheço muito AOBUT KML, mas acho que a solução usual para a pergunta nº 2 envolve a iteração dos pontos e excluindo qualquer segmentos de linha sob um determinado tamanho. Isso causará alguns efeitos "infelizes" em alguns casos, mas é relativamente rápido e fácil de fazer.
Eu recomendaria 2 coisas: - Calcule e combine polígonos que são tocantes. Isso envolve muito processamento e matemática difícil, mas eu fiz isso, então sei que é possível. - Crie sua própria sobreposição em vez de usar o KML no formato PNG, enquanto você os combina na sugestão anterior. Você terá que criar muitos PNGs, mas está acendendo rapidamente no cliente.
Boa sorte :)
Eu precisava de uma solução para sua pergunta nº 2 há pouco e depois de olhar para alguns dos algoritmos de simplificação de linha disponíveis, criei o meu.
O processo é simples e parece funcionar bem, embora possa ser um pouco lento se você não implementar corretamente:
P[0..n]
É sua variedade de pontos, deixe T[n]
ser definido como o triângulo formado por pontos P[n-1], P[n], P[n+1]
Max
é o número de pontos para os quais você está tentando reduzir essa linha.
- Calcule a área de cada triângulo possível
T[1..n-1]
no conjunto. - Escolha o triângulo
T[i]
Com a menor área - Remova o ponto
P[i]
Para achatar essencialmente o triângulo - Recalcular a área dos triângulos afetados
T[n-1], T[n+1]
- Vá para a etapa 2 se o número de pontos>
Max