Can I do custom styling on GeoServer

On your second question:

An SLD can be created dynamically, which means it can style maps using dynamic data. For this to work you will need to know the IDs of the polygons you're trying to style and you also need to alter / expand your web service.

Have your web service generate SLDs on-the-fly instead of just returning data. This is simple enough using .NET, Java, PHP etc. The SLD you generate will have a rule for each colour band you want to display. Each rule will identify the polygons that colour applies to by their ID. Each rule's filter block will contain PropertyIsEqualTo 1 OR PropertyIsEqualTo 2 OR .... Each rule styles its polygons with whichever colour you have chosen to represent the value. You then have two options for telling GeoServer to use your dynamic SLD.

  1. If GeoServer has HTTP access to your web service you can pass an encoded URL, for example (JS) 'http://geoserver/wms?request=GetMap...&sld=' + encodeURIComponent('http://web-service/generateSLD?and=any-parameters-that-influence-sld-generation'). When GeoServer gets the WMS request it will decode the parameters and query this URL for the SLD. From GeoServer's perspective this is no different to querying for a static SLD held on a file server.
  2. If GeoServer can't access your web service your client must first ask the web service for the dynamic SLD, then pass the SLD to GeoServer in the sld_body parameter of the WMS request. Beware any limits on URL length imposed by either your client (e.g. a browser) or your web server

Both approaches can be tested using a static SLD you create for testing, so you know how successful this is before putting in the effort on your web service. Both approaches could be used to ask GeoServer for the legend graphic, which will then represent the same rules (however if you use option 1 it's possible the data used to generate your SLD has changed after generating the map).

I think this is your best option for question 2.

On your first question:

Do the temperature points always represent the same locations? If yes, can you find out in advance which polygons those temperature points fall within? If yes you can simply re-use the approach outlined above, with your SLD-generation script translating points into polygon IDs.

EDIT I just saw this referenced in another question: http://pypi.python.org/pypi/python-sld/