Proposed RFC on COLORRAMP Support (Bug 13 05)

Stephen Woodbridge woodbri at SWOODBRIDGE.COM
Tue Sep 27 18:11:48 EDT 2005


Bill Binko wrote:
> Steve,
> 
> When you say, "You don't know how many breaks", perhaps I'm 
> misunderstanding you.  How do you get the break values into %breaks%?  I 
> was under the assumption that someone was choosing a drop-down that had 
> strings with the breaks in them.  Certainly if that's the case, you know 
> how many there are at runtime.

You do not know at the time you create your mapfile.

> I know you don't like this answer, but this also seems to be easily doable
> in Mapscript.
> 
> As for you idea of making this a "discrete" METHOD, I am OK with that.  In 
> fact, the INTERVALS keyword could be reused as follows:
> 
> COLORRANGE
>   ...
>   METHOD 'linear'
>   INTERVALS 10 #10 equals partitions
> END
> 
> COLORRANGE
>   ...
>   METHOD 'discrete'
>   INTERVALS 0 10 25 50 75 100 #exact value boundaries
> END
> 
> If that were the case, this would not conflict with the other discussions 
> we're having about where these things lived.

This would work for me if any value v:
0  <= v < 10 => color 1
10 <= v < 25 => color 2
etc.

and then you could do a legend like

[color1] "0  <= v < 10"
[color2] "10 <= v < 25"
etc.

and the intervals could be floats of ints.

-Steve W.

