Specifically, my question is: how to assign the maps to different divs? In my page it kept placing the two maps under each other, although I defined the divs to be horizontally aligned.
So I have been searching for the answer to this question, when I discovered it by mistake, and I think it is not obvious so I thought I might share it.
[GIS] How to have two OpenLayers maps on the same page
openlayers-2
Related Solutions
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!
Those & in the url look suspicious, try without:
url: "http://mysite.com/mapserv.cgi/wfs?&map=wfs_1.map&",
^ ^
if it still does not work try to remove only the first one (the one before map=..)
Best Answer
Well, this is quite simple: the first parameter in the Map constructor is the id of the div! Thats all.
So in the javascript code:
and the html code: