Snap Line Layer zum Netzwerk in QGIS oder PostGIS

11

Ich habe GPS-Daten, die ich von Buslinien genommen habe, und jetzt möchte ich sie in mein Straßennetz einbinden. Beide Ebenen sind Linienebenen in einer PostGIS-Datenbank. Ich möchte entweder QGIS oder PostGIS verwenden, aber wenn ich mich für GRASS oder ArcMap entscheiden muss, ist das auch in Ordnung. Vielen Dank!

Zur Verdeutlichung versuche ich, Linien an Linien zu fangen, nicht Punkte an Linien.

Mattwigway
quelle

Antworten:

3

Früher hatte ich diese Funktion. Achten Sie darauf, dass die Geometrie in der vorhandenen Punktetabelle geändert wird. Ich habe es lange nicht benutzt, aber es scheint, als sollte es den Job machen. Soweit ich mich erinnere, funktioniert es gut, wenn Sie räumliche Indizes für beide Tabellen haben. Um es zu nennen

SELECT snap_point_to_line ('points_table', 'line_table', 500). Es schnappt mit einer Toleranz von 500, wobei 500 die Einheit Ihres Projektionssystems ist. Ich habe mit Lambert gearbeitet.

    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;
Fabien Ancelin
quelle
Vielen Dank; Gibt es eine Möglichkeit, diese Schnapplinien zu Linien zu machen? Ich denke nicht, dass die linearen Referenzierungsfunktionen funktionieren werden. (Ich habe der ursprünglichen Frage eine Klarstellung hinzugefügt).
Mattwigway