Estou procurando uma maneira eficiente de agrupar linhas independentemente de sua direção. Isso significa que uma linha entre Nova York e Los Angeles deve estar no mesmo cluster que uma linha na outra direção entre Los Angeles e Nova York. Os locais dos pontos de início e de término devem ser semelhantes (ou seja, San Diego para Long Island devem estar no mesmo cluster que LA-NY, mas provavelmente não San Francisco para Boston) e não há pontos intermediários. Os dados de entrada seriam semelhantes a este exemplo:
(Por Cassiopeia sweet na Wikipedia japonesa GFDL ou CC-BY-SA-3.0 , via Wikimedia Commons)
Eu já tentei classificar as linhas com antecedência, por exemplo, para executá-las todas de oeste para leste, mas isso não resolve o problema das linhas de norte para sul e vice-versa.
Você conhece algum algoritmo que lida com esse problema? Eu estive procurando, mas além do Algoritmo, para calcular a direção média dos segmentos não direcionados , não encontrei nada útil remotamente, por isso devo estar usando os termos de pesquisa incorretos.
fonte
Respostas:
Se bem entendi, você deseja agrupar linhas que são praticamente as mesmas, sem respeitar a direção.
Aqui está uma ideia que eu acho que poderia funcionar.
divida as linhas no ponto inicial e final
Agrupe os pontos e obtenha o ID do cluster
Encontre linhas com a mesma combinação de ID do cluster. Esses são um cluster
Isso deve ser possível no PostGIS (é claro :-)) versão 2.3
Não testei a função ST_ClusterDBSCAN, mas ela deve fazer o trabalho.
Se você tem uma tabela de linhas como esta:
E você deseja criar o cluster no qual os pontos inicial e final estão a 10 km, no máximo. E deve haver pelo menos 2 pontos para haver um cluster, então a consulta pode ser algo como:
Ao se juntar a
a.cluster_id<b.cluster_id
você, você obtém um ID de cluster comparável, independentemente da direção.fonte
Deseja realmente agrupar apenas por direção, sem nenhuma consideração de origem ou destino? Nesse caso, existem algumas maneiras muito simples. Talvez o mais fácil seja calcular o rumo de cada linha, dobrar isso e plotá-lo como um ponto em um círculo. Como os rolamentos para frente e para trás diferem em 180 graus, eles diferem em 360 graus após dobrar e, portanto, plotam exatamente no mesmo local. Agora agrupe os pontos no plano usando o método que desejar.
Aqui está um exemplo prático
R
, com sua saída mostrando as linhas coloridas de acordo com cada um dos quatro grupos. É claro que você provavelmente usaria um SIG para calcular os rolamentos - usei rolamentos euclidianos para simplificar.fonte
Seu esclarecimento da pergunta indica que você deseja que o cluster seja baseado nos segmentos de linha reais , no sentido de que quaisquer dois pares de origem-destino (OD) devem ser considerados "próximos" quando ambas as origens estão próximas e os dois destinos estão próximos , independentemente de qual ponto é considerado origem ou destino .
Essa formulação sugere que você já tenha uma noção da distância d entre dois pontos: pode ser a distância que o avião voa, a distância no mapa, o tempo de viagem de ida e volta ou qualquer outra métrica que não mude quando O e D são comutado. A única complicação é que os segmentos não têm representações únicas: eles correspondem a pares não ordenados {O, D}, mas devem ser representados como pares ordenados , (O, D) ou (D, O). Portanto, podemos tomar a distância entre dois pares ordenados (O1, D1) e (O2, D2) como uma combinação simétrica das distâncias d (O1, O2) ed (D1, D2), como sua soma ou o quadrado raiz da soma de seus quadrados. Vamos escrever essa combinação como
Basta definir a distância entre pares não ordenados como a menor das duas distâncias possíveis:
Nesse ponto, você pode aplicar qualquer técnica de agrupamento com base em uma matriz de distância.
Como exemplo, calculei todas as 190 distâncias ponto a ponto no mapa para 20 das cidades mais populosas dos EUA e solicitei oito agrupamentos usando um método hierárquico. (Para simplificar, usei cálculos de distância euclidiana e apliquei os métodos padrão no software que estava usando: na prática, você desejará escolher distâncias apropriadas e métodos de agrupamento para o seu problema). Aqui está a solução, com os clusters indicados pela cor de cada segmento de linha. (As cores foram atribuídas aleatoriamente aos clusters.)
Aqui está o
R
código que produziu este exemplo. Sua entrada é um arquivo de texto com os campos "Longitude" e "Latitude" para as cidades. (Para rotular as cidades na figura, também inclui um campo "Chave").fonte