> Bill
> 
> On Tue, 27 Sep 2005, Stephen Woodbridge wrote:
> 
> 
>>Bill,
>>
>>Your example below works fine if you know the number of breaks ahead of 
>>time, the big problem is that you do not. If you want to export a 
>>control to the user to select the number of class breaks and then that 
>>is applied to a classification algorithm which may return less than the 
>>number requested, there is no way to deal with that under you scheme 
>>that I can see.
>>
>>Personally, I would like to move away from defining lots of classes for 
>>this. The example mapfile was just how I had to do it now given the 
>>tools that were available. If you classify into say 5 breaks and use the 
>>ten classes I have defined you only get half way up the ramp or you have 
>>to define multiple LAYER blocks each with a different number of breaks 
>>and then turn on only the lay with the correct number of breaks, which 
>>is kind of crazy.
>>
>>I guess in general the big difference is whether you need to work with 
>>continuous gradient ramps or discrete step ramps, with a variable number 
>>of steps. In discrete steps each step has a value range and distribution 
>>does not need to be linear.
>>
>>You have spec'd a continuous value ramp, and forcing values into integer 
>>step gets you part of the way there at the cost of the values. If you 
>>implemented what you have spec'd and added the RAMPBREAKS or whatever as 
>>an option all you would do code wise if convert the value to a integer 
>>for your continuous ramp using a loop on the RAMPBREAKS and generate a 
>>different styled legend maybe similar to my example in html. If the 
>>RAMPBREAKS is absent then it is a continuous ramp. Maybe this should be 
>>METHOD 'Discrete'.
>>
>>-Steve W.
>>
>>Bill Binko wrote:
>>
>>>Stephen, I thought your example would be a good test case to show how you 
>>>would get what you wanted using the ColorRamp as defined in the RFC.  
>>>I'm sure it's not 100% what you'd like, but it's fairly close.  
>>>
>>>It does make an assumption that the %% substitution works everywhere, and 
>>>I'll make sure to add that to the RFC.  It also produces a legend that is 
>>>a bit different from yours, in that it puts the demographic name on the 
>>>first class, and then just the high/low values in the graded color bar 
>>>(see http://mapserver.gis.umn.edu/bugs/attachment.cgi?id=324&action=view )
>>>
>>>Please use this as a starting point, and explain what won't work.  There 
>>>may very well be some additional work on the legends that is needed, but I 
>>>think the general need you're expressing is addressed.
>>>
>>>Bill
>>>
>>>  LAYER
>>>    NAME "zcta_thematic"
>>>    CONNECTIONTYPE postgis
>>>    CONNECTION "host=linus port=5432 dbname=census user=pgsql"
>>>    DATA "the_geom from (SELECT c.gid, c.the_geom, c.water, a.%demographic% as demog from %table% a, 
>>>          sf3geo_zcta5 b, zcta c where c.state='%state%' and c.name=b.zcta5 and 
>>>          a.stusab=b.stusab and a.logrecno=b.logrecno and b.stusab='%state%' and 
>>>          b.sumlev='871'  ) as foo using srid=4326 using unique gid"
>>>    TYPE POLYGON
>>>    STATUS ON
>>>    PROJECTION
>>>      #"proj=latlong"
>>>      "init=epsg:4326"
>>>    END
>>>    CLASSITEM "water"
>>>    CLASS
>>>      NAME "Water"
>>>      EXPRESSION "t"
>>>      OUTLINECOLOR 102 102 204
>>>      COLOR 102 102 204
>>>    END
>>>    CLASS
>>>      NAME "%demog%"
>>>      EXPRESSION ([demog] > %break0% && [demog] <= %break1%)
>>>      OUTLINECOLOR 0 0 0
>>>      COLORRANGE
>>>        MINCOLOR 102 102 102
>>>	MAXCOLOR 0 204 0
>>>	MINVALUE %break0%
>>>	MAXVALUE %break1%
>>>	RANGEITEM 'demog'
>>>      END
>>>    END
>>>    CLASS
>>>      NAME " "
>>>      EXPRESSION ([demog] > %break1% && [demog] <= %break2%)
>>>      OUTLINECOLOR 0 0 0
>>>      COLORRANGE
>>>        MINCOLOR 0 204 0
>>>        MAXCOLOR 51 255 51
>>>        MINVALUE %break1%
>>>        MAXVALUE %break2%
>>>        RANGEITEM 'demog'
>>>      END
>>>    END
>>>    CLASS
>>>      NAME " "
>>>      EXPRESSION ([demog] > %break2% && [demog] <= %break3%)
>>>      OUTLINECOLOR 0 0 0
>>>      COLORRANGE
>>>        MINCOLOR 0 204 0
>>>	MAXCOLOR 102 255 102
>>>        MINVALUE %break2%
>>>        MAXVALUE %break3%
>>>        RANGEITEM 'demog'
>>>      END
>>>    END      
>>>    CLASS
>>>      NAME " "
>>>      EXPRESSION ([demog] > %break3% && [demog] <= %break4%)
>>>      OUTLINECOLOR 0 0 0
>>>      COLORRANGE
>>>        MINCOLOR 102 255 102
>>>	MAXCOLOR 153 255 153
>>>        MINVALUE %break3%
>>>        MAXVALUE %break4%
>>>        RANGEITEM 'demog'
>>>      END
>>>    END
>>>    CLASS
>>>      NAME " "
>>>      EXPRESSION ([demog] > %break4% && [demog] <= %break5%)
>>>      OUTLINECOLOR 0 0 0
>>>      COLORRANGE
>>>        MINCOLOR 153 255 153
>>>	MAXCOLOR 204 255 204
>>>        MINVALUE %break4%
>>>        MAXVALUE %break5%
>>>        RANGEITEM 'demog'
>>>      END
>>>    END
>>>    CLASS
>>>      NAME " "
>>>      EXPRESSION ([demog] > %break5% && [demog] <= %break6%)
>>>      OUTLINECOLOR 0 0 0
>>>      COLORRANGE
>>>        MINCOLOR 204 255 204
>>>        MAXCOLOR 255 294 294
>>>        MINVALUE %break5%
>>>        MAXVALUE %break6%
>>>        RANGEITEM 'demog'
>>>      END
>>>    END
>>>    CLASS
>>>      NAME " "
>>>      EXPRESSION ([demog] > %break6% && [demog] <= %break7%)
>>>      OUTLINECOLOR 0 0 0
>>>      COLORRANGE
>>>        MINCOLOR 255 294 294
>>>	MAXCOLOR 255 153 153
>>>        MINVALUE %break6%
>>>        MAXVALUE %break7%
>>>        RANGEITEM 'demog'
>>>      END
>>>    END
>>>    CLASS
>>>      NAME " "
>>>      EXPRESSION ([demog] > %break7% && [demog] <= %break8%)
>>>      OUTLINECOLOR 0 0 0
>>>      COLORRANGE
>>>        MINCOLOR 255 153 153
>>>        MAXCOLOR 255 102 102
>>>        MINVALUE %break7%
>>>        MAXVALUE %break8%
>>>        RANGEITEM 'demog'
>>>      END
>>>    END
>>>    CLASS
>>>      NAME " "
>>>      EXPRESSION ([demog] > %break8% && [demog] <= %break9%)
>>>      OUTLINECOLOR 0 0 0
>>>      COLORRANGE
>>>        MINCOLOR 255 102 102 
>>>        MAXCOLOR 255 51 51
>>>        MINVALUE %break8%
>>>        MAXVALUE %break9%
>>>        RANGEITEM 'demog'
>>>      END
>>>    END
>>>    CLASS
>>>      NAME " "
>>>      EXPRESSION ([demog] > %break9% && [demog] <= %break10%)
>>>      OUTLINECOLOR 0 0 0
>>>      COLORRANGE
>>>        MINCOLOR 255 51 51
>>>        MAXCOLOR 255 0 0
>>>        MINVALUE %break9%
>>>        MAXVALUE %break10%
>>>        RANGEITEM 'demog'
>>>      END
>>>    END
>>>  END
>>>
>>
>>
>>
> 



More information about the mapserver-dev mailing list