Eu tenho um aplicativo em que o usuário desenha um caminho (uma série de linhas retas conectadas) e esse caminho pode não interceptar nenhum recurso em uma camada GeoJSON específica.
Preciso verificar se nenhum ponto ao longo dessas linhas cruza a camada GeoJSON, não apenas os pontos finais.
Como posso executar esta verificação?
Respostas:
Você pode tentar a biblioteca Turf e um método como intersect: http://turfjs.org/docs/#intersect
Aqui está o exemplo de código dessa biblioteca:
fonte
EDIT: Veja o violino de ghybs no comentário acima para obter uma solução mais simples e melhor usando turf.js. A resposta original segue:
Aqui está uma versão modificada da rotina de interseção da biblioteca geojson-js-utils que recebe as cadeias de linhas GeoJSON como entrada e produz pontos de GeoJSON de sua interseção como saída:
As modificações foram necessárias porque a função original era calcular interseções apenas a partir da latitude e longitude, como se fossem apenas coordenadas em um plano, produzindo resultados imprecisos (especialmente em altas latitudes ou longas distâncias). Usar
L.Projection
para converter em um sistema de coordenadas projetado conforme (ou, neste caso, quase conforme ) durante o cálculo corrige isso.Pode-se modificá-lo ainda mais para aceitar objetos de geometria Leaflet em vez de apenas LineStrings, mas usei essa função bastante pesada para criar LineStrings a serem passados para a função de interseção:
e esta função para pegar objetos Leaflet, convertê-los em LineStrings e verificar interseções:
Aqui está um exemplo de violino usando isso com o Leaflet.draw:
http://fiddle.jshell.net/nathansnider/egzxw86h/
Quando você terminar de desenhar um objeto, ele colocará marcadores no mapa nos pontos em que o objeto desenhado cruza com a geometria base. Ele não pode verificar interseções enquanto um caminho ainda está sendo desenhado, porque Leaflet.draw não nos fornece manipuladores de eventos para usar enquanto o desenho ainda está em andamento. Ele verificará assim que um evento de empate for concluído.
Observe também que isso não detectará interseções de caminhos que estejam inteiramente dentro de polígonos com os quais estão sendo verificados. Você pode fazer essas verificações usando turf.js (provavelmente combinando turf.explode com turf.within ).
fonte