├── README.md └── 基于网格的点抽稀算法 /README.md: -------------------------------------------------------------------------------- 1 | # point_dilution 2 | 利用plpgsql写的基于postgis的点抽稀算法,目前没有将表名单独封装出来,可以建函数之前手动改一下 *select * from tycd_view* ,只是提供一个思路大家参考 3 | -------------------------------------------------------------------------------- /基于网格的点抽稀算法: -------------------------------------------------------------------------------- 1 | --drop FUNCTION point_simplify_grid; 2 | CREATE OR REPLACE FUNCTION point_simplify_grid( 3 | PAR_minx double precision, 4 | PAR_miny double precision, 5 | PAR_maxx double precision, 6 | PAR_maxy double precision, 7 | PAR_threshold double precision 8 | ) RETURNS geometry AS $$ 9 | DECLARE 10 | REC_points RECORD; 11 | ARR_result_points geometry[]; 12 | GEO_point geometry; 13 | grid_key VARCHAR(10); 14 | GEOM_result geometry; 15 | grid_num_x INTEGER; 16 | grid_num_y INTEGER; 17 | grid_json jsonb; 18 | BEGIN 19 | grid_num_x := ceil((PAR_maxx - PAR_minx)/PAR_threshold); 20 | grid_num_y := ceil((PAR_maxy - PAR_miny)/PAR_threshold); 21 | grid_json :='{}'::jsonb; 22 | ARR_result_points :='{}'::geometry[]; 23 | for REC_points in select * from tycd_view where geom && st_makeenvelope(PAR_minx,PAR_miny,PAR_maxx,PAR_maxy,4326) LOOP 24 | grid_key := ceil((st_x(REC_points.geom)-PAR_minx)/PAR_threshold)||','||ceil((st_y(REC_points.geom)-PAR_miny)/PAR_threshold); 25 | if NOT(grid_json?grid_key) THEN 26 | ARR_result_points := array_append(ARR_result_points, st_setsrid(REC_points.geom,4326)); 27 | grid_json :=grid_json||('{"'||grid_key||'":true}')::jsonb; 28 | end if; 29 | end loop; 30 | GEOM_result := st_union(ARR_result_points); 31 | return GEOM_result; 32 | END; 33 | $$ LANGUAGE plpgsql; 34 | --select st_asgeojson(point_simplify_grid(73,3,135,53,0.2)) 35 | --------------------------------------------------------------------------------