I think so.

I was planning to give it a try in the mapnik2 version.

> -----Mensaje original-----
> De: Dane Springmeyer [mailto:[email protected]]
> Enviado el: lunes, 07 de junio de 2010 3:28
> Para: Clos Crespo, Manel
> CC: [email protected]
> Asunto: Re: [Mapnik-users] [SOLVED] TextSymbolizer label
> placement for polygon
>
> Should we add point_on_surface support to Mapnik's Symbolizers?
>
> Dane
>
>
> On May 31, 2010, at 4:15 AM, <[email protected]>
> <[email protected]> wrote:
>
> > This took a while to automate because of GDAL 1.5, so here it is:
> >
> > If you think this fits in the TextSymbolizer documentation
> (http://trac.mapnik.org/wiki/TextSymbolizer), just tell me.
> Corrections welcomed.
> >
> > PostGIS only
> > ============
> >
> > TextSymbolizer with polygon geometries:
> >
> > Default position for labels in polygons is polygon's
> centroid. If you want your label to be placed on the surface
> of the polygon you can use the ST_PointOnSurface function.
> >
> > 1. Create a geometry field "point_on_surface" in the same
> table/layer
> > 2. Run "update table_with_polygons set
> point_on_surface=ST_PointOnSurface(the_geom)" on your database
> > 3. Use the generated points to draw the labels
> >
> > Would you like to automate this, use a trigger to call a
> function like:
> >
> > <code>
> > CREATE OR REPLACE FUNCTION coloma_point_on_surface()
> RETURNS "trigger" AS
> > $BODY$
> > BEGIN
> >  NEW.point_on_surface:=ST_PointOnSurface(NEW.the_geom);
> >  RETURN NEW;
> > END;
> > $BODY$
> > LANGUAGE 'plpgsql' VOLATILE;
> > ALTER FUNCTION coloma_point_on_surface() OWNER TO postgres;
> >
> > CREATE TRIGGER table_with_polygons_point_on_surface
> > BEFORE INSERT OR UPDATE ON table_with_polygons FOR EACH ROW
> > EXECUTE PROCEDURE coloma_point_on_surface();
> > </code>
> >
> >
> > Workaround for GDAL < 1.6.0:
> >
> >  * GDAL < 1.6.0 won't let you select which column to use
> for the geometry, so perhaps selecting
> >    the "point_on_surface" geometry field as the main geometry.
> >
> > 1. Create a Character Varying field "point_on_surface"
> > 2. Modify the above code to look like this:
> >
> > <code>
> > -- Use ST_GeomFromText('point_on_surface', SRS) to get the
> geometry back
> > --   where SRS is the same as the layer SRS, i.e. 23031
> > CREATE OR REPLACE FUNCTION coloma_point_on_surface()
> RETURNS "trigger" AS
> > $BODY$
> > BEGIN
> >  -- Store geometry as text so GDAL uses "the_geom" as the
> feature geometry
> >  NEW.point_on_surface:=ST_AsText(ST_PointOnSurface(NEW.the_geom));
> >  RETURN NEW;
> > END;
> > $BODY$
> > LANGUAGE 'plpgsql' VOLATILE;
> > ALTER FUNCTION coloma_point_on_surface() OWNER TO postgres;
> >
> > CREATE TRIGGER table_with_polygons_point_on_surface
> > BEFORE INSERT OR UPDATE ON table_with_polygons FOR EACH ROW
> > EXECUTE PROCEDURE coloma_point_on_surface();
> > </code>
> >
> >
> >
> >> -----Mensaje original-----
> >> De: [email protected]
> >> [mailto:[email protected]] En nombre de
> >> [email protected]
> >> Enviado el: lunes, 31 de mayo de 2010 10:17
> >> Para: [email protected]
> >> CC: [email protected]
> >> Asunto: Re: [Mapnik-users] TextSymbolizer label placement
> for polygon
> >>
> >> Hi Numenor,
> >>
> >> ST_PointOnSurface helped a lot. It first killed postgres
> >> because I tried using it directly in the SQL for ogcserver. I
> >> tried adding a new field "point_on_surface" and updating it.
> >> It works flawlessly!
> >>
> >> Still, this is not as optimal as a good label placement
> >> algorithm, but will work meanwhile...
> >>
> >> And by the way, the polygon inside polygon ended being an
> >> internal polygon sharing limits with the bigger one, but NOT
> >> overlapping. So this is "solved" too.
> >>
> >> Thank you very much for your help!
> >>
> >>
> >>> -----Mensaje original-----
> >>> De: numenor [mailto:[email protected]]
> >>> Enviado el: viernes, 28 de mayo de 2010 14:55
> >>> Para: Clos Crespo, Manel
> >>> CC: [email protected]
> >>> Asunto: Re: [Mapnik-users] TextSymbolizer label placement
> >> for polygon
> >>>
> >>> Hi Manel,
> >>>
> >>> On Fri, 28 May 2010 14:21:08 +0200,
> <[email protected]> wrote:
> >>>> I've two problems with label placement:
> >>>>
> >>>> 1) When the centroid is outside of the polygon the label
> >>> will appear to
> >>> be
> >>>> labeling just another polygon (confusing).
> >>>
> >>> Maybe the SQL extension function 'ST_PointOnSurface' can
> >> help you (at
> >>> least as a workaround), if you use PostGIS as data source.
> >> For a given
> >>> surface, this function returns a point which is guaranteed to
> >>> lie on the
> >>> surface. It does not guarantee any more, but with PostGIS,
> >> for me for
> >>> convex shapes the labels appear similarly placed as when
> >>> using ST_Centroid
> >>> (or mapnik's algorithm), more or less in the middle.
> >>>
> >>>> 2) When a polygon is inside a bigger one, and they both
> >>> have a similar
> >>>> centroid, both labels will end in the smaller polygon (really
> >>> confusing),
> >>>> and the bigger one will appear to have no label at all
> >>> (more confusion).
> >>>
> >>> Is this problem solvable at all, in general? What if the
> >>> outer polygon is
> >>> completely covered by smaller polygons?
> >>>
> >>> If this can happen, maybe a better solution would be to label
> >>> the border
> >>> of the polygon, as is often done for borders between
> administrative
> >>> entities.
> >>>
> >>> If you know which smaller polygons lie inside the bigger one,
> >>> you could
> >>> subtract their area from the bigger one, and then use
> >>> ST_PointOnSurface on
> >>> the result to get the point for placement of the label.
> >> This might of
> >>> course be computationally expensive ...
> >>>
> >>> Hope this helps,
> >>> --
> >>> Holger Schöner - [email protected]
> >>>
> >> _______________________________________________
> >> Mapnik-users mailing list
> >> [email protected]
> >> https://lists.berlios.de/mailman/listinfo/mapnik-users
> >>
> > _______________________________________________
> > Mapnik-users mailing list
> > [email protected]
> > https://lists.berlios.de/mailman/listinfo/mapnik-users
>
>
_______________________________________________
Mapnik-users mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/mapnik-users

Reply via email to