Sobre mis datos de prueba:
- Al igual que OSM Road Data, cada geometría de la carretera termina en una encrucijada.
- Cada camino tiene una identificación única.
SOLUCION I
Si existen los dos supuestos:
Las carreteras están construyendo cuartos.
Estás trabajando en un sistema métrico.
La idea es aumentar / disminuir las coordenadas X e Y del punto. Si trabaja dentro de un sistema métrico, puede ir 1m al este de su punto, crear un nuevo punto y crear una línea con el punto original. Vas hacia el este hasta que la línea se cruza con una carretera. Para buscar una intersección en el oeste, debe restar 1 m de la coordenada X original. Lo mismo para la coordenada Y. Si no hay camino en el norte / este / sur / oeste, el mostrador se detiene en 1000 (m). Cuando sepa que podría haber una carretera a una distancia de más de 1000 m, debe cambiar este valor.
Puede resolver la tarea con el siguiente 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)
Otro ejemplo para mostrar que la carretera e en el Este no se reconoce como una carretera cercana al punto.
Cómo llamar a la función y salida:
>>>>reached('N', 1000)
road a
>>>>reached('E', 1000)
road b
>>>>reached('S', 1000)
road c
>>>>reached('W', 1000)
road d
Si hay más de 4 caminos que encierran el punto, debe mirar en más direcciones (cambie tanto X como Y). O podría cambiar el acimut de su línea, lo que significa que podría rotarlo un grado dentro del rango de 0-360 °.
SOLUCION II
Inspirado en el comentario, también puedes Polygonize
primero tus caminos. Para ello se puede utilizar una herramienta de QGIS: Processing > Toolbox > QGIS geoalgorithms > Vector geometry tools > Polygonize
. Cambie el nombre de la capa temporal a polygon
. Suponiendo que solo desea tener los nombres de las carreteras para el punto que está completamente encerrado por las carreteras. De lo contrario, usted tiene que utilizar SOLUCIÓN . ¡Esto solo funciona si todas las carreteras están conectadas!
Primero, el punto tiene que intersectarse con el polígono. La idea ahora es que ambos, el AND
punto final de inicio de una línea de cierre, deben cruzarse con el 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']
La salida:
road c
road b
road e
road f