Aggancia il livello di linea alla rete in QGIS o PostGIS


11

Ho i dati GPS che ho preso sulle rotte degli autobus e ora vorrei collegarli alla mia rete stradale. Entrambi i livelli sono livelli di linea in un DB PostGIS. Vorrei usare QGIS o PostGIS, ma se devo usare GRASS o ArcMap, va bene lo stesso. Grazie!

Per chiarire, sto cercando di agganciare le linee alle linee, non i punti alle linee.

Risposte:


3

Avevo questa funzione che ho usato. Fare attenzione cambia la geometria nella tabella dei punti esistente. Non lo uso da molto tempo, ma sembra che dovrebbe fare il lavoro. Per quanto ricordo, funziona bene se si hanno indici spaziali su entrambe le tabelle. Per chiamarlo

SELECT snap_point_to_line ('points_table', 'line_table', 500). Si spezzerà con una tolleranza di 500, 500 essendo l'unità del sistema di proiezione. Lavoravo con Lambert.

    CREATE OR REPLACE FUNCTION snap_point_to_line(points_table character varying, line_table character varying, tolerance double precision)
      RETURNS boolean AS
    $BODY$
    DECLARE         
            srid integer;
            i integer;

            row record;
            row_1 record;
            closest_distance double precision;

            query varchar;
            snapped_point geometry;
    BEGIN

      --Get the srid of the points table
        FOR row IN EXECUTE 'select getsrid(the_geom) as srid from '||points_table||' where gid = (select min(gid) from '||points_table||')' LOOP
        END LOOP;
        srid := row.srid;


     -- Add a column in which it will store the closest nodes from the line
     FOR row IN EXECUTE 'SELECT the_geom FROM '||points_table LOOP

        query := 'SELECT ST_Transform(the_geom,'||srid||') as the_geom, ST_Distance(GeometryFromText('''||ST_AsText(row.the_geom)||''','||srid||'), ST_Transform(the_geom,'||srid||')) as distance FROM ' ||line_table||' ORDER BY ST_Distance(GeometryFromText('''||ST_AsText(row.the_geom)||''','||srid||'), ST_Transform(the_geom,'||srid||'))  LIMIT 1';
        RAISE NOTICE '%',query; 
        FOR row_1 IN EXECUTE query LOOP
            closest_distance := row_1.distance;

            --If below the distance threeshold, then snap the point
            IF closest_distance < tolerance THEN
                snapped_point := ST_line_interpolate_point(ST_LineMerge(row_1.the_geom),ST_line_locate_point(ST_LineMerge(row_1.the_geom), row.the_geom));

                --UPDATE the_geometry
                EXECUTE 'UPDATE '||points_table||' SET the_geom = GeometryFromText('''||ST_AsText(snapped_point)||''','||srid||') WHERE ST_AsText(the_geom) = '''||ST_AsText(row.the_geom)||'''';

            END IF;
END LOOP;   
    END LOOP;
    RETURN true;
    END;
   $BODY$
    LANGUAGE 'plpgsql' VOLATILE STRICT
    COST 100;
    ALTER FUNCTION snap_point_to_line(character varying, character varying, double precision) OWNER TO yourowner;

Grazie; c'è un modo per rendere questo snap linee a linee? Non credo che le funzioni di riferimento lineare funzioneranno. (Ho aggiunto un chiarimento alla domanda originale).
Mattwigway,
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.