/** * @fileoverview 工具 在地图上打标记 模块 * @author Song.Huang * @version 1.0.0 */ define([ 'html!templates/tools/toolMarkPoint', 'modDir/service/addressSearch', 'modDir/service/poiSearch', 'modDir/service/regionSearch', 'modDir/service/routeSearch', 'css!styles/tools/toolMarkPoint' ], function(tplLayout, addressSearchF, poiSearchF, regionSearchF, routeSearchF) { /** * 模块数据 用于数据存储和外部调用 * @type {Object} * 数据存放 */ var modValue = { markerGroup: null, //marker容器 markers: [], //marker记录 curMarkerGuid: null, mayFavGuid: {}, markerType: [ map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_type_0.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_type_1_b.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_type_1_m.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_type_1_s.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_type_2_b.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_type_2_m.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_type_2_s.png' ], markerTypeIcon: [ map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_icon_0.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_icon_1_b.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_icon_1_m.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_icon_1_s.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_icon_2_b.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_icon_2_m.png', map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_icon_2_s.png' ], appendToMyLayer:null }; /** * 模块状态,用于存储模块的状态 例如:收起,关闭 * @type {Object} */ var status = { initialized: false //是否初始化 }; /** * 初始化并订阅事件 * @return {[type]} [description] */ function init() { if (!status.initialized) { bindEvent(); subscribe(); status.initialized = true; modValue.markerGroup = map23DControl.group({ action: 'add' }); } map2DViewer.map.on('click', onClickPoint); ONEMAP.C.publisher.publish({ modName: 'toolMarkPoint' }, 'tools:active'); }; /** * 注册监听 * @type {Function} */ function subscribe() { ONEMAP.C.publisher.subscribe(clearAllMarker, 'cleanMap'); ONEMAP.C.publisher.subscribe(remove, 'tools:active'); ONEMAP.C.publisher.subscribe(remove, 'change23D'); }; /** * 移除模块 */ function remove(options) { if (options.modName != 'toolMarkPoint') { removeCurClass(); //clearAllMarker(); map2DViewer.map.off('click', onClickPoint); ONEMAP.M.mapHolder.mouseHand(); } else { if ($('.tools-marker').hasClass('cur')) { removeCurClass(); //clearAllMarker(); map2DViewer.map.off('click', onClickPoint); ONEMAP.M.mapHolder.mouseHand(); } else { if(modValue.appendToMyLayer){ $('.tools-marker').addClass('cur'); ONEMAP.M.mapHolder.removeMouseHand(); if (L.Browser.ie || L.Browser.firefox) { map2DViewer.map.getContainer().style.cursor = 'url(' + map23DConfig.map23DAssetsUrl + '/scripts/vendor/map23dlib/images/marker.cur) 12 30,auto'; } else { map2DViewer.map.getContainer().style.cursor = 'url(' + map23DConfig.map23DAssetsUrl + '/scripts/vendor/map23dlib/images/marker.cur) 12 30,auto'; } }else{ var layerLength = ONEMAP.M.myLayers.checkLength(); if(layerLength < map23DConfig.layerMaxLength){ $('.tools-marker').addClass('cur'); ONEMAP.M.mapHolder.removeMouseHand(); if (L.Browser.ie || L.Browser.firefox) { map2DViewer.map.getContainer().style.cursor = 'url(' + map23DConfig.map23DAssetsUrl + '/scripts/vendor/map23dlib/images/marker.cur) 12 30,auto'; } else { map2DViewer.map.getContainer().style.cursor = 'url(' + map23DConfig.map23DAssetsUrl + '/scripts/vendor/map23dlib/images/marker.cur) 12 30,auto'; } }else{ ONEMAP.C.publisher.publish({ type: 'warning', message: '图层数量已达上限' }, 'noteBar::add'); } } } } }; /** * 样式移除 */ function removeCurClass() { $('.tools-marker').removeClass('cur'); }; /** * 填写点数据后保存数据 * @type {Function} * @param guid {Number} marker的guid */ function saveMarkerData(guid, address) { var name = $('#markerAddress').val(); if (name === '' || name === ' ') { alert('名称不能为空或包含空格'); return false; } if ((/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\s]/g).test(name)) { alert('名称只能包含英文、数字、中文'); return false; } map23DData.markers[guid]['adress'] = name; if (map23DData.markers[guid].markerAddress !== '' && map23DData.markers[guid].markerAddress !== ' ') { require(['modDir/user/userPoint'], function(userPoint) { userPoint.addPoint({ name: name, latlng: map23DData.markers[guid].geojson.geometry.coordinates, pguid: guid, type: map2DViewer.markers[guid].markerType }); }); if (map23DData.display.map2D) { map2DViewer.markers[guid].closePopup(); } else if (map23DData.display.map3D) { map3DViewer.markers[guid].closePopup(); } } else { alert('名称不能为空值!'); } }; /** * 删除点 * @type {Function} * @param guid {Number} marker的guid */ function deleteMarker(guid) { map23DControl.marker({ action: 'remove', guid: guid }) }; /** * 清除所有的点 这里有 工具 栏 模块之间相互通告清除 * @type {Function} */ function clearAllMarker() { map23DControl.group({ action: 'cleanAll', guid: modValue.markerGroup }) if (modValue.appendToMyLayer) { var options = { action: "remove", DOMid: modValue.appendToMyLayer } ONEMAP.M.myLayers.myLayerControl(options); modValue.appendToMyLayer = false; } map2DViewer.map.off('click', onClickPoint); ONEMAP.M.mapHolder.mouseHand(); /*if (L.Browser.ie || L.Browser.firefox) { //map2DViewer.map.getContainer().style.cursor = "pointer"; map2DViewer.map.getContainer().style.cursor = 'url('+map23DConfig.map23DAssetsUrl + '/scripts/vendor/map23dlib/images/cur-none.cur),auto'; } else { //map2DViewer.map.getContainer().style.cursor = "pointer"; map2DViewer.map.getContainer().style.cursor = 'url('+map23DConfig.map23DAssetsUrl + '/scripts/vendor/map23dlib/images/cur-none.cur) 5 5,auto'; }*/ }; /** * 通过地图缩放等级和坐标查找 地名 * @type {Function} * @param latLng {Object} 坐标 * @param callBack_func {Function} 回调方法 * @private */ function getInfoByZoomLatLng(latLng, callBack_func) { var zoom = map23DData.view.zoom; var addressSearch = new addressSearchF(); addressSearch.getAddressInfo({ zoom: zoom, latLng: [latLng.lat, latLng.lng] }, function(data) { ONEMAP.V.loading.loaded(); data = data.data; callBack_func(data); }); }; /** * 图层控制 */ function controlMyLayer(options){ switch (options.action) { case 'remove': removeMyLayer(); break; case 'opacity': setGropOpacity(options); break; } } function removeMyLayer(){ clearAllMarker(); removeCurClass(); modValue.appendToMyLayer = null; } function setGropOpacity(options){ var options = options.options; if (options.opacity == 1) { map23DControl.group({ action: 'show', guid: modValue.markerGroup }) } else if (options.opacity == 0) { map23DControl.group({ action: 'hide', guid: modValue.markerGroup }) } } /** * 标记点击修改 * @type {Function} * @param e * @private */ function onClickPoint(e) { if(!modValue.appendToMyLayer){ var options = { action: "add", DOM: { name: '标记', type: "group", guid: modValue.markerGroup } } modValue.appendToMyLayer = ONEMAP.M.myLayers.myLayerControl(options); ONEMAP.C.publisher.subscribe(controlMyLayer, modValue.appendToMyLayer); } createMarker(e); setTimeout(function() { $('.marker-build-list span').bind('click', function() { $('.marker-build-list .select').removeClass('select'); $(this).addClass('select'); }); }, 200); getInfoByZoomLatLng(e.latlng, function(data) { var address = data.address.toString(); address = address.replace(/\ /g, ""); modValue.address = address ? address : '未知地点'; $("#markerAddress").val(modValue.address); }); }; /** * 创建一个新的标记 * @type {Function} * @param e * @returns {L.Marker} * @private */ function myFavPoint(e) { if (!status.initialized) { init(); ONEMAP.C.publisher.publish({ modName: 'userPoint', }, 'tools:active'); } if (modValue.mayFavGuid[e.guid]) { var latlng = map2DViewer.markers[modValue.mayFavGuid[e.pguid]].getLatLng(); map23DControl.setView({ center: { lat: latlng.lat, lng: latlng.lng } }) } else { var iconUrl = modValue.markerTypeIcon[e.type]; var markerId = map23DControl.marker({ action: 'add', groupId: modValue.markerGroup, geojson: { "properties": { iconUrl: iconUrl, iconSize: [60, 39], iconAnchor: [29, 39], popupAnchor: [0, -39] }, "geometry": { "type": "Point", "coordinates": [e.latlng[1], e.latlng[0]] } } }); modValue.mayFavGuid[e.pguid] = markerId; modValue.markers.push(markerId); modValue.curMarkerGuid = markerId; if (map23DData.display.map2D) { map2DViewer.markers[markerId].bindPopup(createMarKerPopViewHtml({ address: (this.markerAddress ? this.markerAddress : ' '), guid: this.guid }), { closeButton: false, minWidth: 200, maxWidth: 200 }); map2DViewer.markers[markerId].openPopup(); } else if (map23DData.display.map3D) { map3DViewer.label({ action: 'update', guid: markerId, featureType: 'marker', label: { text: e.name, //标牌内容 textColor: '#ffffff', //标牌文字颜色 lineColor: '#ff0000', //标牌引线及边框颜色 background: '#FF0000', //标牌背景颜色 lineTop: 10, //标牌偏移值 lineLeft: 100 //标牌偏移值 } }) } } } function createMarker(e) { var markerId = map23DControl.marker({ action: 'add', groupId: modValue.markerGroup, geojson: { "properties": { iconUrl: map23DConfig.map23DAssetsUrl + '/images/layout/marker/roadsign_icon_0.png', iconSize: [60, 39], iconAnchor: [29, 39], popupAnchor: [0, -39] }, "geometry": { "type": "Point", "coordinates": [e.latlng.lng, e.latlng.lat] } } }); modValue.markers.push(markerId); modValue.curMarkerGuid = markerId; if (map23DData.display.map2D) { map2DViewer.markers[markerId].bindPopup(createMarKerPopHtml({ address: modValue.address, guid: markerId }), { closeButton: false, minWidth: 300, maxWidth: 300 }); map2DViewer.markers[markerId].openPopup(); map2DViewer.markers[markerId].on('click', function() { this.bindPopup(createMarKerPopViewHtml({ address: (modValue.address ? modValue.address : ' '), guid: this.guid }), { closeButton: false, minWidth: 200, maxWidth: 200 }); this.openPopup(); }); } else if (map23DData.display.map3D) { } }; /** * 创建标记弹出 信息,表单 * @type {Function} * @param data {Object} 标记数据 * @returns {string} * @private */ function createMarKerPopHtml(data) { var markerData = data; modValue.curMarkerGuid = markerData.guid; var container = '