/// /* *@description 谷歌地图 JAVASCRIPT API V3.0 工具类 *@author YanZhiwei *@see https://developers.google.com/maps/documentation/javascript/reference?hl=zh-cn *@email Yan.Zhiwei@hotmail.com */ (function () { window.gmap = {}; window.overlay = {}; window.panorama = {}; window.infoWindow = {}; window.overlays = []; gUtils = { CONSTANT: { CONTAINER: "googlemap", DEFAULT_ZOOM: 13, DEFAULT_INIT_ZOOM: 12, DEFAULT_MAX_ZOOM: 21, DEFAULT_MIN_ZOOM: 0, GRID_SIZE: 60 }, initNormalMap: function (lon, lat, zoom, maxzoom, minzoom, div) { /// /// 基本地图初始化 /// /// 地理纬度 /// 地理经度 /// 显示级别 /// 地图最大级别 /// 地图最小级别,默认0 /// 地图承载DIV var gmap_div = document.getElementById(div || this.CONSTANT.CONTAINER); if (gmap_div) { var options = { zoom: zoom || this.CONSTANT.DEFAULT_INIT_ZOOM, scaleControl: true, overviewMapControl: true, overviewMapControlOptions: { opened: true }, center: new google.maps.LatLng(lat || 39.915, lon || 116.404),//默认中心 在上海 mapTypeId: google.maps.MapTypeId.ROADMAP, maxZoom: maxzoom || this.CONSTANT.DEFAULT_MAX_ZOOM, minZoom: minzoom || this.CONSTANT.DEFAULT_MIN_ZOOM } window.gmap = new google.maps.Map(gmap_div, options); window.overlay = new google.maps.OverlayView(); overlay.draw = function (e, ee) { }; overlay.setMap(window.gmap); } }, addMarker: function (marker) { /// /// 将标记添加到地图 /// /// 标记 if (marker) { marker.setMap(window.gmap); overlays.push(marker); } }, addMapView: function () { /// /// 添加地图视图_普通街道_卫星视图_卫星和路网的混合 /// // if (window.gmap) }, removeMarker: function (marker) { /// /// 从地图上移出标记 /// /// 标记 if (marker) { overlays.remove(marker); marker.setVisible(false); marker.setMap(null); } }, createBounds: function (points) { if (points) { var bounds = new google.maps.LatLngBounds(); for (var i = 0; i < points.length; i++) { var point = points[i]; if (point) { bounds.extend(point); } } return bounds; } return null; }, focused: function (point, zoom) { /// /// 聚焦点 /// /// point /// 级别 if (point) { var bounds = window.gmap.getBounds(); window.gmap.setCenter(point); window.gmap.setZoom(zoom || this.CONSTANT.DEFAULT_ZOOM); if (!bounds.contains(point)) { setTimeout(function () { window.gmap.panTo(point); }, 100); } } }, addMenu: function (mapId, rightMenuId, callback) { /// /// 为地图添加右键菜单 /// 注意:需要引用jQuery /// eg: /// /// ----------------------------------- ///.contextMenu { /// position: absolute; /// min-width: 100px; /// z-index: 1000; /* 必要 */ /// background: #fff; /// border-top: solid 1px #CCC; /// border-left: solid 1px #CCC; /// border-bottom: solid 1px #676767; /// border-right: solid 1px #676767; /// padding: 0px; /// margin: 0px; /// display: none; /// text-align: center; /// /*font-size: smaller;*/ ///} ///.contextMenu a:hover { /// cursor: pointer; /// } /// /// google map承载DIV /// 右键菜单承载DIV mapId = mapId || this.CONSTANT.CONTAINER; var contextMenu = $("#" + rightMenuId); $("#" + mapId).append(contextMenu); google.maps.event.addListener(window.gmap, "rightclick", function (e) { contextMenu.hide(); var mapcontainer = $("#" + mapId).append("#" + contextMenu) var x = e.pixel.x; var y = e.pixel.y; if (x > mapcontainer.width() - contextMenu.width()) { x -= contextMenu.width(); } if (y > mapcontainer.height() - contextMenu.height()) { y -= contextMenu.height(); } contextMenu.css({ top: y, left: x }).fadeIn(100); callback(e.LatLng); }); //----------------------------------------------------------- $.each('click dragstart zoom_changed maptypeid_changed'.split(' '), function (i, name) { google.maps.event.addListener(window.gmap, name, function () { contextMenu.hide() }); }); }, fromLatLngToDivPixel: function (latLng) { /// /// 将经纬度转换为屏幕像素值 /// /// 经纬度 /// 屏幕像素值 //---------------------------------------------------------------------------- /* convert LatLng object to actual pixels 参考:http://krasimirtsonev.com/blog/article/google-maps-api-v3-convert-latlng-object-to-actual-pixels-point-object var topRight = gmap.getProjection().fromLatLngToPoint(gmap.getBounds().getNorthEast()); var bottomLeft = gmap.getProjection().fromLatLngToPoint(gmap.getBounds().getSouthWest()); var scale = Math.pow(2, gmap.getZoom()); var worldPoint = gmap.getProjection().fromLatLngToPoint(latLng); return new google.maps.Point((worldPoint.x - bottomLeft.x) * scale, (worldPoint.y - topRight.y) * scale); */ var project = overlay.getProjection(); if (project) { return project.fromLatLngToDivPixel(latLng); } }, fromDivPixelToLatLng: function (pixels) { /// /// 将屏幕像素值转换为经纬度 /// /// 屏幕像素值 /// 经纬度 var project = overlay.getProjection(); if (project) { return project.fromDivPixelToLatLng(pixels); } }, latlngToPoint: function (latlng) { /// /// 可将 LatLng 值转换为世界坐标 /// /// 经纬度 /// 世界坐标 var normalizedPoint = gmap.getProjection().fromLatLngToPoint(latlng); // returns x,y normalized to 0~255 //Projection.fromLatLngToPoint() 方法可将 LatLng 值转换为世界坐标。此方法用于在地图上放置叠加层(同时放置地图本身)。 var scale = Math.pow(2, gmap.getZoom()); var pixelCoordinate = new google.maps.Point(normalizedPoint.x * scale, normalizedPoint.y * scale); return pixelCoordinate; }, pointToLatlng: function (point) { /// /// 将世界坐标转换为 LatLng 值 /// /// 世界坐标 /// 经纬度 var scale = Math.pow(2, gmap.getZoom()); var normalizedPoint = new google.maps.Point(point.x / scale, point.y / scale); var latlng = gmap.getProjection().fromPointToLatLng(normalizedPoint); //Projection.fromPointToLatLng() 方法可将世界坐标转换为 LatLng 值。此方法用于将地图上发生的事件(如点击)转换为地理坐标。 return latlng; } }; gUtils.bounds = { CONSTANT: { GRID_SIZE: 60, OFF_SET: 0 }, setCenter: function (points) { /// /// 设置一组地理坐标点的中心点 /// /// 地理坐标点 if (points) { var bounds = new google.maps.LatLngBounds(); for (var i = 0; i < points.length; i++) { var point = points[i]; bounds.extend(point); } var point = bounds.getCenter(); window.gmap.setCenter(point); } }, getExtendedBounds: function (bounds, gridSize) { /// /// 获取一个扩展的视图范围,把上下左右都扩大一样的像素值。 /// /// google.maps.LatLngBounds的实例化对象 /// 要扩大的像素值 /// 返回扩大后的视图范围 gridSize = gridSize || this.CONSTANT.GRID_SIZE; bounds = this.cutBoundsInRange(bounds); var pixelNE = gUtils.fromLatLngToDivPixel(bounds.getNorthEast()); var pixelSW = gUtils.fromLatLngToDivPixel(bounds.getSouthWest()); pixelNE.x += gridSize; pixelNE.y -= gridSize; pixelSW.x -= gridSize; pixelSW.y += gridSize; var newNE = gUtils.fromDivPixelToLatLng(pixelNE); var newSW = gUtils.fromDivPixelToLatLng(pixelSW); return new google.maps.LatLngBounds(newSW, newNE); }, cutBoundsInRange: function (bounds) { /// /// 按照地图支持的世界范围对bounds进行边界处理 /// /// BMap.Bounds /// 返回不越界的视图范围 var maxX = this.getRange(bounds.getNorthEast().lng(), -180, 180); var minX = this.getRange(bounds.getSouthWest().lng(), -180, 180); var maxY = this.getRange(bounds.getNorthEast().lat(), -74, 74); var minY = this.getRange(bounds.getSouthWest().lat(), -74, 74); var sw = new google.maps.LatLng(minY, minX); var ne = new google.maps.LatLng(maxY, maxX); return new google.maps.LatLngBounds(sw, ne); }, getRange: function (i, mix, max) { /// /// 对单个值进行边界处理。 /// /// 要处理的数值 /// 下边界值 /// 上边界值 /// 返回不越界的数值 mix && (i = Math.max(i, mix)); max && (i = Math.min(i, max)); return i; } }; gUtils.marker = { add: function (lon, lat) { /// /// 创建地图标记 /// 说明:需要marker.setMap(window.gmap);或MarkerManger进行管理 /// /// 地理纬度 /// 地理经度 /// google.maps.Marker var marker = new google.maps.Marker({ animation: false, //google.maps.Animation.DROP, position: new google.maps.LatLng(lat, lon) }); return marker; }, addWithIcon: function (lon, lat, iconpath, size) { /// /// 创建标记并且定义图标 /// 说明:需要marker.setMap(window.gmap);或MarkerManger进行管理 /// /// 地理纬度 /// 地理经度 /// 图标路径 /// google.maps.Size /// google.maps.Marker var image = { url: iconpath, size: size, origin: new google.maps.Point(0, 0), anchor: new google.maps.Point(0, 32) }; var marker = new google.maps.Marker({ animation: false, //google.maps.Animation.DROP, position: new google.maps.LatLng(lat, lon), icon: image, }); return marker; }, addWithTitle: function (lon, lat, title) { /// ///创建标记并且设置toolTip文字 ///说明:需要marker.setMap(window.gmap);或MarkerManger进行管理 /// /// 地理纬度 /// 地理经度 /// toolTip文字 /// google.maps.Marker var marker = new google.maps.Marker({ animation: false, //google.maps.Animation.DROP, position: new google.maps.LatLng(lat, lon), title: title }); return marker; }, finded: function (point) { /// /// 根据经纬度查找标记 /// /// google.maps.LatLng /// google.maps.Marker if (point instanceof google.maps.LatLng) { for (var i = 0; i < overlays.length; i++) { var overlay = overlays[i]; if (overlay instanceof google.maps.Marker) { var position = overlay.getPosition(); if (position.equals(point)) { return overlay; } } } } }, findInBounds: function (properties, value) { /// /// 查找可视范围内标记 /// /// 键 /// 值 /// 若查找到则返回google.maps.Marker;若查找不到则返回NULL var bounds = window.gmap.getBounds(); for (var i = 0; i < overlays.length; i++) { var overlay = overlays[i]; if (overlay instanceof google.maps.Marker) { if (bounds.contains(overlay.getPosition())) { if (overlay[properties] == value) return overlay; } } } return null; }, findAllInBounds: function (properties, value) { /// /// 查找可视范围内符合条件标记的集合 /// /// 键 /// 值 /// var finded = new Array; var bounds = window.gmap.getBounds(); for (var i = 0; i < overlays.length; i++) { var overlay = overlays[i]; if (overlay instanceof google.maps.Marker) { if (bounds.contains(overlay.getPosition())) { if (overlay[properties] == value) finded.push(overlay); } } } return finded; }, focused: function (marker, zoom) { /// /// 标记聚焦 /// /// 标记 /// 缩放级别 if (marker instanceof google.maps.Marker) { var point = marker.getPosition(); gUtils.focused(point, zoom); } }, inBound: function (marker) { /// /// 判断标记是否在可是范围 /// /// 标记 /// 是否在可是范围内 if (marker instanceof google.maps.Marker) { var bounds = gmap.getBounds(); return bounds.contains(marker.getPosition()); } return false; }, setInfoWindow: function (marker, htmlElement) { /// /// 设置Marker点击的时候,显示的InfoWindow /// /// 需要设置的MARKER标记 /// htmlElement内容 google.maps.event.addListener(marker, 'click', function () { if (infoWindow instanceof google.maps.InfoWindow) infoWindow.close(); infoWindow = gUtils.infoWindow.create(htmlElement); infoWindow.open(window.gmap, marker); }); }, showInfoWindow: function (marker, htmlElement) { /// /// 显示InfoWindow /// /// 标记 /// htmlElement if (marker) { gUtils.infoWindow.add(marker, htmlElement, true); } }, show: function (marker) { /// /// 显示Marker /// /// Marker if (marker instanceof google.maps.Marker) { marker.setVisible(true); } }, hide: function (maker) { /// /// 隐藏Marker /// /// Marker if (marker instanceof google.maps.Marker) { marker.setVisible(false); } }, release: function (marker) { /// /// 在地图上释放掉marker标记,但是不从overlays中删除; /// /// marker标记 if (marker instanceof google.maps.Marker) { marker.setMap(null); } }, load: function (marker) { /// /// 将标记重新加载到地图上,主要针对之前在地图上标记释放过操作 /// /// marker标记 if (marker instanceof google.maps.Marker) { marker.setMap(window.gmap); } } }; gUtils.tool = { CONSTANT: { RANDOM_NUMER: 100 }, addRandomInViewRange: function (number) { /// /// 在可视区域内添加随机标记 /// 默认100个 /// /// 标记个数 google.maps.event.addListener(window.gmap, 'tilesloaded', function () { if (window.gmap) { var bounds = window.gmap.getBounds(); var sw = bounds.getSouthWest(); var ne = bounds.getNorthEast(); var lngSpan = Math.abs(ne.lng() - sw.lng()); var latSpan = Math.abs(sw.lat() - ne.lat()); for (var i = 0; i < 100 ; i++) { var marker = gUtils.marker.addWithTitle(sw.lng() + lngSpan * (Math.random() * 0.9), ne.lat() - latSpan * (Math.random() * 0.9), i + 'Google Map'); marker.id = i; gUtils.marker.setInfoWindow(marker, '上海啊上海'); gUtils.addMarker(marker); } } }); } }; gUtils.overlays = { add: function (overlay) { /// /// 新增覆盖物,将覆盖物增加到overlays数组中 /// /// 覆盖物 if (overlay) { overlays.push(overlay); } }, find: function (properties, value) { /// /// 查找覆盖物 /// /// 键 /// 值 /// 找到则返回覆盖物;若没找到则返回NULL for (var i = 0; i < overlays.length; i++) { var overlay = overlays[i]; if (overlay.hasOwnProperty(properties)) { if (overlay[properties] == value) return overlay; } } }, findAll: function (properties, value) { /// /// 查找符合条件覆盖物的集合 /// /// 键 /// 值 /// Array var finded = new Array; for (var i = 0; i < overlays.length; i++) { var overlay = overlays[i]; if (overlay.hasOwnProperty(properties)) { if (overlay[properties] == value) finded.push(overlay); } } return finded; }, count: function () { return overlays.length; }, show: function (properties, value) { /// /// 查找覆盖物并显示 /// /// 键 /// 值 var overlay = this.find(properties, value); if (overlay) { overlay.setVisible(true); } }, remove: function (properties, value) { /// /// 查找覆盖物并删除 /// /// 键 /// 值 var overlay = this.find(properties, value); if (overlay) { overlay.setVisible(false); overlay.setMap(null); markers.remove(overlay); } }, removeAll: function (properties, value) { /// /// 查找所有符合条件的覆盖物并删除 /// /// 键 /// 值 var finded = this.findAll(properties, value); for (var i = 0; i < finded.length; i++) { var overlay = finded[i]; overlay.setVisible(false); overlay.setMap(null); markers.remove(overlay); } }, hide: function (properties, value) { /// /// 查找覆盖物并隐藏 /// /// 键 /// 值 var overlay = this.find(properties, value); if (overlay) { overlay.setVisible(false); } }, clearAll: function () { /// /// 清除地图上所有的覆盖物 /// for (var i = 0; i < overlays.length; i++) { overlays[i].setVisible(false); overlays[i].setMap(map); } overlays = []; } }; gUtils.infoWindow = { CONSTANT: { WIDTH: 250, HEIGHT: 80 }, create: function (htmlElement) { /// /// 创建infoWindow /// /// 显示内容HTML /// google.maps.InfoWindow infoWindow = new google.maps.InfoWindow({ content: htmlElement, }); return infoWindow; }, add: function (point, htmlElement, focused) { /// /// 为point添加infoWindow对象 /// /// /// infowindows 内容 /// 是否聚焦点 if (point) { if (infoWindow instanceof google.maps.InfoWindow) { infoWindow.close(); infoWindow.setContent(htmlElement); } else { infoWindow = this.create(htmlElement); } infoWindow.open(window.gmap, point); //if (focused) { // gUtils.focused(point, window.gmap.getZoom()); // //window.gmap.setCenter(point); // //map.setCenter(marker.getPosition()); //} } } }; window.gUtils = gUtils; })();