Hayley,
2nd UPDATE: Played around some more and got the radar overlay to work with OpenLayers. What I and a few others have referred to holds true here. The Ridge Radar gifs are really meant to go into Google Earth (though they might also play nice in Google Maps too). However, in OpenLayers, one does have to ensure that raster images are transformed to spherical mercator in order to display in Google Maps and Open Street Maps via OpenLayers. In order to do that, you have to geo-reference the raster to ESPG 4326 and then transform it to spherical mercator. Now I used GDAL to do the geo-referencing and also warping to spherical mercator. Here are the commands I used:
gdal_translate -of PNG -a_srs EPSG:4326 -a_ullr -127.62 50.41 -66.42 21.61 radar.gif radartemp1.png
gdalwarp -t_srs '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs' radartemp1.png radartemp2.png
gdal_translate -of PNG -outsize 80% 80% radartemp2.png radartemp3.png
The first line geo-references the image to EPSG 4326 and also converts to a PNG. Just used to doing that but you should be able to keep GIFs (-of GIF).
The second line converts the image to EPSG 900913 via the proj.4 commands in single quotes. I had tried using 900913 and also 3785/3857 in gdalwarp but my version of GDAL didn't like those. Found the proj.4 commands worked. Key to this was the +nadgrids=@null option. I found that in our geo-referencing things worked fine with the transformation that we were using for our initial GM prototype. However, our images were "squished" when we tried to use them for OL. Discovered after a search and also in the reference that snapwire_org indicated that this is critical to getting the grid transformed into spherical mercator.
Now I found that in order to work with EPSG 900913 in OL, I had to use meters for the projection instead of the lat lon bounds and just transform everything between the two:
Declaring the map:
map = new OpenLayers.Map("map", {
projection: new OpenLayers.Projection("EPSG:900913"),
units: "m",
maxResolution: 156543.0339,
maxExtent: new OpenLayers.Bounds(
-20037508, -20037508, 20037508, 20037508.34),
displayProjection: new OpenLayers.Projection("EPSG:4326"),
controls: [
new OpenLayers.Control.Navigation(),
new OpenLayers.Control.KeyboardDefaults(),
new OpenLayers.Control.PanZoomBar(),
new OpenLayers.Control.Scale(),
new OpenLayers.Control.Attribution()
]
});
Now for the image overlay:
// create spherical mercator base layers
var googleLayer = new OpenLayers.Layer.Google("Google Physical", {type: google.maps.MapTypeId.TERRAIN, visibility: true});
var gstr = new OpenLayers.Layer.Google("Google Streets", {type: google.maps.MapTypeId.ROAD, visibility: true});
var osmLayer = new OpenLayers.Layer.OSM("OpenStreetMap");
NOW I've entered the correct numbers here after the 3rd GDAL transformation step above for your use in the new OpenLayers.Bounds line below
// create overlay with first image (GMoverlay is a global);
GMoverlay= new OpenLayers.Layer.Image("Radar Overlay","radartemp3.png",
new OpenLayers.Bounds(-14206593.415,2465071.940,-7394741.764,6517585.728),
new OpenLayers.Size(847,484),
{isBaseLayer: false, opacity: 0.4,
projection: new OpenLayers.Projection("EPSG:900913")});
//add layers to map
map.addLayers([googleLayer, gstr,osmLayer, GMoverlay]);
Again, you can see in the Bounds, we're using meters:
new OpenLayers.Bounds(-14206593.415,2465071.940,-7394741.764,6517585.728)
You would get that info by running
gdalinfo radartemp3.png
The lower left and upper right coordinates of the transformed image are displayed in this command's output and then entered in the part above when declaring the new OL Image.
In going back and forth between meters and standard Lat/Lon, you have to use OL transforms like this one for setting the initial center:
map.setCenter(new OpenLayers.LonLat(-80, 40).transform(
new OpenLayers.Projection("EPSG:4326"),
map.getProjectionObject()),5);
You need to be careful here using transform on geometries as I discovered when grabbing a point on the map. This is also discussed in that link on spherical mercator and here's the relevant statement:
"Because all transforms are in place, once you have added a geometry to a layer, you should not call transform on the geometry directly: instead, you should transform a clone of the geometry:"
The referenced link that snapwire_org mentioned has a good deal of what I refer to here.
Also note that the size of the image is about a quarter the size of radartemp3.png. That's because you have to reduce the size number the farther out you zoom. So, you can't use 3700 x 1600 of the original image.
This really should be the answer you're looking for. I checked it myself in a test OL app with much of the pieces above and it projected spot on to what was being displayed at weather.gov. You still will have to do the geo-referencing and transformations. But GDAL is also open source and easy to install.
Tell you, it took a while to find that proj.4 option for our transformations. Then I pieced together several references which set up the map and image overlay in meters (including the one from snapwire_org) and then did transformations for points between 4326 and 900913. Worked like a charm then.
Good luck!
Yes it's possible.
Starting with GeoServer 2.1.0 the user can also create a new layer by
specifying a raw SQL query
You can create SQL Views which reference the same table using SQL Statements.
Instructions and Documentation
Update Per OpenLayers question in comment:
It really depends on how you want to serve out your data which depends on what kind and how much data you have.
If the data is vector data and not more than +-300 features you can use WFS. Add that layer like so:
OpenLayers GeoServer WFS Layer Example
If the data is Raster data or you just want your layer served out as an image rather than vector features, then add that layer using WMS. Like so:
OpenLayers WMS Layer Example
Update #2:
Based on your latest comment, what you can do is: add multiple wfs layers to your open layers map which point to ONE layer on your GeoServer but have a filter defined so you only get ONE feature back based on ID or some other attribute in your filter.
Take a look at this example.
Basically it will be something like:
var wfs = new OpenLayers.Layer.Vector("WFS", {
strategies: [new OpenLayers.Strategy.BBOX()],
protocol: new OpenLayers.Protocol.WFS({
url: "http://demo.opengeo.org/geoserver/wfs",
featureType: "tasmania_roads",
featureNS: "http://www.openplans.org/topp"
}),
filter: new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.And,
filters: [
new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "id",
value: "POLYGONID"
})
]
})
});
Best Answer
Setting the z-index for each layer should help: http://www.openlayers.org/dev/examples/ordering.html
EDITED
The example I originally linked to isn't too helpful. You want to set the layerindex/z-index of the layers, not the makers within the layers (as the ordering example showed). I put together an example (based off this example) showing custom layer indexing. Notice that when you turn on the Canada Raster, the Marker layer stays on top.
Here is the relevant code:
The documentation for the setLayerIndex code is here: http://dev.openlayers.org/releases/OpenLayers-2.11/doc/apidocs/files/OpenLayers/Map-js.html#OpenLayers.Map.setLayerIndex