Sobre meus dados de teste:
- Como OSM Road Data, cada geometria de estrada termina em uma encruzilhada.
- Cada estrada tem um ID único.
SOLUÇÃO I
Se houver as duas suposições:
Estradas estão construindo quartos.
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.
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 Polygonize
rodar 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)!
Primeiro, o ponto deve se cruzar com o polígono. Agora, a idéia é que ambos, o AND
ponto 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