123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661 |
- /**
- * [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
- }
- });
|