geoc_wgs84togcj02_polygon.sql 1.1 KB

1234567891011121314151617181920212223242526272829
  1. CREATE OR REPLACE FUNCTION "public"."geoc_wgs84togcj02_polygon"("source_geom" "public"."geometry")
  2. RETURNS "public"."geometry" AS $BODY$
  3. DECLARE
  4. target_parts geometry[];
  5. source_npoints integer;
  6. single_line geometry;
  7. single_line_trans geometry;
  8. single_polygon geometry;
  9. final_geom geometry;
  10. BEGIN
  11. IF ST_GeometryType(source_geom) != 'ST_Polygon' THEN
  12. RETURN source_geom;
  13. END IF;
  14. FOR single_polygon IN SELECT ST_ExteriorRing ((st_dumprings($1)).geom) as geom LOOP
  15. source_npoints := ST_NPoints(single_polygon);
  16. single_line := ST_RemovePoint(single_polygon, source_npoints - 1);
  17. single_line_trans := geoc_wgs84togcj02_line(single_line);
  18. target_parts := array_append(target_parts, ST_AddPoint(single_line_trans, ST_PointN(single_line_trans, 1)));
  19. END LOOP;
  20. SELECT ST_MakePolygon(target_parts[1], target_parts[2:array_upper(target_parts, 1)]) INTO final_geom;
  21. -- raise NOTICE 'final_geom: %',final_geom;
  22. RETURN final_geom;
  23. END;
  24. $BODY$
  25. LANGUAGE plpgsql VOLATILE
  26. COST 100