For one of our applications, we need 8-point compass roses placed at each of our points, as well as a circle 40 meters in diameter as well as one 140 meters in diameter. We did a bit of work with this a while back in GeoServer using SLDs. Now we’d like to refine it, and implementing this in an SLD is beyond my skills.
So, we move to the back end. The following is a little function to construct the roses for us, which we’ll then display though GeoServer. Just an FYI, this is running on a PostGIS 1.3 database, and I didn’t (at the time anyway) grok the use of ST_RotateZ, so there are some explicit position calls, rather than just creating the crosshairs and rotating it:
CREATE OR REPLACE FUNCTION pie ( geom Geometry, filling numeric, crust numeric ) RETURNS Geometry AS $$ DECLARE slices Geometry; BEGIN --slices = ST_MakeLine(geom, ST_Translate(geom, dough, pan)); slices = ST_Union( ST_Collect( ST_Collect( ST_Collect( ST_MakeLine(ST_Translate(geom, filling, 0), ST_Translate(geom, crust, 0)) ,ST_MakeLine(ST_Translate(geom, 0, filling), ST_Translate(geom, 0, pi()/4 * crust)) ) ,ST_Collect( ST_MakeLine(ST_Translate(geom, -filling, 0), ST_Translate(geom, pi()/4 * -crust, 0)) ,ST_MakeLine(ST_Translate(geom, 0, -filling), ST_Translate(geom, 0, pi()/4 * -crust)) ) ) ,ST_Collect( ST_Collect( ST_MakeLine(ST_Translate(geom, filling * pi()/4, filling * pi()/4), ST_Translate(geom, crust * pi()/4, crust * pi()/4)) ,ST_MakeLine(ST_Translate(geom, -filling * pi()/4, filling * pi()/4), ST_Translate(geom, -crust * pi()/4, crust * pi()/4)) ) ,ST_Collect( ST_MakeLine(ST_Translate(geom, filling * pi()/4, -filling * pi()/4), ST_Translate(geom, crust * pi()/4, -crust * pi()/4)) ,ST_MakeLine(ST_Translate(geom, -filling * pi()/4, -filling * pi()/4), ST_Translate(geom, -crust * pi()/4, -crust * pi()/4)) ) ) ) ,ST_Collect( ST_ExteriorRing(ST_Buffer(geom, filling, 32)) ,ST_ExteriorRing(ST_Buffer(geom, crust, 32)) ) ) ; RETURN slices; END; $$ LANGUAGE plpgsql;
So now to test it with a single point:
DROP TABLE IF EXISTS test_pie; CREATE TABLE test_pie AS SELECT pie(ST_MakePoint(0,0), 40, 140);
And view in uDig, or application of choice: