Mesclando várias linhas por campo de valor
Como posso juntar essas linhas dependendo do campo Trigger. A condição é a seguinte, os campos devem ser ordenados em ordem crescente após o campo fid de 1
a 68
. Assim, quero juntar todas as minhas linhas começando com a primeira que tem o gatilho 1 e as próximas que têm o valor 0
e terminam no primeiro valor com 1
e começam novamente.
Edit: eu entendo. Mas como posso resolver esse problema? Como unir essas linhas? O gatilho refere-se ao ângulo. Se for 0, então o ângulo entre 2 segmentos é menor que x graus, e se for 1, o ângulo é maior que x graus. Então, eu quero que se a primeira linha não for uma trigger, eu quero juntá-la com a primeira linha que é a trigger.
Respostas
Para dar uma ideia de como isso pode ser feito, aqui está uma solução em Python para adicionar um novo campo groupid, que você pode usar para dissolver suas linhas:
# Change your settings here:
layername = 'line'
triggerfield = 'Trigger' # field must already exist
groupfieldname = 'mygroup' # will be added if does not exist
newlineindicator = 1
#####
# no changes needed below #
#####
layer = QgsProject.instance().mapLayersByName(layername)[0] # get the layer
layer.startEditing() # start editing the layer
layer.dataProvider().addAttributes([QgsField(groupfieldname,QVariant.Int)]) # add a group field
layer.commitChanges() # save new added field to prevent crash when searching for it later
layer.startEditing() # start editing the layer again
groupid = 0 # initialize groupid
fieldindex = layer.fields().indexFromName(groupfieldname) # get fieldindex of groupfield
for feat in layer.getFeatures(): # itereate over layer
if feat[triggerfield] == newlineindicator: # if a new trigger appears, increase groupcounter
groupid += 1
attrs = { fieldindex : groupid } # prepare attributes
layer.dataProvider().changeAttributeValues({ feat.id() : attrs }) # assign current groupid to current feature
layer.commitChanges() # save changes
Resultado:

Existe uma maneira de criar diretamente um valor de campo usando uma expressão QGIS na calculadora de campo para agrupar todos os recursos que você deseja juntar. Com base no valor desse campo, você pode usar a função Aggregate
para unir recursos com o mesmo valor (veja a segunda captura de tela abaixo). As etapas de bots devem ser fáceis de automatizar com um modelo.
Pegando sua estrutura de dados e nomes de campo, a expressão se parece com isto (veja abaixo a explicação de como a expressão funciona):
array_last (
array_sort (
array_foreach (
array_remove_all (
array_agg (
if (
"trigger" = 1,
"fid" ,
0
)
) ,
0) ,
if (
if (
"trigger" = 1,
"fid" ,
0
) = @element,
@element,
if (
"fid" > @element ,
@element,0
)
)
)
)
)

Então, você pode usar este campo junto com a função Menu Processing / Toolbox / Aggregate
para unir esses recursos.

Para explicar a ideia por trás da expressão: para melhor compreensão, vamos chamar o "segmento inicial" da linha unida que você finalmente deseja obter de " cabeça " - e os segmentos subsequentes que estão unidos a ela de " caudas ".
Obtenha os valores fid das cabeças , vamos chamá-los de " ids de grupo ". O objetivo final é atribuir cada segmento da cauda a uma cabeça (ou: cada cauda deve receber o valor de id de grupo da próxima cabeça menor : 2 e 3 devem ser atribuídos a 1, 5 e 6 a 4, etc.) a) Se o gatilho for 1 ( cabeça ), obtenha o valor do id: este é o id do grupo . Caso contrário (para caudas ) defina um valor de 0. b) Agregue esses valores criando uma matriz. c) Remova todos os valores 0 da matriz. Assim, obtemos uma matriz de ids de grupo (= fid de cabeças ): [1,4,7,9,12]. Finalmente, queremos atribuir cada recurso a um desses valores da matriz.
Agora itere sobre todos os recursos da camada com cada um desses ids de grupo do array com a expressão
array_foreach
: a) Para os recursos com gatilho = 1 ( cabeças ), não temos nenhum problema, eles já têm o id de grupo correto (correspondente a seu fid) b) Nos outros casos ( caudas , gatilho = 0), devemos atribuir novos valores. Assim, comparamos cada valor de entrada da matriz (lista de todos os ids de grupo ) com o fid e mantemos o id de grupo se for menor que o fid (como queremos atribuir ao próximo valor menor). Caso contrário, o definimos como 0. Portanto, em nenhum caso resultará um valor do array maior que o fid.Classifique a matriz para ter certeza de que temos os valores na ordem certa (do menor para o maior) - para remover os zeros finais da última postagem (veja a imagem abaixo). Sem definir uma ordem de classificação, obtemos o valor padrão
ascending=true
.Obtenha o último valor da matriz classificada, portanto, o último (maior) group-id que é (lembre-se da etapa 2b) em nenhum caso maior que fid AND (no caso de trigger = 1) é igual a fid (etapa 2a) AND é sempre um número da matriz que criamos em 1.
Veja uma captura de tela para os resultados intermediários das etapas 1 e 2:

Agora é fácil usar a função de agregação com o campo criado conforme descrito acima.