Lidando com recursos sobrepostos no OpenLayers

14

Se os usuários criarem um recurso de polígono que se sobrepõe completamente a outro, como este…

… Então não há como você selecionar o recurso interno, ou seja, aquele sobreposto pelo outro. Atualmente, estou usando um simples SelectFeaturecomo este:

var select = new OpenLayers.Control.SelectFeature(
  [this.annotationLayer, this.controlPointsLayer], { 
    hover: true,
    renderIntent: "temporary"
    }
);
this.map.addControl(select);
select.activate();

Mas, obviamente, só consigo selecioná-lo para o recurso externo. Qual é a maneira típica de lidar com isso? Como posso possibilitar ao usuário selecionar também o recurso interno?

A solução mais simples provavelmente seria tornar o recurso externo apenas selecionável dentro da área que resta ao subtrair o recurso interno - mas não tenho idéia de como fazer isso.

slhck
fonte
1
Você precisa criar um índice z (Ordenação) - ver openlayers.org/dev/examples/ordering.html
Mapperz
Ufa, isso significa que eu teria que verificar manualmente todas as combinações possíveis de recursos em relação a sobreposições e atribuir um pedido z personalizado antes de carregá-los? Como ... ter uma função que determina se um recurso está completamente contido em outro?
Slhck
z-index ordenação não funciona
neogeomat

Respostas:

10

Poucas opções. Alguns mais loucos :-) do que outros. As estratégias básicas são

  • Recursos de cluster
  • Ocultar / mover o recurso principal
  • Envie o clique através do recurso principal

==>

  1. Ativar estratégia de clustering de recursos

  2. Implemente seu próprio algoritmo de clustering; portanto, quando um novo item é adicionado ou modificado, o algoritmo é executado novamente e faz uma verificação aninhada de loop for e n * n (-1) para ver o que se sobrepõe ao que - em seguida, modifique a propriedade do recurso para configurar uma lista de recursos sobrepostos e quando o usuário clicar no recurso, exiba uma lista de recursos que se sobrepõem e faça com que o usuário selecione o que realmente deseja clicar. Faz sentido?

  3. Em vez de implementar o recurso ao clicar, basta implementar um manipulador de cliques de mapa inteiro. E quando o usuário clicar, verifique na sua camada os recursos que se cruzam - e se houver um - exiba o pop-up desse cara e, se houver vários, exiba uma lista de prompt como no item 2 acima. Se nenhum se cruzar, basta ignorar.

  4. Implemente uma opção de clique com o botão direito do mouse para "ocultar" temporariamente um recurso para permitir acesso ao recurso oculto. Assim que clicar no próximo, reexiba todos os recursos ocultos

  5. Semelhante ao item 4, dentro do pop-up do recurso principal, adicione um item de menu / link para "ocultar" o recurso. E prossiga como no # 4.

  6. Da mesma forma que a # 4/5, implemente um clique com o botão direito do mouse em "movimento temporário" e clique em arrastar o recurso para fora do caminho [lembre-se do local antigo]. Em seguida, o usuário clica no recurso inferior e o superior volta à sua posição original.

Vadim
fonte