Ottieni tutte le linee che racchiudono un punto


12

Uso QGIS e ho un punto e la rete stradale. Devo estrarre automaticamente i nomi delle strade che racchiudono il punto specifico. inserisci qui la descrizione dell'immagine L'analisi dei vicini più vicini e le zone cuscinetto non possono svolgere il compito, poiché in molti casi il punto è più vicino, per quanto riguarda la distanza misurata, alle strade vicine e non a quelle circostanti. Ci sono idee su come estrarre solo le strade circostanti?


6
Forse, converti l'area racchiusa (composta da una serie di linee) in un poligono, con gli attributi di quali strade compongono le pareti del poligono - quindi puoi fare una semplice selezione sovrapponendo la posizione. In questo esempio, il punto "145699" rientra nel poligono "roada_roadb_roadc_roadd".
Map Man,

Risposte:


3

Informazioni sui miei dati di test:

  1. Come OSM Road Data, ogni singola geometria stradale termina a un bivio.
  2. Ogni strada ha un ID univoco.

SOLUZIONE I

Se ci sono due ipotesi:

  1. Le strade stanno costruendo quartieri.

  2. Stai lavorando in un sistema metrico.

L'idea è di aumentare / diminuire le coordinate X e Y del punto. Se lavori all'interno di un sistema metrico puoi andare 1 m verso est del tuo punto, creare un nuovo punto e creare una linea con il punto originale. Stai andando più a est fino a quando la linea non interseca una strada. Per cercare un incrocio in Occidente devi sottrarre 1 m dalla coordinata X originale. Lo stesso per la coordinata Y. Se non vi è strada a nord / est / sud / ovest, il contatore si ferma a 1000 (m). Quando sai che potrebbe esserci una strada entro una distanza di oltre 1000 m devi cambiare questo valore.

È possibile risolvere l'attività con il seguente codice:

Modificato

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)

Un altro esempio per dimostrare che la strada e in Oriente non è riconosciuta come una strada vicina del punto.

inserisci qui la descrizione dell'immagine

Come chiamare la funzione e l'output:

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

Se ci sono più di 4 strade che racchiudono il punto, devi guardare in più direzioni (cambia sia X che Y). Oppure potresti cambiare l'azimut della tua linea, significa che potresti ruotarlo di un grado nell'intervallo 0-360 °.

SOLUZIONE II

Ispirato al commento, puoi anche Polygonizeprima le tue strade. Perciò è possibile utilizzare uno strumento da QGIS: Processing > Toolbox > QGIS geoalgorithms > Vector geometry tools > Polygonize. Rinominare il layer temporaneo in polygon. Supponendo di voler avere solo i nomi delle strade per il punto che è completamente racchiuso tra le strade. In caso contrario, è necessario utilizzare SOLUZIONE . Funziona solo se tutte le strade sono collegate (scattate)!

inserisci qui la descrizione dell'immagine

Innanzitutto il punto deve intersecarsi con il poligono. L'idea è ora che entrambi, il ANDpunto finale iniziale di una linea chiusa deve intersecarsi con il poligono.

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']

Il risultato:

road c
road b
road e
road f
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.