Obtenga todas las líneas que encierran un punto


12

Uso QGIS y tengo un punto y la red de carreteras. Necesito extraer automáticamente los nombres de las carreteras que encierran el punto específico. ingrese la descripción de la imagen aquí El análisis del vecino más cercano y las zonas de amortiguamiento no pueden hacer el trabajo, porque en muchos casos el punto está más cerca, como cuestión de distancia medida, a las carreteras vecinas y no a las cercanas. ¿Hay alguna idea sobre cómo solo se pueden extraer los caminos circundantes?


66
Tal vez, convierta el área de cerramiento (que consiste en una serie de líneas) en un polígono, con atributos de las carreteras que componen los muros del polígono; luego puede hacer una selección simple superponiendo la ubicación. En este ejemplo, el punto "145699" cae dentro del polígono "roada_roadb_roadc_roadd".
Map Man el

Respuestas:


3

Sobre mis datos de prueba:

  1. Al igual que OSM Road Data, cada geometría de la carretera termina en una encrucijada.
  2. Cada camino tiene una identificación única.

SOLUCION I

Si existen los dos supuestos:

  1. Las carreteras están construyendo cuartos.

  2. 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.

ingrese la descripción de la imagen aquí

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 Polygonizeprimero 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!

ingrese la descripción de la imagen aquí

Primero, el punto tiene que intersectarse con el polígono. La idea ahora es que ambos, el ANDpunto 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.