QGIS 또는 PostGIS에서 네트워크에 라인 레이어 스냅


11

버스 노선에서 가져온 GPS 데이터가 있는데 도로 네트워크에 스냅하고 싶습니다. 두 레이어는 PostGIS DB의 라인 레이어입니다. QGIS 또는 PostGIS를 사용하고 싶지만 GRASS 또는 ArcMap과 함께 가야한다면 괜찮습니다. 감사!

명확히하기 위해 선을 가리 키지 않고 선을 스냅하려고합니다.

답변:


3

나는이 기능을 사용했다. 기존 점 테이블에서 형상이 변경되도록주의하십시오. 나는 오랫동안 그것을 사용하지 않았지만 그것이 일을 해야하는 것처럼 보입니다. 내가 기억하는 한 두 테이블에 공간 인덱스가 있으면 잘 작동합니다. 그것을 호출하기 위해

snap_point_to_line ( 'points_table', 'line_table', 500)을 선택하십시오. 프로젝션 시스템의 단위 인 500, 500의 공차로 스냅됩니다. 나는 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;

감사; 이 스냅 라인을 라인에 만드는 방법이 있습니까? 선형 참조 기능이 작동하지 않는다고 생각합니다. (원래 질문에 설명을 추가했습니다).
mattwigway
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.