customerPositionBmap.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <template>
  2. <div>
  3. <div class="app-container" style="padding-left: 20px;width: 100%;height: 60px;">
  4. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
  5. <el-form-item label="地址:" prop="address">
  6. <el-autocomplete
  7. class="inline-input"
  8. v-model="address"
  9. :fetch-suggestions="querySearch"
  10. placeholder="请输入内容"
  11. :trigger-on-focus="false"
  12. @select="handleSelect"
  13. ></el-autocomplete>
  14. </el-form-item>
  15. <el-form-item label="距离:" prop="distance">
  16. <el-select v-model="queryParams.distance" clearable>
  17. <el-option
  18. v-for="item in distanceOptions"
  19. :key="item.value"
  20. :label="item.label"
  21. :value="item.value"
  22. />
  23. </el-select>
  24. </el-form-item>
  25. </el-form>
  26. </div>
  27. <div id="container" v-bind:style="'width: 100%;border: 1px solid #cecece;height:'+pageHeight*0.797+'px;'">
  28. </div>
  29. </div>
  30. </template>
  31. <script>
  32. import request from '@/utils/request'
  33. export default {
  34. data() {
  35. return {
  36. address:"",
  37. queryParams: {
  38. address: {},
  39. distance: "50"
  40. },
  41. placeInfo: [
  42. {value: "", label: ""}
  43. ],
  44. distanceOptions: [
  45. {value: "50", label: "50米"},
  46. {value: "100", label: "100米"},
  47. {value: "200", label: "200米"}
  48. ],
  49. map: null,
  50. pageHeight:document.documentElement.clientHeight
  51. }
  52. },
  53. created() {
  54. setTimeout(()=>{
  55. this.initMap()
  56. },100)
  57. },
  58. methods: {
  59. addMarker(points) {
  60. //循环建立标注点
  61. var len = points.length;
  62. for (var i = 0, pointsLen = points.length; i < pointsLen; i++) {
  63. var point = points[i];
  64. this.addMarkerPoint(point);
  65. }
  66. },
  67. addTargetMarkerPoint(pointInfo, distance) {
  68. console.log('pointInfo', pointInfo)
  69. let pt = new BMap.Point(pointInfo.longitude, pointInfo.latitude);
  70. let icon=new BMap.Icon(require("@/assets/images/area_icon16x16.png") ,new BMap.Size(16, 16));
  71. let options = {
  72. icon:icon
  73. }
  74. var marker = new BMap.Marker(pt,options)
  75. var circle = new BMap.Circle(pt, distance, {
  76. strokeColor: 'blue',
  77. strokeWeight: 2,
  78. strokeOpacity: 0.5
  79. });
  80. var content =
  81. '<ul class="map-customer-info">'
  82. + '<li ><span>名称:</span>' + pointInfo.value + '</li>'
  83. + '<li ><span>地址:</span>' + pointInfo.address + '</li>'
  84. + '</ul>';
  85. marker.addEventListener("mouseover", () => {
  86. var infoWindow = new BMap.InfoWindow(content);
  87. marker.openInfoWindow(infoWindow);
  88. });
  89. marker.addEventListener("mouseout", () => {
  90. marker.closeInfoWindow();
  91. });
  92. this.map.addOverlay(marker)
  93. this.map.addOverlay(circle)
  94. this.map.setZoom(20);
  95. // 移动到目标点
  96. this.map.setCenter(pt)
  97. },
  98. addMarkerPoint(pointInfo) {
  99. let pt = new BMap.Point(pointInfo.longitude, pointInfo.latitude);
  100. var marker = new BMap.Marker(pt)
  101. this.showInfo(marker, pointInfo)
  102. this.map.addOverlay(marker)
  103. },
  104. showInfo(thisMarker, point) {
  105. if (!point.clientCode) {
  106. console.log('未取到值 ...')
  107. return;
  108. }
  109. let pt = new BMap.Point(point.longitude, point.latitude);
  110. //获取点的信息
  111. var content =
  112. '<ul class="map-customer-info">'
  113. + '<li ><span>许可证号:</span>' + point.clientCode + '</li>'
  114. + '<li ><span>名称:</span>' + point.shortName + '</li>'
  115. + '<li ><span>店名:</span>' + point.clientName + '</li>'
  116. + '<li ><span>电话:</span>' + point.telphonea + '</li>'
  117. + '<li ><span>地址:</span>' + point.address + '</li>'
  118. + '<li ><span>客户经理:</span>' + point.cnname + '</li>'
  119. + '<li ><span>距离:</span>' + this.showDist(parseFloat(point.distance)) + '</li>'
  120. + '</ul>';
  121. thisMarker.addEventListener("mouseover", () => {
  122. var infoWindow = new BMap.InfoWindow(content);
  123. thisMarker.openInfoWindow(infoWindow);
  124. });
  125. thisMarker.addEventListener("mouseout", () => {
  126. thisMarker.closeInfoWindow();
  127. });
  128. },
  129. showDist(d) {
  130. return d ? d.toFixed(2) * 1000 + 'M' : '未知';
  131. },
  132. initMap() {
  133. var longitude = 113.450713
  134. var latitude = 30.366039
  135. let pt = new BMap.Point(longitude, latitude);
  136. var marker = new BMap.Marker(pt)
  137. // 鼠标经过窗口模板
  138. let tem = `<ul class="map-customer-info">
  139. <li>仙桃市烟草专卖局</li>
  140. </ul>`;
  141. marker.addEventListener("mouseover", () => {
  142. var infoWindow = new BMap.InfoWindow(tem);
  143. marker.openInfoWindow(infoWindow);
  144. });
  145. marker.addEventListener("mouseout", () => {
  146. marker.closeInfoWindow();
  147. });
  148. this.map = new BMap.Map("container", {enableMapClick: false}); // 创建Map实例 命名空间为BMAP
  149. this.map.centerAndZoom(new BMap.Point(113.465771, 30.368834), 13); // 初始化地图,设置中心点坐标和地图级别
  150. this.map.setCurrentCity("仙桃");
  151. this.map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
  152. this.map.disableDoubleClickZoom(); //禁用双击放大
  153. this.map.addOverlay(marker);
  154. },
  155. querySearch(queryString, cb) {
  156. request({
  157. url: '/api/map/search?key='+queryString,
  158. method: 'get'
  159. }).then(function (res) {
  160. cb(res);
  161. })
  162. },
  163. handleSelect(item){
  164. if (item) {
  165. const t=this;
  166. this.map.clearOverlays();
  167. this.addTargetMarkerPoint(item,this.queryParams.distance);
  168. // 查询周围选定距离distance 以内的零售户
  169. request({
  170. url: "/api/map/customer/search",
  171. method: 'post',
  172. data: {latitude: item.latitude, longitude: item.longitude, count: 10, distance: this.queryParams.distance/1000}
  173. }).then(function (rs) {
  174. if (rs && rs.length) {
  175. t.addMarker(rs);
  176. } else {
  177. t.$modal.msgError("未找到附近零售户");
  178. }
  179. })
  180. }
  181. }
  182. }
  183. };
  184. </script>
  185. <style rel="stylesheet/scss" lang="scss">
  186. .BMap_cpyCtrl {
  187. display: none;
  188. }
  189. .anchorBL {
  190. display: none;
  191. }
  192. </style>