Đưa lớp đường dây vào mạng trong QGIS hoặc PostGIS


11

Tôi có dữ liệu GPS tôi đã thực hiện trên các tuyến xe buýt và bây giờ tôi muốn đưa nó vào mạng lưới đường bộ của mình. Cả hai lớp đều là các lớp dòng trong DB PostGIS. Tôi muốn sử dụng QGIS hoặc PostGIS, nhưng nếu tôi phải dùng GRASS hoặc ArcMap, điều đó cũng ổn. Cảm ơn!

Để làm rõ, tôi đang cố gắng để dòng đến dòng, không chỉ vào dòng.

Câu trả lời:


3

Tôi đã từng có chức năng này tôi đã sử dụng. Hãy cẩn thận nó thay đổi hình học trong bảng điểm hiện có. Tôi đã không sử dụng nó trong một thời gian dài nhưng có vẻ như nó nên thực hiện công việc. Theo tôi nhớ nó hoạt động tốt nếu bạn có các chỉ mục không gian trên cả hai bảng. Để gọi nó

CHỌN snap_point_to_line ('points_table', 'line_table', 500). Nó sẽ chụp với dung sai 500, 500 là đơn vị của hệ thống chiếu của bạn. Tôi đã từng làm việc với 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;

Cảm ơn; Có cách nào để tạo dòng snap này thành dòng? Tôi không nghĩ các hàm tham chiếu tuyến tính sẽ hoạt động. (Tôi đã thêm một làm rõ cho câu hỏi ban đầu).
mattwigway
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.