Mapscript - Sorting labels

Bill Binko bill at BINKO.NET
Wed Jun 8 15:17:59 PDT 2005


On Wed, 8 Jun 2005, marc wrote:

> Hi,
> 
> I have a shapefile (points) which contains cities names. For each town, a
> field contains the population number.
> I would like to renderer my map with cities names. I use Mapserver's stuff
> to avoid name collisions. I use the population field to do some filtering.
> I use PHP-Mapscript.
> 
> Here is a pseudo algorithm:
> 
> IF map_extent > 180 THEN render shapes with population > 5000k
> ELSE IF map_extent > 90 THEN render shapes with population > 2500k
> ELSE IF map_extent > 45 THEN render shapes with population > 1000k
> ...
> 
> When the current map extent fits the first condition, it's fine.
> But for the others conditions, all matching shapes are rendered but without
> any sort between them.
> 
> For the second condition, I would like to render first the shapes with pop
> > 5000k, then next the shapes with 5000k > pop > 2500k.
> 
> If I use 2 classes in a same layer, it is not working. I can have names of
> towns which are in the range [2500k-5000k] and no name in the range > 5000k
> (I suppose that there are towns with pop > 5000k, but the Mapserver
> collision treatment filters them).
> So I cannot guarantee that cities with pop > 5000k are first displayed. And
> next, cities with population in the range [2500k-5000k].
> 
> I get the same issue with 2 layers and a FILTER attribute on each layer.
> 

I'm sure there are lots of ways to implement this, but I recently did 
something similar using ogr2ogr to split the shapefile.  It also has the 
side benefit of making the zoomed out layers much faster.

You might get away with 

$ ogr2ogr -where "population > 1000000" cities10.shp cities.shp
$ ogr2ogr -where "population > 2500000" cities25.shp cities.shp
$ ogr2ogr -where "population > 5000000" cities50.shp cities.shp

Then you just create three layers with different maxscales.

Bill



More information about the MapServer-users mailing list