จัดเลเยอร์บรรทัดไปยังเครือข่ายใน QGIS หรือ PostGIS


11

ฉันมีข้อมูลจีพีเอสที่ฉันนำมาจากเส้นทางรถประจำทางและตอนนี้ฉันต้องการถ่ายมันให้กับเครือข่ายถนนของฉัน ทั้งสองเลเยอร์เป็นเลเยอร์บรรทัดใน PostGIS DB ฉันต้องการใช้ QGIS หรือ PostGIS แต่ถ้าฉันต้องใช้ GRASS หรือ ArcMap ก็ใช้ได้เช่นกัน ขอบคุณ!

เพื่อความกระจ่างแจ้งฉันพยายาม snap สายไปที่บรรทัดไม่ใช่ชี้ไปที่บรรทัด

คำตอบ:


3

ฉันเคยมีฟังก์ชั่นนี้ฉันใช้ ระวังการเปลี่ยนรูปทรงเรขาคณิตในตารางจุดที่มีอยู่ ฉันไม่ได้ใช้มันมานาน แต่ดูเหมือนว่ามันจะทำงานได้ดี เท่าที่ฉันจำได้ว่ามันทำงานได้ดีถ้าคุณมีดัชนีเชิงพื้นที่ทั้งสองตาราง เพื่อที่จะเรียกมันว่า

SELECT snap_point_to_line ('points_table', 'line_table', 500) มันจะ snap กับความอดทนของ 500, 500 เป็นหน่วยของระบบการฉายของคุณ ฉันเคยทำงานกับแลมเบิร์ต

    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;

ขอบคุณ; มีวิธีทำ snap บรรทัดนี้เพื่อบรรทัดหรือไม่ ฉันไม่คิดว่าฟังก์ชั่นอ้างอิงเชิงเส้นจะทำงานได้ (ฉันได้เพิ่มคำอธิบายให้กับคำถามเดิม)
mattwigway
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.