Obter todas as linhas que incluem um ponto


12

Uso o QGIS e tenho um ponto e a rede rodoviária. Preciso extrair automaticamente os nomes das estradas que incluem o ponto específico. insira a descrição da imagem aqui A análise de vizinhos mais próximos e as zonas de amortecimento não podem fazer o trabalho, porque, em muitos casos, o ponto está mais próximo, por uma distância medida, das estradas vizinhas e não das estradas adjacentes. Há alguma idéia de como apenas as estradas adjacentes podem ser extraídas?


6
Talvez, converta a área delimitadora (que consiste em uma série de linhas) em um polígono, com atributos de quais estradas compõem as paredes do polígono - você pode fazer uma seleção simples pela localização sobreposta. Neste exemplo, o ponto "145699" se enquadra no polígono "roada_roadb_roadc_roadd".
Mapa Man

Respostas:


3

Sobre meus dados de teste:

  1. Como OSM Road Data, cada geometria de estrada termina em uma encruzilhada.
  2. Cada estrada tem um ID único.

SOLUÇÃO I

Se houver as duas suposições:

  1. Estradas estão construindo quartos.

  2. Você está trabalhando em um sistema métrico.

A idéia é aumentar / diminuir as coordenadas X e Y do ponto. Se você trabalha em um sistema métrico, pode ir 1 metro a leste do seu ponto, criar um novo ponto e criar uma linha com o ponto original. Você está indo para o leste até a linha cruzar uma estrada. Para procurar uma interseção no oeste, subtraia 1m da coordenada X original. O mesmo para a coordenada Y. Se não houver estrada no norte / leste / sul / oeste, o contador pára a 1000 (m). Quando você sabe que pode haver uma estrada a uma distância superior a 1000 m, você precisa alterar esse valor.

Você pode resolver a tarefa com o seguinte código:

Editado

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "point":
        startpoint = lyr

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "roads":
        roads = lyr

startpoint_iter = startpoint.getFeatures()
for feature in startpoint_iter:
    geom = feature.geometry()
    if geom.type() == QGis.Point:
        xy = geom.asPoint()
        x,y = xy[0], xy[1]

line_start = QgsPoint(x,y)      

def reached(direction, count_m):
    road_reached = None
    road = None
    count=1
    while road_reached < 1 and count <=count_m:
        count += 1
        if direction == 'N':
            line_end = QgsPoint(x, y+count)
        if direction == 'E':
            line_end = QgsPoint(x+count,y)
        if direction == 'S':
            line_end = QgsPoint(x,y-count)
        if direction == 'W':
            line_end = QgsPoint(x-count,y)
        line = QgsGeometry.fromPolyline([line_start,line_end])
        for f in roads.getFeatures():
            if line.intersects(f.geometry()):
                road_reached = 1
                road = f['name']
                print road

reached('N', 1000)
reached('E', 1000)
reached('S', 1000)
reached('W', 1000)

Outro exemplo para mostrar que a estrada e no leste não é reconhecida como uma estrada próxima do ponto.

insira a descrição da imagem aqui

Como chamar a função e a saída:

>>>>reached('N', 1000)
road a
>>>>reached('E', 1000)
road b
>>>>reached('S', 1000)
road c
>>>>reached('W', 1000)
road d

Se houver mais de 4 estradas que cercam o ponto, você deverá procurar mais direções (altere X e Y). Ou você pode alterar o azimute da sua linha, significa que você pode girá-lo em um grau dentro do intervalo de 0 a 360 °.

SOLUÇÃO II

Inspirado no comentário, você também pode Polygonizerodar primeiro. Porém você pode usar uma ferramenta de QGIS: Processing > Toolbox > QGIS geoalgorithms > Vector geometry tools > Polygonize. Renomeie a camada temporária para polygon. Supondo que você queira apenas ter os nomes das estradas para o ponto que está completamente fechado por estradas. Caso contrário, você tem que usar SOLUÇÃO . Isso só funciona se todas as estradas estiverem conectadas (quebradas)!

insira a descrição da imagem aqui

Primeiro, o ponto deve se cruzar com o polígono. Agora, a idéia é que ambos, o ANDponto final inicial de uma linha delimitadora, cruzem com o polígono.

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "point":
        startpoint = lyr

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "polygon":
        poly = lyr

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "roads":
        roads = lyr

for h in startpoint.getFeatures():
    for g in poly.getFeatures():
        if h.geometry().intersects(g.geometry()):
            poly_geom = g.geometry()
            for f in roads.getFeatures():
                geom = f.geometry().asPolyline()
                start_point = QgsGeometry.fromPoint(QgsPoint(geom[0]))
                end_point = QgsGeometry.fromPoint(QgsPoint(geom[-1]))
                if poly_geom.intersects(start_point) and poly_geom.intersects(end_point):
                    print f['name']

A saída:

road c
road b
road e
road f
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.