(function () { const css = '/static/plugs/mapLocation/mapLocation.css'; var mapLocation = function () { $(function () { var cssElement = document.createElement('link'); cssElement.setAttribute('rel', 'stylesheet'); cssElement.setAttribute('href', css); document.body.appendChild(cssElement); }); }; mapLocation.prototype.render = function (elem, data) { var defaultOption = { defaultLocationLongitude: 116.407466, defaultLocationLatitude: 39.904989, defaultZoom: 16, height: 'calc(95vh - 120px)', width: '100%', name: ua.randdomString(), location: null, locationLatitude: null, locationLongitude: null }; var options = $.extend(defaultOption, data); var originalLocation = $(options.location).val(); var originalLocationLatitude = $(options.locationLatitude).val(); var originalLocationLongitude = $(options.locationLongitude).val(); if (!options.key) { console.log('请提供天地图API Key'); return; } // console.log(options); var mapId = options.name; var mapContainer = $(`
打开地图
关闭
重置
`); $(elem).css('clear', 'both'); mapContainer.appendTo(elem); var mapContent = $('#' + mapId); mapContent.css('height', options.height); mapContent.css('width', options.width); mapContent.hide(); var map = null; var oldMarker = null; // 初始化地图的函数 function initMap() { if (map) return; // 如果地图已经初始化,直接返回 var normalm = L.tileLayer.chinaProvider('TianDiTu.Normal.Map', { key: options.key, }), normala = L.tileLayer.chinaProvider('TianDiTu.Normal.Annotion', { key: options.key, }), imgm = L.tileLayer.chinaProvider('TianDiTu.Satellite.Map', { key: options.key, }), imga = L.tileLayer.chinaProvider('TianDiTu.Satellite.Annotion', { key: options.key, }); var normal = L.layerGroup([normalm, normala]), image = L.layerGroup([imgm, imga]); var baseLayers = { "地图": normal, "影像": image, }; var overlayLayers = {}; map = L.map(mapId, { center: [35.104, 118.3556], layers: [normal], zoom: 12 }); // 多图层切换有问题,需要换成不含form element的方式 L.control .layers(baseLayers, overlayLayers) .setPosition('bottomleft') .addTo(map); map.on('click', function (e) { if (oldMarker) { oldMarker.removeFrom(map); } var marker = L.marker(e.latlng); marker.addTo(map); oldMarker = marker; $.get('//api.tianditu.gov.cn/geocoder', { postStr: JSON.stringify({ lon: e.latlng.lng, lat: e.latlng.lat, ver: 1, }), type: 'geocode', tk: options.key }, function (response) { if (response.status != 0) { mapContainer.find('.error-message').text('获取位置信息失败,请稍后重试'); mapContainer.find('.error-message').show(); return; } var address = response.result.formatted_address; var locationLongitude = e.latlng.lng; var locationLatitude = e.latlng.lat; var addressComponent = response.result.addressComponent; if (options.location) { $(options.location).val(address); } if (options.locationLatitude) { $(options.locationLatitude).val(locationLatitude); } if (options.locationLongitude) { $(options.locationLongitude).val(locationLongitude); } if (options.locationProvince) { $(options.locationProvince).val(addressComponent.province); } if (options.locationCity) { $(options.locationCity).val(addressComponent.city); } if (options.locationCounty) { $(options.locationCounty).val(addressComponent.county); } if (options.locationTown) { $(options.locationTown).val(addressComponent.town); } if (options.locationRoad) { $(options.locationRoad).val(addressComponent.road); } if (options.locationProvinceCode) { $(options.locationProvinceCode).val((addressComponent.province_code || '').replace(/^156/, '')); } if (options.locationCityCode) { $(options.locationCityCode).val((addressComponent.city_code || '').replace(/^156/, '')); } if (options.locationCountyCode) { $(options.locationCountyCode).val((addressComponent.county_code || '').replace(/^156/, '')); } if (options.locationTownCode) { $(options.locationTownCode).val((addressComponent.town_code || '').replace(/^156/, '')); } }); }); } // 绑定初始化事件 mapContainer.find('.init').on('click', function () { mapContent.show(); initMap(); $(this).hide(); mapContainer.find('.if-open').show(); map.on('locationfound', function (e) { mapContainer.find('.location-message').html('您当前的位置:' + e.latlng.lat.toFixed(6) + ',' + e.latlng.lng.toFixed(6) + '
我的定位
'); mapContainer.find('.location-me').data('latlng', e.latlng); if (!options.locationLatitude || !options.locationLongitude || !$(options.locationLatitude).val() || !$(options.locationLongitude).val()) { map.flyTo(e.latlng, 16); } }); map.on('locationerror', function (e) { console.error(e); mapContainer.find('.location-message').text('获取您的位置失败,请检查您的网络或地理位置服务是否开启'); }); mapContainer.find('.location-message').text('正在获取定位...').show(); if (window.location.protocol === 'http:') { $.get('//location.tianditu.gov.cn/data/getCityName',function(r){ mapContainer.find('.location-message').html('您的城市位置:' + r.data.lat + ',' + r.data.lng + '
我的定位
'); mapContainer.find('.location-me').data('latlng', [r.data.lat,r.data.lng]); map.flyTo([r.data.lat,r.data.lng], 12); }) } else { map.locate(); } if(oldMarker){ oldMarker.removeFrom(map); } if (options.locationLatitude && options.locationLongitude && $(options.locationLatitude).val() && $(options.locationLongitude).val()) { var lat = $(options.locationLatitude).val(); var lng = $(options.locationLongitude).val(); oldMarker = L.marker([lat, lng]); oldMarker.addTo(map); map.flyTo([lat, lng], options.defaultZoom); } }); mapContainer.on('click', '.location-me', function () { var latlng = $(this).data('latlng'); map.flyTo(latlng, 16); }); // 绑定取消事件 mapContainer.find('.cancel').on('click', function () { mapContent.hide(); $('.if-open').hide(); mapContainer.find('.if-close').show(); mapContainer.find('.location-message').hide(); mapContainer.find('.error-message').hide(); // 如果需要销毁地图实例,可以在这里添加相关代码 // if (map) { // map.remove(); // map = null; // } }); mapContainer.find('.reset').on('click',function(){ console.log(options.location); if (options.location) { $(options.location).val(originalLocation) } if (options.locationLatitude) { $(options.locationLatitude).val(originalLocationLatitude) } if (options.locationLongitude) { $(options.locationLongitude).val(originalLocationLongitude) } if(oldMarker){ oldMarker.removeFrom(map); } if($(options.locationLatitude).val() && $(options.locationLongitude).val()){ var lat = $(options.locationLatitude).val(); var lng = $(options.locationLongitude).val(); oldMarker = L.marker([lat, lng]); oldMarker.addTo(map); map.flyTo([lat, lng], options.defaultZoom); } }) // 初始状态下隐藏取消按钮 mapContainer.find('.if-open').hide(); var searchLoading = false; var page = 1; function search(isInit) { if (isInit) { page = 1; } var keywords = mapContainer.find('.location-input').val(); if (keywords.length == 0) { mapContainer.find('.search-body').hide(); return; } var provinceName = mapContainer.find('.province-name .main').text(); var cityName = mapContainer.find('.city-name .main').text(); provinceCode = mapContainer.find('.province-name').data('code'); cityCode = mapContainer.find('.city-name').data('code'); if (searchLoading) { return; } searchLoading = true; // 更新上一页按钮状态 - 第一页时禁用上一页按钮 mapContainer.find('.search-result-option .item[data-option="prev"]').toggleClass('disabled', page <= 1); var searchParams = { keyWord: keywords, mapBound: '-180,-90,180,90', level: 8, queryType: '1', start: (page - 1) * 10, count: 10, show: 2, }; // 按照区域搜索 if (provinceName) { delete searchParams.mapBound searchParams.queryType = 12 searchParams.specify = provinceCode; } if (cityName) { delete searchParams.mapBound searchParams.queryType = 12 searchParams.specify = cityCode; } // 按照拼接关键字搜索 // if (cityName) { // searchParams.keyWord = cityName + searchParams.keyWord; // } // if (provinceName) { // searchParams.keyWord = provinceName + searchParams.keyWord; // } $.get('//api.tianditu.gov.cn/v2/search', { postStr: JSON.stringify(searchParams), type: 'query', tk: options.key }, function (resSearch) { searchLoading = false; page++; // 清空搜索结果容器 var $searchResult = mapContainer.find('.search-result'); $searchResult.empty(); // 检查是否有搜索结果 if (resSearch && resSearch.pois && resSearch.pois.length > 0) { // 遍历搜索结果并添加到容器中 $.each(resSearch.pois, function (index, poi) { var lonlatArr = poi.lonlat.split(','); var resultItem = $(`
${poi.name}
${poi.address}
${poi.typeName || ''} ${poi.province} ${poi.city} ${poi.county}
`); $searchResult.append(resultItem); }); // 显示搜索结果区域 $searchResult.show(); mapContainer.find('.search-statistics').hide(); // 更新下一页按钮状态 mapContainer.find('.search-result-option .item[data-option="next"]').toggleClass('disabled', resSearch.pois.length < 10); } else { // 没有搜索结果时显示提示 $searchResult.html('
没有找到相关地点
'); $searchResult.show(); // 禁用下一页按钮 mapContainer.find('.search-result-option .item[data-option="next"]').addClass('disabled'); } // 更新统计数据 if (resSearch && resSearch.statistics && resSearch.statistics.allAdmins) { var $statisticsList = mapContainer.find('.search-statistics .list'); $statisticsList.empty(); $.each(resSearch.statistics.allAdmins, function (index, admin) { var isleaf = admin.isleaf ? '1' : '0'; $statisticsList.append(`
${admin.adminName} ${admin.count}个
`); }); // 如果没有搜索结果但有推荐地区,显示统计区域 if (!resSearch.pois || resSearch.pois.length === 0) { mapContainer.find('.search-statistics').show(); } }else{ mapContainer.find('.search-statistics').hide(); } mapContainer.find('.search-body').show(); }); } mapContainer.find('.location-input').on('input', function (e) { search(true); }); mapContainer.find('.on-search').on('click', function (e) { search(true); }); mapContainer.find('.option-body').on('click', function (e) { mapContainer.find('.search-body').hide(); }); mapContainer.on('click', '.search-statistics .item', function () { if ($(this).data('isleaf') == '1') { mapContainer.find('.city-name .main').text($(this).data('name')); mapContainer.find('.city-name').data('code', $(this).data('code')); mapContainer.find('.city-name').show(); } else { mapContainer.find('.province-name .main').text($(this).data('name')); mapContainer.find('.province-name').data('code', $(this).data('code')); mapContainer.find('.province-name').show(); } search(true); }); mapContainer.on('click', '.search-prefix-item .close', function () { $(this).prev().text(''); $(this).closest('.search-prefix-item').hide(); search(true); }); // 绑定搜索结果点击事件 mapContainer.on('click', '.result-item', function () { var lng = $(this).data('lng'); var lat = $(this).data('lat'); var latlng = L.latLng(lat, lng); // 移动地图到选中位置 map.flyTo(latlng, 16); // 添加标记 if (oldMarker) { oldMarker.removeFrom(map); } var marker = L.marker(latlng); marker.addTo(map); oldMarker = marker; // 更新表单值 var address = $(this).find('.address').text(); if (options.location) { $(options.location).val(address); } if (options.locationLatitude) { $(options.locationLatitude).val(lat); } if (options.locationLongitude) { $(options.locationLongitude).val(lng); } }); // 绑定分页按钮点击事件 mapContainer.on('click', '.search-result-option .item', function () { var option = $(this).data('option'); if (option === 'prev') { if (page > 2) { // 当前页码大于2才能上一页 page -= 2; // 因为search函数会自增page,所以这里减2 search(); } } else if (option === 'next') { // 如果当前结果数量等于10,说明可能有下一页 var resultCount = mapContainer.find('.search-result .result-item').length; if (resultCount === 10) { search(); } } }); return elem; }; window.mapLocation = new mapLocation(); })();