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.