/** * [ONEMAP.M.toolTuFu] * @return {[object]} */ define(function (tplLayout) { /** * 模块数据 用于数据存储和外部调用 * @type {Object} * 数据存放 */ var modValue = { lines: [], canvas: L.canvas(), tufuNum: ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "I", "S", "T", "U", "V", "W", "X", "Y", "Z"], handler: null, zoom: 0 } /** * 模块界面样式 例如:宽,高 * @type {Object} */ var styles = {} /** * 模块状态,用于存储模块的状态 例如:收起,关闭 * @type {Object} */ var status = { initialized: false } /** * 初始化并订阅事件 * @return {[type]} [description] */ function init() { if (!status.initialized) { buildTuFu(); subscribe(); status.initialized = true; } else { //clearSquareGrid(); //status.initialized = false; } } function buildTuFu() { // getMapNum(39,116,1000000) //图幅代码 var lon_num, lat_num, lon_offset = -1, lat_offset = 4, father_lon_offset = -1, father_lat_offset = -1, row_column = 0; var mErrorInfo; var father_lon_offset_map = { "1000000": [6.0, 12.0, 24.0], "100000": [6.0, 12.0, 24.0], "250000": [6.0, 12.0, 24.0], "500000": [6.0, 12.0, 24.0], "50000": [0.5, 1.0, 2.0], "25000": [0.25, 0.5, 1.0], "10000": [0.125, 0.25, 0.5] }; var father_lat_offset_map = { "1000000": 4.0, "100000": 4.0, "250000": 4.0, "500000": 4.0, "50000": 0.333333333333, "25000": 0.166666666667, "10000": 0.833333333333 }; var row_column_map = { "1000000": 12, "100000": 12, "250000": 4, "500000": 2, "50000": 2, "25000": 2, "10000": 2 }; /** * 计算在100万地图中的经纬度编号 * @param lat * @param lon */ function getLatlonNum(lat, lon) { if (lat >= -60 & lat < 60) { lon_offset = 6; } else if ((lat >= 60 & lat < 76) || (lat >= -76 & lat < -60)) { lon_offset = 12; } else if ((lat >= 76 & lat < 88) || (lat >= -88 & lat < -76)) { lon_offset = 24; } else { mErrorInfo = "您输入的纬度不在范围内"; return null; } //1.计算经度列号 lon_num = JSON.stringify(1 + Math.floor((180 + lon) / lon_offset)); var lat_over_num = Math.floor((lat + 88) / lat_offset); if (lat >= 0) { lat_num = JSON.stringify(lat_over_num - 21); } else { lat_num = JSON.stringify(22 - lat_over_num); } lat_num = addPreZero(2, lat_num) lon_num = addPreZero(2, lon_num) return modValue.tufuNum[lat_num - 1] + "-" + lon_num; } function addPreZero(wei, num) { var t = (num + '').length, s = ''; if (t < wei) { for (var i = 0; i < wei - t; i++) { s += '0'; } return s + num; } else { return num.substring(0, wei) } } /** * 计算在父级地图中的行列排列的编号 * @param lat * @param lon * @param scale */ function getRowColumnNum(lat, lon, scale) { var father_lon_offsets; $.each(father_lat_offset_map, function (i, t) { if (scale == i) { father_lon_offsets = father_lon_offset_map[i]; if (lat >= -60 & lat < 60) { father_lon_offset = father_lon_offsets[0]; } else if ((lat >= 60 & lat < 76) | (lat >= -76 & lat < -60)) { father_lon_offset = father_lon_offsets[1]; } else if ((lat >= 76 & lat < 88) | (lat >= -88 & lat < -76)) { father_lon_offset = father_lon_offsets[2]; } else { mErrorInfo = "您输入的纬度不在范围内"; return null; } //父级纬度偏差 father_lat_offset = father_lat_offset_map[i]; //父级分成几行几列 row_column = row_column_map[i]; } }) //3.计算在父级地图中的编号 //行偏差 var row_offset; var new_lat = (lat + 88); var latd = new_lat / father_lat_offset; var latd_int = parseInt(latd); row_offset = Math.floor((latd - latd_int) * row_column); //列偏差 var column_offset; var new_lon = lon + 180; var lond = new_lon / father_lon_offset; var lond_int = parseInt(lond); column_offset = Math.floor((lond - lond_int) * row_column); //行号 var row = row_column - row_offset; //列号 var column = column_offset + 1; //计算旧图幅的尾号 var old_tail = row_column * (row - 1) + column; old_tail = JSON.stringify(old_tail) var rowColumnNum = ""; if (scale == 100000) { //10万地图为三位数 rowColumnNum = addPreZero(3, old_tail); rowColumnNum = "-" + rowColumnNum; } else if (scale == 250000) { //25万为两位数 rowColumnNum = addPreZero(2, old_tail); rowColumnNum = "-[" + rowColumnNum + "]" } else { //其余都是2行2列 为1位数 rowColumnNum = addPreZero(1, old_tail); rowColumnNum = "-" + modValue.tufuNum[rowColumnNum - 1] } return rowColumnNum; } modValue.getMapNum = function (lat, lon, scale) { if (lon >= 360 || lon <= -360) { lon = lon % 360 } if (lon > 180) { lon = lon - 360; } if (lon < -180) { lon = lon + 360; } if (lon == 180) { lon = 179; } var latlonNum = getLatlonNum(lat, lon); var rowColumnNum10 = getRowColumnNum(lat, lon, 100000); //0 父级 1尾号 var rowColumnNum5 = getRowColumnNum(lat, lon, 50000); var rowColumnNum2 = getRowColumnNum(lat, lon, 25000); var rowColumnNum1 = getRowColumnNum(lat, lon, 10000); if (latlonNum == null || rowColumnNum1 == null || rowColumnNum2 == null || rowColumnNum5 == null || rowColumnNum10 == null) { return null; } if (scale == 1000000) { return latlonNum; } else if (scale == 100000 | scale == 250000 | scale == 500000) { return latlonNum + "" + getRowColumnNum(lat, lon, scale); } else if (scale == 50000) { return latlonNum + "" + rowColumnNum10 + "" + rowColumnNum5; } else if (scale == 25000) { return latlonNum + "" + rowColumnNum10 + "" + rowColumnNum5 + rowColumnNum2; } else if (scale == 10000) { return latlonNum + "" + rowColumnNum10 + "" + rowColumnNum5 + rowColumnNum2 + rowColumnNum1; } mErrorInfo = "您输入的比例尺不在计算范围内"; return null; } var E6 = 10 ^ 6; var DEG2MIN = 60; var MIN2SEC = 60; var DEG2SEC = DEG2MIN * MIN2SEC; var mMinLat; var mMaxLat; var mMinLon; var mMaxLon; var offsetX = { "1000000": 6, "500000": 3, "250000": 1.5, "100000": 0.5, "50000": 0.25, "25000": 0.125, "10000": 0.0625, } var offsetY = { "1000000": 4, "500000": 2, "250000": 1, "100000": 0.3333, "50000": 0.16666, "25000": 0.08333, "10000": 0.0416667, } modValue.tf = map23DControl.group({ action: 'add' }) var arrayPointX = []; var arrayPointY = []; modValue.drawSafe = function (bouns, scale) { var mOffsetX = offsetX[scale]; var mOffsetY = offsetY[scale]; var curOffsetX = mOffsetX; var curOffsetY = mOffsetY; if (mOffsetX < 0 || mOffsetY < 0) { return; } mMinLat = bouns._southWest.lat; mMaxLat = bouns._northEast.lat; mMinLon = bouns._southWest.lng; mMaxLon = bouns._northEast.lng; dMinLat = mMinLat = Math.floor(mMinLat - mMinLat % mOffsetY + mOffsetY); dMaxLat = mMaxLat = Math.ceil(mMaxLat - mMaxLat % mOffsetY); //mMinLon = Math.floor(mMinLon - mMinLon % mOffsetX + mOffsetX); //mMaxLon = Math.ceil(mMaxLon - mMaxLon % mOffsetX); mMinLon1 = Math.floor(mMinLon / mOffsetX) * mOffsetX; //-60,60 mMaxLon1 = Math.ceil(mMaxLon / mOffsetX) * mOffsetX; //-60,60 var mOffsetX2 = mOffsetX * 2; mMinLon2 = Math.floor(mMinLon / mOffsetX2) * mOffsetX2 - mOffsetX2; //-78, -60 mMaxLon2 = Math.ceil(mMaxLon / mOffsetX2) * mOffsetX2 + mOffsetX2; //78, -60 var mOffsetX3 = mOffsetX * 4; mMinLon3 = Math.floor(mMinLon / mOffsetX3) * mOffsetX3 - mOffsetX * 6; // -88, -78, mMaxLon3 = Math.ceil(mMaxLon / mOffsetX3) * mOffsetX3 + mOffsetX * 6; // 88, 78, var arrayPoint = []; returnX(mMinLon1, mMaxLon1, dMinLat, dMaxLat, curOffsetX, -60, 60, curOffsetY, bouns, scale); returnX(mMinLon2, mMaxLon2, dMinLat, dMaxLat, curOffsetX * 2, 60, 76, curOffsetY, bouns, scale); returnX(mMinLon3, mMaxLon3, dMinLat, dMaxLat, curOffsetX * 4, 76, 88, curOffsetY, bouns, scale); returnX(mMinLon2, mMaxLon2, dMinLat, dMaxLat, curOffsetX * 2, -76, -60, curOffsetY, bouns, scale); returnX(mMinLon3, mMaxLon3, dMinLat, dMaxLat, curOffsetX * 4, -88, -76, curOffsetY, bouns, scale); } function returnX(mMinLon, mMaxLon, dMinLat, dMaxLat, offsetx, minlat, maxlat, curOffsetY, bouns, scale) { if (dMinLat > maxlat || minlat > dMaxLat) { return; } arrayPointX = []; arrayPointY = []; for (var y = minlat; y <= maxlat; y += curOffsetY) { arrayPointY.push(y) } for (var x = mMinLon; x <= mMaxLon; x += offsetx) { arrayPointX.push(x) } drawLine(minlat, maxlat, arrayPointX, arrayPointY, bouns, scale, mMinLon, mMaxLon) } function drawLine(minlat, maxlat, arrayPointX, arrayPointY, bouns, scale, mMinLon, mMaxLon) { mMinLat = minlat; mMaxLat = maxlat; mMinLon = mMinLon; mMaxLon = mMaxLon; dfLon = (mMaxLon - mMinLon) / 4 middleLon = (mMaxLon + mMinLon) / 2 for (var i = 0; i < arrayPointY.length; i++) { if (map23DData.display.map2D) { map2DViewer.polyline({ action: 'add', groupId: modValue.tf, geojson: { "type": "Feature", "properties": { title: '测试polyline', color: '#00ffcc', weight: 1, opacity: 1, }, "geometry": { "coordinates": [ [mMinLon, arrayPointY[i]], [mMaxLon, arrayPointY[i]] ] } } }) } if (map23DData.display.map3D) { if (arrayPointY[i] >= 0) { var center = [0, 90] } else { var center = [0, -90] } var point1cartographic = Cesium.Cartographic.fromCartesian(Cesium.Cartesian3.fromDegrees(center[0], center[1])); var point2cartographic = Cesium.Cartographic.fromCartesian(Cesium.Cartesian3.fromDegrees(0, arrayPointY[i])); /**根据经纬度计算出距离**/ var geodesic = new Cesium.EllipsoidGeodesic(); geodesic.setEndPoints(point1cartographic, point2cartographic); map3DViewer.circle({ action: 'add', groupId: modValue.tf, geojson: { "type": "Feature", "properties": { title: '测试圆', color: '#00ffcc', weight: 1, fillColor: '#00ffcc', opacity: 1, fillOpacity: 0, altitudeMode: 0, //海拔模式 radius: geodesic.surfaceDistance }, "geometry": { "type": "Circle", "coordinates": center } } }) } } for (var i = 0; i < arrayPointX.length; i++) { map23DControl.polyline({ action: 'add', groupId: modValue.tf, geojson: { "type": "Feature", "properties": { title: '测试polyline', color: '#00ffcc', weight: 1, opacity: 1, }, "geometry": { "coordinates": [ [arrayPointX[i], mMaxLat], [arrayPointX[i], mMinLat] ] } } }) } } map2DViewer.map.on('moveend', modValue.zoomSelect) map2DViewer.map.on('mousemove', modValue.addTips) modValue.handler = new Cesium.ScreenSpaceEventHandler(map3DViewer.map.scene.canvas); //鼠标移动 modValue.handler.setInputAction(function (e) { var mousePosition = map3DViewer.screenToLatLng(e.endPosition.x, e.endPosition.y) if (!mousePosition) { return } var obj = { latlng: { lat: mousePosition.lat, lng: mousePosition.lng }, originalEvent: { clientX: e.endPosition.x, clientY: e.endPosition.y } } modValue.addTips(obj) }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); PubSub.subscribe('map3D.setView', cameraMoveEnd) if (map23DData.display.map2D) { var center = map2DViewer.map.getCenter() var jzoom = map2DViewer.map.getZoom(); } else if (map23DData.display.map3D) { var center = map3DViewer.get3DViewCenter() var jzoom = map3DViewer.getZoomFrom3DZoom(center.alt) if (!jzoom) { if (center.alt > 100000) { jzoom = 9 } else { jzoom = 10 } } } modValue.zoom = jzoom //当前缩放级别 modValue.bili = 1000000; if (jzoom < 7) { modValue.bili = 1000000; } else if (7 <= jzoom && jzoom < 8) { modValue.bili = 500000; } else if (8 <= jzoom && jzoom < 9) { modValue.bili = 250000; } else if (9 <= jzoom && jzoom < 10) { modValue.bili = 100000; } else if (10 <= jzoom) { modValue.bili = 50000; } map23DControl.setView({ center: { lat: center.lat, lng: center.lng }, zoom: jzoom }); } function cameraMoveEnd() { modValue.zoomSelect() } modValue.addTips = function (e) { modValue.mouseE = e; var lat = e.latlng.lat; var lng = e.latlng.lng; $("#tufuTips").show(); var oEvent = e.originalEvent; var oDiv = document.getElementById('tufuTips'); var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft; oDiv.style.left = oEvent.clientX + scrollLeft + 'px'; oDiv.style.top = oEvent.clientY + scrollTop + 'px'; // console.log(.) var num = modValue.getMapNum(lat, lng, modValue.bili); $("#tufuTips").text(num); } modValue.zoomSelect = function () { if (map23DData.display.map2D) { var bouns = map2DViewer.map.getBounds(); var jzoom = map2DViewer.map.getZoom(); modValue.zoom == jzoom } if (map23DData.display.map3D) { var center = map3DViewer.get3DViewCenter() var jzoom = map3DViewer.getZoomFrom3DZoom(center.alt) if (!jzoom) { jzoom = 0 modValue.zoom = 0; } if (modValue.zoom == jzoom) { return } else { if (modValue.zoom < 7 || modValue.zoom > 10) { modValue.zoom = jzoom return } } modValue.zoom = jzoom if (jzoom < 7) { var bouns = { _southWest: { lng: -180, lat: -88 }, _northEast: { lng: 180, lat: 88 }, } } else { var rec = map3DViewer.map.camera.computeViewRectangle() var south = Cesium.Math.toDegrees(rec.south) var west = Cesium.Math.toDegrees(rec.west) var north = Cesium.Math.toDegrees(rec.north) var east = Cesium.Math.toDegrees(rec.east) var bouns = { _southWest: { lng: west, lat: south }, _northEast: { lng: east, lat: north }, } } } cleanlines(); if (jzoom < 7) { modValue.bili = 1000000; } else if (7 <= jzoom && jzoom < 8) { modValue.bili = 500000; } else if (8 <= jzoom && jzoom < 9) { modValue.bili = 250000; } else if (9 <= jzoom && jzoom < 10) { modValue.bili = 100000; // }else if(10<=jzoom && jzoom<11){ } else if (10 <= jzoom) { modValue.bili = 50000; } // else if(11<=jzoom && jzoom<13){ // modValue.bili = 25000; // }else if(13<=jzoom){ // modValue.bili = 10000; // } modValue.drawSafe(bouns, modValue.bili) if (modValue.mouseE) { modValue.addTips(modValue.mouseE) } } function cleanlines() { if (modValue.tf) { map23DControl.group({ action: 'cleanAll', guid: modValue.tf }); } } function clearTufu() { if ($("#mapBaseLayerControl .choosemap .tufu-control input").is(":checked")) { $("#mapBaseLayerControl .choosemap .tufu-control input").click(); } } function removelines() { $("#tufuTips").hide(); if (modValue.tf) { map23DControl.group({ action: 'remove', guid: modValue.tf }); } map2DViewer.map.off('moveend', modValue.zoomSelect) map2DViewer.map.off('mousemove', modValue.addTips) PubSub.unsubscribe('map3D.setView', cameraMoveEnd) if (modValue.handler) { modValue.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE); modValue.handler = null } status.initialized = false; } /** * 设置界面 */ function setLayout() { } /** * 界面事件绑定 * @return {[type]} [description] */ function bindEvent() { } /** * 界面重置 * @return {[type]} [description] */ function layoutResize() { } /** * 注册订阅 * @type {Function} * 推送:ONEMAP.C.publisher.publish(options,'moduleName::type'); * 订阅:ONEMAP.C.publisher.subscribe(layoutResize,'sideBarLayoutChange'); */ function subscribe() { ONEMAP.C.publisher.subscribe(clearTufu, 'cleanMap'); } /** * 取消订阅 * @type {Function} * 取消订阅:ONEMAP.C.publisher.unSubscribe(layoutResize,'sideBarLayoutChange'); */ function unSubscribe() {} /** * 模块移除 * @return {[type]} [description] */ function remove() { //取消订阅 unSubscribe(); } return ONEMAP.M.toolTuFu = { init: init, removelines: removelines } });