ArcGIS 10: Crie uma camada linear de evento a partir de uma camada de pontos com base na direcionalidade

8

Eu tenho uma camada de pontos que reflete os limites de velocidade e uma camada de linha das estradas. A localização do sinal de velocidade indica em qual direção o limite de velocidade se aplica.

Como posso criar uma tabela de eventos linear na parte superior da camada da estrada que reflete as velocidades? Portanto, para cada segmento, retorne dois atributos de velocidade, um para cada direção.

Camada de velocidade / estrada

dassouki
fonte
Você pode esclarecer "A localização do sinal de velocidade indica em qual direção o limite de velocidade se aplica"? Isso significa que, se o ponto estiver no lado direito da estrada (com base na direcionalidade da estrada), a velocidade se aplica à faixa da direita? A que distância da estrada está localizado o ponto?
Stephen Lead
@StephenLead Sim, o ponto de sinal está localizado 1 a 5m da camada de linha para indicar a direção em que a velocidade se aplica
dassouki
Existem outros atributos armazenados com os sinais de trânsito? Parece que você precisará encaixá-los nas estradas primeiro e, de alguma forma, transferir a direcionalidade da estrada para os sinais de trânsito, depois cortar linhas pelos vértices e transferir valores de atributos dos sinais para cada segmento. Apenas uma ideia. Pode ajudar se você postou os dados.
Jakub Sisak GeoGraphics
@ Jakub, o único atributo que quero do sinal de estrada é "posted_speed". A camada de sinal não tem informações sobre a direcionalidade
dassouki
Os suspiros têm outros atributos além da velocidade? Estou perguntando, porque poderia haver algo que possa ligar os sinais às estradas. Caso contrário, o que você deseja fazer não é possível sem inserir manualmente as placas nos segmentos de estrada, transferir atributos e dividir os segmentos de estrada. (você pode fazer isso programaticamente, mas as distâncias são variáveis, portanto, a automação total pode não ser possível) O resultado não será uma tabela independente, mas uma tabela de atributos para a qual todas essas informações serão transferidas.
Jakub Sisak GeoGraphics

Respostas:

3

Para camadas de eventos de rota lineares, é necessário criar uma tabela contendo o ID da rota e os valores m de início e fim.

Se suas estradas não tiverem valores m, você poderá criar rotas usando a ferramenta de criação de rotas .

O segundo passo é extrair os valores m de suas estradas para cada ponto, o que pode ser feito com o recurso de localização ao longo da estrada . Se vejo bem na sua figura, os pontos estão localizados no mesmo lado da estrada, se estiverem na mesma direção. Isso é ótimo porque você tem uma distância positiva ou negativa que indica de que lado você está.

A maneira mais fácil da última etapa é no Microsoft Excel:

  • Classifique seus pontos por roadIDe por sinal da distância até a rota
  • Adicione uma nova coluna com o m-valuedo próximo ponto (ou o ponto anterior, dependendo da direção).
  • Haverá um valor ausente no final que deve ser preenchido com 0 ou o máximo m-valuedo segmento.

EDIT: após a classificação, sua tabela ficará assim

 pointID RoadID mvalue dist speed
 15      2      25     1    80
 25      2      30     1    50
 87      2      45     12   70
 etc

Você vê que os pontos são classificados por m-valores. A terceira coluna no meu caso seria o início do evento. a nova camada de eventos deve ter fromum tocampo e. Então, no meu exemplo, ficaria assim:

pointID RoadID from to speed
15      2      25   30   80    
25      2      30   45   50    
87      2      45   max  70

na outra direção, seria

pointID RoadID from to speed    
15      2      0    25   80    
25      2      25   30   50    
87      2      30   45   70

Você pode criar sua camada de eventos usando o sinal como um campo de deslocamento para localizar a limitação de velocidade no lado correto das rotas.

radouxju
fonte
Até agora, isso está funcionando melhor que a outra solução. Você pode explicar a parte do Excel sobre como adicionar mais pontos anteriores e seguintes, por favor?
Dassouki 30/05
3

Não tenho representante suficiente para comentar, mas minha pergunta é se as estradas já estão ou não em segmentos que correspondem às zonas de velocidade, ou seja, cada segmento geralmente teria 1 velocidade associada a ela por lado ou mais de uma.

