/*
This code was downloaded from http://www.marine-geo.org/inc/basemap_v3.js
2018-05-01
*/
function dd2MercMetersLng(p_lng) {
return 6378137.0*(p_lng*Math.PI/180);
}
function dd2MercMetersLat(p_lat) {
p_lat = ((p_lat > 85)?85:((p_lat<-85)?-85:p_lat));
return 6378137.0*Math.log(Math.tan(((p_lat*Math.PI/180)+(Math.PI/2.0))/2.0));
}
function MGDSMapClient() {
var self = this;
this.maplat = 0;
this.maplon = -96;
this.zoom = 2;
this.mapdiv = "mapclient";
this.layers = new Array();
this.data_layers = {};
this.mtoverlays = new Array();
this.infowin = new google.maps.InfoWindow();
google.maps.event.addListener(this.infowin, 'closeclick', function(event) {
self.marker.setMap(null);
});
this.marker = new google.maps.Marker();
this.qurl = 'http://www.marine-geo.org/inc/kml_v3/selectpoint.php?';
this.markers = new Array();
this.markerCluster = new Array();
this.baseLayersbool = true;
this.grat = null;
this.mapdivobject = null;
this.linkhref = "/index.php";
this.linkclass = "mgdslogo";
this.imgsrc = "http://www.marine-geo.org/images/mgdslogofull.png";
this.imgtitle = "IEDA: Marine Geoscience Data System";
this.imgwidth = "250px";
}
function getLatLngByOffset( mmap, offsetX, offsetY ){
//var currentBounds = mmap.map.getBounds();
//var topLeftLatLng = new google.maps.LatLng( currentBounds.getNorthEast().lat(),
// currentBounds.getSouthWest().lng());
//var point = mmap.map.getProjection().fromLatLngToPoint( topLeftLatLng );
//point.x += offsetX / ( 1<
elev: ';
}
MGDSMapClient.prototype.mapInit = function(hide,options,off,npsp) {
var self = this;
var basemap_options = {
zoom: this.zoom,
center: new google.maps.LatLng(this.maplat, this.maplon),
mapTypeId: google.maps.MapTypeId.SATELLITE,
streetViewControl: false,
panControl: false,
mapTypeControl: false,
maxZoom: 22,
minZoom: 1,
scaleControl: true,
draggableCursor:'crosshair'
};
if (options) {
for (var attrname in options) {
basemap_options[attrname] = options[attrname];
}
}
this.mapdivobject = $('#'+this.mapdiv);
this.map = new google.maps.Map(document.getElementById(this.mapdiv),basemap_options);
if (!off)
this.controls = new controlOverlay(this,hide,npsp);
this.posdiv = document.createElement('div');
this.posdiv.id = 'latlondiv';
this.map.controls[google.maps.ControlPosition.LEFT_BOTTOM].push(this.posdiv);
this.oview = new google.maps.OverlayView();
this.oview.draw = function() {};
this.oview.onAdd = function(){};
this.oview.onRemove = function(){};
this.oview.setMap(this.map);
this.movementTimer = null;
this.mapdivobject.mousemove(function(evt){
var posx = evt.pageX-self.mapdivobject.offset().left;
var posy = evt.pageY-self.mapdivobject.offset().top;
var latlng = getLatLngByOffset(self,posx,posy);
clearTimeout(this.movementTimer);
this.movementTimer = setTimeout(function(){
$.ajax({
type: "GET",
url: "https://www.gmrt.org/services/pointserver.php",
data: {
'latitude':latlng.lat().toFixed(6),
'longitude':latlng.lng().toFixed(6),
'statsoff':'true'
},
async: true,
success: function(msg){
$("#elevdiv").text(msg+' m');
}
});
}, 200);
$('#latlondiv').html(getLocationText(latlng));
});
}
MGDSMapClient.prototype.baseMap = function() {
var d = new Date();
var self = this;
var copyrightDiv = document.createElement("div");
copyrightDiv.id = "map-copyright";
copyrightDiv.style.fontSize = "11px";
copyrightDiv.style.fontFamily = "Arial, sans-serif";
copyrightDiv.style.margin = "0 2px 2px 0";
copyrightDiv.style.whiteSpace = "nowrap";
copyrightDiv.innerHTML = "Bathymetry ©"+d.getFullYear()+" GMRT";
this.map.controls[google.maps.ControlPosition.BOTTOM_RIGHT].push(copyrightDiv);
var tile = new TileData(this.map,'https://www.gmrt.org/services/mapserver/wms_merc?','topo');
var gmrt_layer = {
alt: " GMRT Basemap",
getTileUrl: tile.GetTileUrl,
isPng: false,
maxZoom: 22,
minZoom: 1,
name: "Bathymetry",
tileSize: new google.maps.Size(256, 256)
};
var tilemask = new TileData(this.map,'https://www.gmrt.org/services/mapserver/wms_merc_mask?','topo');
var mask_layer = {
alt: " GMRT Basemap",
getTileUrl: tilemask.GetTileUrl,
isPng: false,
maxZoom: 22,
minZoom: 1,
name: "GMRT Mask",
tileSize: new google.maps.Size(256, 256)
};
var bathymetry = new google.maps.ImageMapType(gmrt_layer);
var gmrtmask = new google.maps.ImageMapType(mask_layer);
this.map.mapTypes.set('Bathymetry',bathymetry);
this.map.mapTypes.set('GMRT Mask',gmrtmask);
this.map.setMapTypeId('Bathymetry');
}
MGDSMapClient.prototype.overlayControl = function(a,b,c,d,e){}
MGDSMapClient.prototype.MGDSLogo = function(linkhref,linkclass,imgsrc,imgtitle,imgwidth,attachnode) {
if (linkhref) this.linkhref = linkhref;
if (linkclass) this.linkclass = linkclass;
if (imgsrc) this.imgsrc = imgsrc;
if (imgtitle) this.imgtitle = imgtitle;
if (imgwidth) this.imgwidth = imgwidth;
var mgdsDiv = document.createElement("div");
mgdsDiv.setAttribute("id",'mgdsDiv')
var linklogo = document.createElement("a");
linklogo.setAttribute("href",this.linkhref);
linklogo.setAttribute("style","border-bottom:none !important;padding: 3px;display: block;");
linklogo.className = this.linkclass;
var clearDiv = document.createElement("div");
clearDiv.setAttribute("style","clear:both;");
linklogo.appendChild(clearDiv.cloneNode(true));
var img = document.createElement("img");
img.setAttribute("title",this.imgtitle);
img.setAttribute("alt",this.imgtitle);
img.setAttribute("src",this.imgsrc);
img.setAttribute("style","width:"+this.imgwidth);
linklogo.appendChild(img);
linklogo.appendChild(clearDiv.cloneNode(true));
mgdsDiv.appendChild(linklogo);
var attdiv = document.createElement('div');
attdiv.setAttribute("id","attdiv");
if (attachnode) {
attdiv.appendChild(attachnode);
}
mgdsDiv.appendChild(attdiv);
this.map.controls[google.maps.ControlPosition.TOP_LEFT].push(mgdsDiv);
}
MGDSMapClient.prototype.overlayWMS = function(url,layer,name,format,clickevent,onoff,legend_url,clickcallback,grp) {
var tile = new TileData(this.map,url,layer);
if (format)
tile.format=format;
this.mtoverlays[name] = new Array();
this.mtoverlays[name]['wmslayer'] = {
alt: name,
getTileUrl: tile.GetTileUrl,
isPng: false,
maxZoom: 22,
minZoom: 1,
name: name,
tileSize: new google.maps.Size(256, 256)
};
if (onoff)
this.baseLayersbool = false;
this.mtoverlays[name]['overlay'] = new google.maps.ImageMapType(this.mtoverlays[name]['wmslayer']);
this.mtoverlays[name]['clickevent'] = clickevent;
this.mtoverlays[name]['callback'] = clickcallback;
if (legend_url) {
this.mtoverlays[name]['legend_url'] = legend_url;
}
this.controls.baseLayer(name,this.baseLayersbool,grp);
this.baseLayersbool = false;
};
MGDSMapClient.prototype.overlayESRI = function(url,layer,name,format,onoff,grp) {
var tile = new EsriData(this.map,url,layer);
if (format)
tile.format=format;
this.mtoverlays[name] = new Array();
this.mtoverlays[name]['esrilayer'] = {
alt: name,
getTileUrl: tile.GetTileUrl,
isPng: false,
maxZoom: 22,
minZoom: 1,
name: name,
tileSize: new google.maps.Size(256, 256)
};
if (onoff)
this.baseLayersbool = false;
this.mtoverlays[name]['overlay'] = new google.maps.ImageMapType(this.mtoverlays[name]['esrilayer']);
//this.mtoverlays[name]['clickevent'] = clickevent;
//this.mtoverlays[name]['callback'] = clickcallback;
/*if (legend_url) {
this.mtoverlays[name]['legend_url'] = legend_url;
}*/
this.controls.baseLayer(name,this.baseLayersbool,grp);
this.baseLayersbool = false;
};
// Change the tile url
MGDSMapClient.prototype.setTileData = function(name,url,layer) {
var tile = new TileData(this.map,url,layer);
var wmslayer = this.mtoverlays[name]['wmslayer'];
wmslayer.getTileUrl = tile.GetTileUrl;
var overlay = new google.maps.ImageMapType(wmslayer);
this.mtoverlays[name]['overlay'] = overlay;
var is_visible = !$('.baselayer[title="'+name+'"]').hasClass('off');
if (is_visible) {
this.map.overlayMapTypes.clear();
this.map.overlayMapTypes.insertAt(0,overlay);
}
}
MGDSMapClient.prototype.convertPoint = function(latLng) {
var proj = this.oview.getProjection();
var middle = proj.fromLatLngToContainerPixel(latLng);
var ne = proj.fromContainerPixelToLatLng(new google.maps.Point(middle.x+2,middle.y-2));
var sw = proj.fromContainerPixelToLatLng(new google.maps.Point(middle.x-2,middle.y+2));
var bnds = sw.lng()+','+sw.lat()+','+((sw.lng()>ne.lng())?ne.lng()+360:ne.lng())+','+ne.lat();
return bnds;
}
MGDSMapClient.prototype.selectPoint = function(latlon) {
var self = this;
self.marker.setMap(null);
self.infowin.close();
var mt = self.map.overlayMapTypes.getAt(0);
var layer = mt.name;
//console.log(self.mtoverlays[layer]);
if (layer && (self.mtoverlays[layer]['clickevent']|| self.mtoverlays[layer]['callback'])) {
var str = '';
var qurl = self.qurl;
var data = $.extend({},self.mtoverlays[layer]['clickevent']);
if (data['qurl']) {
qurl = data['qurl'];
delete data['qurl'];
}
//console.log(self.mtoverlays[layer]);
if (data['SERVICE'] == 'WMS') {
data['BBOX'] = this.convertPoint(latlon);
str = decodeURIComponent($.param(data));
} else {
data['lat'] = latlon.lat();
data['lon'] = latlon.lng();
data['zoom'] = this.map.getZoom();
str = decodeURIComponent($.param(data));
}
if (self.mtoverlays[layer]['callback']) {
self.mtoverlays[layer]['callback'](qurl,data,latlon);
} else {
//console.log(qurl+str);
$.ajax({
type: "GET",
url: qurl,
data: str,
beforeSend: function(msg){
self.map.setOptions({
draggableCursor: 'wait'
});
},
success: function(msg){
if (msg) {
self.marker.setPosition(latlon);
self.marker.setMap(self.map);
self.infowin.setContent(msg);
self.infowin.open(self.map,self.marker);
}
}
}).always(function(){
self.map.setOptions({
draggableCursor: 'crosshair'
});
});
}
}
}
MGDSMapClient.prototype.KMLOverlay = function(url,title,hide,zoomto,options) {
this.layers[title] = new Array();
this.layers[title]['url'] = url;
this.layers[title]['preserveOverlay'] = (zoomto)?false:true;
options = typeof options !== 'undefined' ? options : {};
var opts = $.extend({preserveViewport:true},options);
var onoff = (hide)?false:true;
this.controls.overlayLayer(title,onoff,opts);
}
MGDSMapClient.prototype.ClusterOverlay = function(url,title,hide,grp_name,pos) {
this.markerCluster[title] = new Array();
this.markerCluster[title]['url'] = url;
var onoff = (hide)?false:true;
this.controls.clusterLayer(title,onoff,grp_name,pos);
}
MGDSMapClient.prototype.GeoJSONOverlay = function(opts) {
var url = opts.url;
var title = opts.title;
var onoff = opts.onoff;
var idProp = opts.idProp;
var callback = opts.callback;
var defaultStyle = opts.defaultStyle;
var mouseoverStyle = opts.mouseoverStyle;
var click = opts.click;
var control_position = opts.control_position;
var grp_name = opts.grp_name;
var hover_text_fun = opts.hover_text_fun;
var click_text_fun = opts.click_text_fun;
var selectedStyle = opts.selectedStyle || opts.defaultStyle;
function processPoints(geometry, callback, thisArg) {
if (!geometry) {
return;
} else if (geometry instanceof google.maps.LatLng) {
callback.call(thisArg, geometry);
} else if (geometry instanceof google.maps.Data.Point) {
callback.call(thisArg, geometry.get());
} else {
geometry.getArray().forEach(function(pt) {
processPoints(pt, callback, thisArg);
});
}
}
// zoom to show all the features
var bounds = new google.maps.LatLngBounds();
var data = new google.maps.Data();
this.data_layers[title] = data;
var self = this;
var afterLoad = function(fts) {
if (callback) {
callback(fts,data);
}
if (fts.length) {
fts.forEach(function(ft) {
if (ft.getProperty('selected')=='true') {
data.overrideStyle(ft,selectedStyle);
} else {
data.overrideStyle(ft, defaultStyle);
}
processPoints(ft.getGeometry(), bounds.extend, bounds);
});
self.map.fitBounds(bounds);
if (onoff) {
data.setMap(self.map);
} else {
data.setMap(null);
}
self.controls.geojsonLayer(title,onoff,grp_name,control_position);
var lloverlay = new google.maps.OverlayView();
lloverlay.draw = function() {};
lloverlay.setMap(mgdsMap.map);
if (mouseoverStyle) {
data.addListener('mouseover', function(e) {
data.overrideStyle(e.feature, mouseoverStyle);
});
data.addListener('mouseout', function(e) {
var ft = e.feature;
if (ft.getProperty('selected')=='true') {
data.overrideStyle(ft,selectedStyle);
} else {
data.overrideStyle(ft, defaultStyle);
}
});
}
if (hover_text_fun) {
data.addListener('mouseover', function(e) {
if (self.ml) self.ml.setMap(null);
var hover_text_props = hover_text_fun(e,lloverlay);
hover_text_props.map = self.map;
self.ml = new MapLabel(hover_text_props);
});
data.addListener('mouseout', function(e) {
self.ml.setMap(null);
});
}
if (click_text_fun) {
data.addListener('click', function(e) {
if (self.ml) self.ml.setMap(null);
var click_text_props = click_text_fun(e,lloverlay);
click_text_props.map = self.map;
self.ml = new MapLabel(click_text_props);
});
data.addListener('mouseout', function(e) {
self.ml.setMap(null);
});
}
if (click) {
data.addListener('click', function(e) {
click(e);
});
}
}
}
data.loadGeoJson(url,{idPropertyName:idProp}, afterLoad);
return data;
}
function TileData(map,baseUrl,layer) {
var self = this;
this.map = map;
this.baseUrl = baseUrl;
this.format = "image/png";
this.styles = '';
this.layer=layer;
this.baseOpts = "&REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1"
+"&BGCOLOR=0xFFFFFF&TRANSPARENT=TRUE&WIDTH=256&HEIGHT=256&reaspect=false";
this.GetTileUrl = function(tile, zoom) {
var projection = self.map.getProjection();
var zpow = Math.pow(2, zoom);
var ur = new google.maps.Point( (tile.x+1)*256.0/zpow , (tile.y+1)*256.0/zpow );
var ll = new google.maps.Point( tile.x*256.0/zpow , tile.y*256.0/zpow );
var urw = projection.fromPointToLatLng(ur);
var llw = projection.fromPointToLatLng(ll);
var bbox;
var lSRS;
var urwlng = (urw.lng() == -180)? 180: urw.lng();
var llwlng = (llw.lng() == 180)? -180: llw.lng();
if (zoom < 5) {
bbox=dd2MercMetersLng(llwlng)+","+dd2MercMetersLat(urw.lat())+","+dd2MercMetersLng(urwlng)+","+dd2MercMetersLat(llw.lat());
lSRS="EPSG:3395";// use mercator projection when viewimg large areas
} else {
bbox = llwlng + ','+urw.lat()+','+urwlng+','+llw.lat();
lSRS="EPSG:4326";// use geographic projection when viewing details
}
var lURL = self.baseUrl + self.baseOpts
+"&LAYERS="+self.layer
+"&STYLES="+self.styles
+"&FORMAT="+self.format
+"&SRS="+lSRS
+"&BBOX="+bbox
//console.log(lURL);
return lURL;
}
}
function EsriData(map,baseUrl,layer) {
var self = this;
this.map = map;
this.baseUrl = baseUrl;
this.format = "png";
this.layer=layer;
this.baseOpts = "&transparent=true&size=256,256&f=image";
this.GetTileUrl = function(tile, zoom) {
var projection = self.map.getProjection();
var zpow = Math.pow(2, zoom);
var ur = new google.maps.Point( (tile.x+1)*256.0/zpow , (tile.y+1)*256.0/zpow );
var ll = new google.maps.Point( tile.x*256.0/zpow , tile.y*256.0/zpow );
var urw = projection.fromPointToLatLng(ur);
var llw = projection.fromPointToLatLng(ll);
var bbox;
var lSRS;
var urwlng = (urw.lng() == -180)? 180: urw.lng();
var llwlng = (llw.lng() == 180)? -180: llw.lng();
if (zoom < 5) {
bbox=dd2MercMetersLng(llwlng)+","+dd2MercMetersLat(urw.lat())+","+dd2MercMetersLng(urwlng)+","+dd2MercMetersLat(llw.lat());
//lSRS="102100";// use mercator projection when viewimg large areas
lSRS="54004";// use mercator projection when viewimg large areas
} else {
bbox = llwlng + ','+urw.lat()+','+urwlng+','+llw.lat();
lSRS="4326";// use geographic projection when viewing details
}
var lURL = self.baseUrl + self.baseOpts
+"&layers="+self.layer
+"&format="+self.format
+"&imageSR="+lSRS
+"&bboxSR="+lSRS
+"&bbox="+bbox
//console.log(lURL);
return lURL;
}
}
function controlOverlay(mapClient,hide,npsp) {
this.mapClient = mapClient;
this.map = mapClient.map;
this.bases = false;
this.overlays = false;
this.clusters = false;
/* this.controlDiv = document.createElement("div");
this.controlDiv.id = "layercontrol";
var textarrow = (hide)?"<":">";
this.controlDiv.innerHTML = '