var map = null;
var mgr = null;
var geocoder = null;
GEvent.addDomListener(window,'load',function(){
loadGoogleMap();
map.setCenter(new GLatLng(35.0,-14),1);
})
function loadGoogleMap(){
map = new GMap2(document.getElementById("large-google-map"));
// add the controls
map.addControl(new TextualZoomControl());
map.addControl(new GSmallMapControl());
geocoder = new GClientGeocoder();
map.addControl(new GZoomControl(
/* first set of options is for the visual overlay.*/
{
nOpacity:.2,
sBorder:"2px solid red"
},
/* second set of optionis is for everything else */
{
sButtonHTML:"",
sButtonZoomingHTML:"",
oButtonStartingStyle:{width:'24px',height:'24px'}
}
));
map.setCenter(new GLatLng(35.0,-14),1);
map.enableDoubleClickZoom();
}
function drawPlace(placetodraw){
map.checkResize();
if (geocoder) {
geocoder.getLatLng(placetodraw,
function(point) {
if (!point) {
alert("Google could not map "+placetodraw);
} else {
map.setCenter(point, 4);
var marker = new GMarker(point);
var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
var lngDelta = (northEast.lng() - southWest.lng()) / 4;
var latDelta = (northEast.lat() - southWest.lat()) / 4;
var rectBounds = new GLatLngBounds(
new GLatLng(southWest.lat() + latDelta,
southWest.lng() + lngDelta),
new GLatLng(northEast.lat() - latDelta,
northEast.lng() - lngDelta));
map.setZoom(map.getBoundsZoomLevel(bounds));
map.setCenter(bounds.getCenter());
map.clearOverlays();
map.addOverlay(new Rectangle(rectBounds));
} }
);
}
else{
document.getElementById("north").value = "";
document.getElementById("west").value = "";
document.getElementById("south").value = "";
document.getElementById("east").value = "";
map.clearOverlays();
query();
}
}
function spatialBounding(placeList) {
if(placeList != "Select from list"){
var spatial = document.getElementById("placeList").value;
Place1.getPlace(spatial, updateSpatialList)
map.checkResize();
}
}
function updateSpatialList(data)
{
var splitter =new Array();
splitter = data.split(" ");
dwr.util.setValue("south",splitter[2]);
dwr.util.setValue("west",splitter[1]);
dwr.util.setValue("north",splitter[0]);
dwr.util.setValue("east",splitter[3]);
joiner = new Array();
joiner = splitter.join(",");
dwr.util.setValue("complete",joiner);
loadMap1();
query();
}
function Rectangle(bounds, opt_weight, opt_color) {
this.bounds_ = bounds;
this.weight_ = opt_weight || 3;
this.color_ = opt_color || "red";
}
Rectangle.prototype = new GOverlay();
// Creates the DIV representing this rectangle.
Rectangle.prototype.initialize = function(map) {
// Create the DIV representing our rectangle
var div = document.createElement("div");
div.style.border = this.weight_ + "px solid " + this.color_;
div.style.position = "absolute";
// Our rectangle is flat against the map, so we add our selves to the
// MAP_PANE pane, which is at the same z-index as the map itself (i.e.,
// below the marker shadows)
map.getPane(G_MAP_MAP_PANE).appendChild(div);
this.map_ = map;
this.div_ = div;
}
// Remove the main DIV from the map pane
Rectangle.prototype.remove = function() {
this.div_.parentNode.removeChild(this.div_);
}
// Copy our data to a new Rectangle
Rectangle.prototype.copy = function() {
return new Rectangle(this.bounds_, this.weight_, this.color_,
this.backgroundColor_, this.opacity_);
}
// Redraw the rectangle based on the current projection and zoom level
Rectangle.prototype.redraw = function(force) {
// We only need to redraw if the coordinate system has changed
if (!force) return;
// Calculate the DIV coordinates of two opposite corners of our bounds to
// get the size and position of our rectangle
var c1 = this.map_.fromLatLngToDivPixel(this.bounds_.getSouthWest());
var c2 = this.map_.fromLatLngToDivPixel(this.bounds_.getNorthEast());
// Now position our DIV based on the DIV coordinates of our bounds
this.div_.style.width = Math.abs(c2.x - c1.x) + "px";
this.div_.style.height = Math.abs(c2.y - c1.y) + "px";
this.div_.style.left = (Math.min(c2.x, c1.x) - this.weight_) + "px";
this.div_.style.top = (Math.min(c2.y, c1.y) - this.weight_) + "px";
}
//",
sButtonZoomingHTML:"",
oButtonStartingStyle:{width:'24px',height:'24px'}
}
));
// need to set the the map before adding overlays
map.setCenter(new GLatLng(0, 0), 20);
for (j = 0; j < set.length; j++) {
highlightFeature(set[j]);
}
var bounds = jpGetGBoundsForAllWKT(set);
mhFocusOnBox(map, bounds);
var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
var lngDelta = (northEast.lng() - southWest.lng()) / 4;
var latDelta = (northEast.lat() - southWest.lat()) / 4;
}
}
// Zooms to global view of world
function zoomOutToWorld() {
map.setCenter(new GLatLng(0, 0), 0); // v2
}
// Draws a coverage on the map
// wkt = A single coverage in WKT format
function highlightFeature(wkt) {
var bounds = jpGetGBoundsForWKT(wkt);
var width = mhGetBoxWidth(bounds);
var height = mhGetBoxHeight(bounds);
if ((width == 0) && (height == 0)) {
var markerLatLng = new GLatLng(bounds.getCenter().lat(), bounds.getCenter().lng());
var icon = new GIcon();
icon.image = "../images/marker16.png";
icon.iconSize = new GSize(27, 27);
icon.shadowSize = new GSize(5, 9);
icon.iconAnchor = new GPoint(16, 27);
var marker = new GMarker(markerLatLng, icon);
map.addOverlay(marker);
map.setCenter(markerLatLng);
} else {
var poly = mhCreateBoundsPoly(map, bounds);
map.addOverlay(poly);
}
}
//]]>
//function getKey() {
// return "ABQIAAAAlS3JK-ZqWSF9DvlsVuKDyBStLbd1zlO1JgMSKHwKtpUL2VUKEBSmWsDDBEvoiZmIBv4jFIgbYNMZ6g";
//}
// Include Google Maps API from maps.google.com
//document.write("");
document.write(tag);
/** Reusable functions from Mark Harwood */
// Creates a polyline (box) for the given map and GLatLngBounds
// box = GLatLngBounds
function mhCreateBoundsPoly(map, box) {
// if width > 180, google bug will draw the box with
// east and west reversed because GLatLngBounds get normalized
// So, must add two extra points at (nLat, centerLng) and
// (sLat, centerLng) to force it to draw the correct box
var c = box.getCenter().lng(); // center lng
var c2 = box.getCenter().lat(); // center lat
var height = box.toSpan().lat();
var hDiff = 0;
if (height > 0) {
hDiff = height / 100;
}
var width = mhGetBoxWidth(box);
var wDiff = 0;
if (width > 0) {
wDiff = width / 100;
}
var points = [];
var n = box.getNorthEast().lat();
var s = box.getSouthWest().lat();
var e = box.getNorthEast().lng();
var w = box.getSouthWest().lng();
if (s != -90) {
var sNew = s + hDiff;
s = sNew;
} else {
s = -85;
}
if (n != 90) {
var nNew = n - hDiff;
n = nNew;
} else {
n = 85;
}
var wNew = w + wDiff;
w = wNew;
var eNew = e - wDiff;
e = eNew;
points.push(new GLatLng(n, w));
points.push(new GLatLng(c2, w)); // extra center lat point
points.push(new GLatLng(s, w));
if (width >= 180) {
points.push(new GLatLng(s, c));
}
points.push(new GLatLng(s, e));
points.push(new GLatLng(c2, e)); // extra center lat point
points.push(new GLatLng(n, e));
if (width >= 180) {
points.push(new GLatLng(n, c));
}
points.push(new GLatLng(n, w));
//var color = "#666699";
var color = "#cc0000";
var weight = 3; // int equal to width in pixels
var opacity = 0.75; // float from 0 to 1
// alert("points = "+points);
return new GPolyline(points, color, weight, opacity);
}
//parses out coordinates from polygons (TODO no POINT/Line etc support here yet!)
function jpGetGBoundsForWKT(wkt) {
var cStart = wkt.lastIndexOf("(") + 1;
var cEnd = wkt.indexOf(")");
var coords = wkt.substring(cStart, cEnd);
//alert("splitting["+coords+ "]from["+wkt);
var points = coords.split(",");
var sw = points[3];
var ne = points[1];
var s = 9999;
var n = -9999;
var e = -9999;
var w = 9999;
var latLon = sw.split(" ");
s = parseFloat(latLon[0]);
w = parseFloat(latLon[1]);
latLon = ne.split(" ");
n = parseFloat(latLon[0]);
e = parseFloat(latLon[1]);
return new GLatLngBounds(new GLatLng(s, w), new GLatLng(n, e));
}
// Parses out coordinates from polygons (TODO no POINT/Line etc support here yet!)
// to determine the bounds for the _set_ of polygons
// set = Array of wkt polygons
function jpGetGBoundsForAllWKT(set) {
// the max extent for the entire SET of coverages
var setN = -9999;
var setS = 9999;
var setE = -9999;
var setW = 9999;
for (j = 0; j < set.length; j++) {
var wkt = set[j];
// wkt = (slat wlon, slat elon, nlat elon, nlat wlon, slat wlon)
// wkt = (LL, LR, UR, UL, LL)
var cStart = wkt.lastIndexOf("(") + 1;
var cEnd = wkt.indexOf(")");
var coords = wkt.substring(cStart, cEnd);
//alert("splitting["+coords+ "]from["+wkt);
var points = coords.split(",");
for (i = 0; i < points.length; i++) { // should be 5 points
}
var sw = points[3];
var ne = points[1];
var latLon = sw.split(" ");
s = parseFloat(latLon[0]);
w = parseFloat(latLon[1]);
latLon = ne.split(" ");
n = parseFloat(latLon[0]);
e = parseFloat(latLon[1]);
setW = Math.min(w, setW);
setE = Math.max(e, setE);
setS = Math.min(s, setS);
setN = Math.max(n, setN);
}
return new GLatLngBounds(new GLatLng(setS, setW), new GLatLng(setN, setE));
}
// sets position and zoom level appropriately so that box is visible on the map
// map = GMap2
// box = GLatLngBounds
function mhFocusOnBox(map, box) {
// Just for testing purposes
var lat = box.getCenter().lat();
var lng = box.getCenter().lng();
//alert("setting center to "+lat+", "+lng);
var boxCenter = box.getCenter();
map.setCenter(boxCenter, 3); // need to zoom in a bit first
var viewbox = map.getBounds();
if (!viewbox.containsBounds(box)) {
//alert("map does NOT contain cov bounds");
//zoom out to show polygon
var lastZoomLevel = 9999;
var zoomLevel = map.getZoom();
while ((!viewbox.containsBounds(box)) && (zoomLevel != lastZoomLevel)) {
//alert("too close, zooming out ("+zoomLevel+")");
lastZoomLevel = zoomLevel;
map.setCenter(boxCenter, zoomLevel - 1);
viewbox = map.getBounds();
zoomLevel = map.getZoom();
}
// if map is centered more to the north or more to the south, because
// of mercator projection, it will appear as though it is not centered.
// Try to adjust to accomodate this.
var lastCenter = new GLatLng(-999, -999, true);
var center = boxCenter;
while ((!viewbox.containsBounds(box)) && (center != lastCenter) && (center.lat() != 0)) {
lastCenter = center;
var lastCenterLat = lastCenter.lat();
if (lastCenterLat > 0) {
lastCenterLat += 2;
if (lastCenterLat > 90) {
break;
}
} else {
lastCenterLat -= 2;
if (lastCenterLat < -90) {
break;
}
}
center = new GLatLng(lastCenterLat, lastCenter.lng());
map.setCenter(center, zoomLevel);
viewbox = map.getBounds();
zoomLevel = map.getZoom();
}
} else {
//alert("map DOES contain cov bounds");
//TODO Check sufficiently zoomed in for box to be visible -need min 30% of view width
var bWidth = mhGetBoxWidth(box);
var bHeight = mhGetBoxHeight(box);
var vWidth = mhGetBoxWidth(viewbox);
var vHeight = mhGetBoxHeight(viewbox);
var lastZoomLevel = 9999;
var zoomLevel = map.getZoom();
while (((bWidth / vWidth < 0.3) && (bHeight / vHeight < 0.3)) && (zoomLevel != lastZoomLevel) && (zoomLevel > 1)) {
//alert("too far away, zooming in ("+zoomLevel+")");
// zoomed in farther usually gives no data, so set limit
if (zoomLevel > 6) {
zoomLevel = 10;
map.setCenter(boxCenter, zoomLevel);
return;
}
lastZoomLevel = zoomLevel;
map.setCenter(boxCenter, zoomLevel + 1);
viewbox = map.getBounds();
vWidth = mhGetBoxWidth(viewbox);
vHeight = mhGetBoxHeight(viewbox);
zoomLevel = map.getZoom();
}
}
}
// Returns the width of the box in degrees
// bounds = GLatLngBounds
function mhGetBoxWidth(bounds) {
var w = bounds.getSouthWest().lng();
var e = bounds.getNorthEast().lng();
if (w > e) {
//alert("crosses int dateline w="+w+" and e="+e)
var rtOfIntLine = e + 180;
var ltOfIntLine = 180 - w;
//alert("box width = "+( rtOfIntLine + ltOfIntLine));
return rtOfIntLine + ltOfIntLine;
}
return e - w;
}
// Returns the height of the box in degrees
// bounds = GLatLngBounds
function mhGetBoxHeight(bounds) {
//alert(bounds);
var s = bounds.getSouthWest().lat();
var n = bounds.getNorthEast().lat();
return n - s;
}
// formulates the proper syntax for a WKT POLYGON
function formulateWKT(south, west, north, east) {
// syntax = POLYGON ((N W,N E,S E,S W,N W))
var string = "POLYGON ((";
string += north + " " + west + ",";
string += north + " " + east + ",";
string += south + " " + east + ",";
string += south + " " + west + ",";
string += north + " " + west + "))";
return string;
}
function goToCov(south, west, north, east, map) {
var wkt = formulateWKT(south, west, north, east);
var bounds = jpGetGBoundsForWKT(wkt); // now a GLatLngBounds
mhFocusOnBox(map, bounds);
}