Independentemente disso, aqui está minha sugestão, apesar de depender de você ter um nível de licença que permita um buffer unilateral (avançado / ArcInfo, acredito). Um princípio semelhante poderia ser aplicado com ferramentas básicas, mas seria mais complexo. Além disso, espero que isso demore um pouco para ser executado ...

import arcpy
def TakeOutTrash(dataset):
    if arcpy.Exists(dataset):
        arcpy.management.Delete(dataset)
roads = "path/to/roads" #make sure it's in a projected crs with meter units
buff_right = "path/to/new/buffer/feature/class1" #new gdb feature class
buff_left = "path/to/new/buffer/feature/class2" #new gdb feature class
arcpy.analysis.Buffer(roads,buff_right,6,"RIGHT","FLAT")
arcpy.analysis.Buffer(roads,buff_left,6,"LEFT","FLAT")

Agora você tem amortecedores para cada lado de cada estrada, a 6 metros da linha central, que deve cobrir todos os sinais. Você pode fazer uma seleção fácil por local para garantir que esse seja o caso e, caso contrário, execute novamente as operações do buffer com 1 ou 2 metros extras.

Próximo:

final_dict = {}
buffers = [buff_right, buff_left]
for i, buffer in enumerate(buffers):
    rows1 = arcpy.SearchCursor(buffer)
    for row1 in rows1:
        final_dict[seg] = [[],[]]
        seg = str(row1.getValue("seg_num"))
        TakeOutTrash("fl")
        fl = arcpy.management.MakeFeatureLayer(buffer,"fl",'"seg_num" = ' + seg)
        arpcpy.management.SelectLayerByLocation(signs,"INTERSECT",fl)
        rows2 = arcpy.SearchCursor(signs)
        for row2 in rows2:
            final_dict[seg][i].append(row2.getValue("posted_speed"))

Então agora você tem um dicionário neste formato:

"seg_num":[[list of speeds on the right],[list of speeds on the left]]

a partir do qual você pode fazer o que quiser, por exemplo:

for k,v in final_dict.iteritems():
    print "road segment {0}:".format(str(k))
    print "   speeds on right: {0}".format(", ".join(v[0]))
    print "   speeds on left: {0}".format(", ".join(v[1]))

Ou teste apenas quantas velocidades existem em cada lado do segmento ou escreva nos campos da classe de estrada original, etc. Novamente, não tenho certeza se essa poderia ser uma solução final com os dados que você possui, mas poderia certamente funciona como parte disso. Eu pude vê-lo sendo usado em conjunto com o processo de encaixe / divisão descrito acima.

Para gravar na camada de estradas, você pode criar dois novos campos, SPD_RIGHT e SPD_LEFT, e por enquanto (a menos que você saiba com certeza que existe apenas uma velocidade por segmento), faça campos de texto. Então:

urows = arcpy.UpdateCursor(roads)
for row in urows:
    seg = row.getValue("seg_num")
    right_speeds = ", ".join(final_dict[seg][0])
    left_speeds = ", ".join(final_dict[seg][1])
    row.setValue("SPD_RIGHT",right_speeds)
    row.setValue("SPD_LEFT",left_speeds)
    urows.updateRows(row)

Obviamente, é ideal ter apenas uma velocidade por segmento, mas isso remonta à questão original de como os segmentos estão divididos atualmente.

mr.adam
fonte
Agora que você tem algum ponto a comentar; onde a camada de velocidade se encaixa? Eu entendi mal o seu comando de buffer?
Dassouki 28/05
ok eu adicionei um pouco mais à resposta. Espero entender o que você está procurando.
28414 mr.adam
os segmentos e velocidades podem não ser divididos da mesma maneira que os dados são coletados por duas entidades diferentes; além disso, um segmento pode ter velocidades diferentes em qualquer direção.
Dassouki 28/05
Ok, estou pensando agora que a melhor maneira de fazer isso é primeiro fazer um buffer do lado direito, 6m ou algo assim, e depois selecionar os sinais que se enquadram nele e extraí-los para uma nova classe de recurso de ponto. Dessa forma, você poderia ter uma classe de recurso para os sinais do lado direito e uma para os sinais do lado esquerdo.
mr.adam
A resposta de Jakub nos comentários é um bom ponto de partida em termos de definição de bons segmentos, e pode ser complementada com a minha, a fim de vincular as velocidades à direção da estrada.
28414 mr.adam