warehouseMap.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. <style lang='scss' scoped>
  2. .mapContent {
  3. position: relative;
  4. margin-top: 50px;
  5. .center-add {
  6. position: absolute;
  7. top: 0;
  8. bottom: 0;
  9. left: 0;
  10. right: 0;
  11. margin: auto;
  12. z-index: 999;
  13. width: 30px;
  14. height: 30px;
  15. }
  16. }
  17. #mapContainer {
  18. width: 100%;
  19. height: 330px;
  20. }
  21. #tip {
  22. position: absolute;
  23. top: -45px;
  24. display: flex;
  25. }
  26. #tip .el-input {
  27. // width: 179px;
  28. margin-right: 0px;
  29. }
  30. #tip .el-select {
  31. margin-right: 10px;
  32. }
  33. #tip .el-select {
  34. width: 179px;
  35. }
  36. #tip .el-textarea {
  37. width: 179px;
  38. /deep/ .el-textarea__inner {
  39. height: 40px;
  40. resize: none;
  41. }
  42. }
  43. .el-button--primary {
  44. background-color: #5878e8;
  45. border-color: #5878e8;
  46. }
  47. .el-button--default {
  48. color: #5878e8;
  49. border-color: #5473e8;
  50. }
  51. .address {
  52. display: flex;
  53. align-items: center;
  54. margin-right: 20px;
  55. // position:absolute;
  56. // top: -35px;
  57. .address-input {
  58. display: inline-block;
  59. width: 480px;
  60. }
  61. }
  62. </style>
  63. <template>
  64. <div class="mapContent">
  65. <img class='center-add' src="../../../public/img/zuobiao.gif" alt="" />
  66. <div id="mapContainer"></div>
  67. <div id="tip" v-show="showFlag === false ? false : true">
  68. <!-- <el-select v-model="province" @change="selectP" placeholder="省">
  69. <el-option
  70. v-for="item in provinces"
  71. :key="item.adcode"
  72. :label="item.name"
  73. :value="item.adcode"
  74. >
  75. </el-option>
  76. </el-select>
  77. <el-select v-model="city" @change="selectC" placeholder="市">
  78. <el-option
  79. v-for="item in citys"
  80. :key="item.adcode"
  81. :label="item.name"
  82. :value="item.name"
  83. >
  84. </el-option>
  85. </el-select>
  86. <el-select v-model="district" @change="selectD" placeholder="区">
  87. <el-option
  88. v-for="item in districts"
  89. :key="item.adcode"
  90. :label="item.name"
  91. :value="item.adcode"
  92. >
  93. </el-option>
  94. </el-select> -->
  95. <div class="address">
  96. <el-input type="text" id="searchValue" placeholder="请输入关键字:" v-model="address" clearable class="address-input">
  97. </el-input>
  98. </div>
  99. <el-button>经纬度:{{center}}</el-button>
  100. <el-button @click="positions" type="primary" v-if='!isShowaddress'>确定定位</el-button>
  101. <el-button @click="anewselect" v-if='!isShowaddress'>重新选择</el-button>
  102. <el-button @click="submit" v-if='isShowaddress && !warehousePositioning'>确定</el-button>
  103. </div>
  104. </div>
  105. </template>
  106. <script>
  107. import {
  108. regionData,
  109. CodeToText,
  110. TextToCode
  111. } from 'element-china-area-data'
  112. import image from '../../../public/img/ic_locationmarker.jpg'
  113. import AMapLoader from '@amap/amap-jsapi-loader';
  114. export default {
  115. data() {
  116. return {
  117. map: null,
  118. provinces: [],
  119. province: '',
  120. districts: [],
  121. district: '',
  122. citys: [],
  123. city: '',
  124. polygons: [],
  125. selectedOptions1: [],
  126. areacode: '',
  127. address: '',
  128. objPoint: [],
  129. markers: [],
  130. zoomEnable: true,
  131. dragEnable: true,
  132. status: true,
  133. center: '',
  134. }
  135. },
  136. props: ['flagVisible', 'position', 'selectedOptions', 'isShowaddress', 'type','warehousePositioning'],
  137. computed: {
  138. showFlag() {
  139. return this.flagVisible
  140. },
  141. },
  142. watch: {
  143. selectedOptions: {
  144. handler(newValue, oldValue) {
  145. this.province = CodeToText[newValue[0]]
  146. this.selectP(this.province)
  147. this.city = CodeToText[newValue[1]]
  148. this.selectC(CodeToText[newValue[1]])
  149. this.district = newValue[2]
  150. this.selectD(this.district)
  151. },
  152. deep: true
  153. }
  154. },
  155. async created() {
  156. },
  157. mounted() {
  158. // AMapLoader.reset();
  159. // 已载入高德地图API,则直接初始化地图
  160. if (window.AMap && window.AMapUI) {
  161. // 未载入高德地图API,则先载入API再初始化
  162. } else {
  163. // await remoteLoad(`http://webapi.amap.com/maps?v=1.3&key=${MapKey}&plugin=AMap.AutoComplete`)
  164. // await remoteLoad('http://webapi.amap.com/ui/1.0/main.js')
  165. // AMapLoader.reset();
  166. AMapLoader.load({
  167. "key": "211dd6f989e719022aaf47ddb0659c47", // 申请好的Web端开发者Key,首次调用 load 时必填
  168. "version": "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
  169. "plugins": ['plugin=AMap.Scale', 'AMap.ToolBar','AMap.AutoComplete', 'AMap.PlaceSearch', 'AMap.Geocoder', 'AMap.DistrictSearch','AMap.Geolocation', 'Geolocation'],
  170. "Loca": { // 是否加载 Loca, 缺省不加载
  171. "version": '2.0.0' // Loca 版本,缺省 1.3.2
  172. },
  173. }).then((AMap) => {
  174. setTimeout(() => {
  175. var that = this
  176. this.map = new AMap.Map('mapContainer', {
  177. resizeEnable: true,
  178. zoom: 10,
  179. zoomEnable: this.zoomEnable,
  180. dragEnable: this.dragEnable,
  181. })
  182. this.map.on('click', function(e) {
  183. if (this.status) {
  184. var marker = new AMap.Marker({
  185. position: new AMap.LngLat(e.lnglat.getLng(), e.lnglat
  186. .getLat()), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
  187. })
  188. that.map.remove(that.markers)
  189. that.$emit('marker', e)
  190. that.markers.push(marker)
  191. // 将创建的点标记添加到已有的地图实例:
  192. that.map.add(marker)
  193. }
  194. })
  195. if(this.warehousePositioning.lat && this.warehousePositioning.lng){
  196. this.map.setCenter([this.warehousePositioning.lat,this.warehousePositioning.lng])
  197. }
  198. this.marker = new AMap.Marker({
  199. icon: new AMap.Icon({
  200. size: new AMap.Size(0, 0),
  201. image: image,
  202. }),
  203. map: that.map,
  204. })
  205. AMap.plugin(
  206. ['AMap.AutoComplete', 'AMap.PlaceSearch', 'AMap.Geocoder', 'AMap.DistrictSearch'],
  207. function() {
  208. var autocomplete = new AMap.AutoComplete({
  209. input: 'searchValue',
  210. })
  211. var placeSearch = new AMap.PlaceSearch({
  212. city: that.acode,
  213. citylimit: true,
  214. pageSize: 1,
  215. pageIndex: 1,
  216. map: that.map,
  217. })
  218. var districtSearch = new AMap.DistrictSearch({
  219. subdistrict: 1,
  220. level: 'city',
  221. showbiz: false,
  222. });
  223. autocomplete.on( 'select', function(e) {
  224. that.marker.setMap(that.map)
  225. if (e.poi.location) {
  226. placeSearch.search() // 关键字查询查询
  227. that.marker.setPosition(e.poi.location)
  228. geocoder.getAddress(e.poi.location, function(status, result) {
  229. console.log(e.poi.location, "klokolkjolk")
  230. if (status === 'complete') {
  231. var obj = {}
  232. that.province = result.regeocode.addressComponent.province
  233. that.city = result.regeocode.addressComponent.city
  234. that.district = result.regeocode.addressComponent.district
  235. obj.formattedAddress = result.regeocode.formattedAddress
  236. obj.areacode = result.regeocode.addressComponent.adcode
  237. that.address = result.regeocode.formattedAddress
  238. obj.lat = e.poi.location.lat
  239. obj.lng = e.poi.location.lng
  240. that.$emit('searchAddress', obj)
  241. } else {
  242. that.$emit('searchAddress', '')
  243. }
  244. that.map.setFitView()
  245. })
  246. } else {
  247. districtSearch.search(e.poi.name, (status, result1) => {
  248. if (status == 'complete') {
  249. that.marker.setPosition(result1.districtList[0].center)
  250. geocoder.getAddress(result1.districtList[0].center, function(status, result) {
  251. if (status === 'complete') {
  252. var obj = {}
  253. that.province = result.regeocode.addressComponent.province
  254. that.city = result.regeocode.addressComponent.city
  255. that.district = result.regeocode.addressComponent.district
  256. obj.formattedAddress = result.regeocode.formattedAddress
  257. obj.areacode = result.regeocode.addressComponent.adcode
  258. that.address = result.regeocode.formattedAddress
  259. obj.lat = result1.districtList[0].center.lat
  260. obj.lng = result1.districtList[0].center.lng
  261. that.$emit('searchAddress', obj)
  262. } else {
  263. that.$emit('searchAddress', '')
  264. }
  265. that.map.setFitView()
  266. })
  267. }
  268. })
  269. }
  270. })
  271. // 经纬度
  272. var geocoder = new AMap.Geocoder({
  273. radius: 1000,
  274. })
  275. that.map.on('moveend', function(e) {
  276. //地图变动之后需要重新赋值省市区,未完成
  277. that.center = that.map.getCenter(); //获取当前地图中心位置
  278. console.log(that.center)
  279. that.center.lat = Number(that.center.lat.toFixed(3))
  280. that.center.lng = Number(that.center.lng.toFixed(3))
  281. for (var i = 0, l = that.polygons.length; i < l; i++) {
  282. that.polygons[i].setMap(null)
  283. }
  284. that.marker.setMap(that.map)
  285. that.marker.setPosition(that.center)
  286. geocoder.getAddress(that.center, function(status, result) {
  287. if (status === 'complete') {
  288. var obj = {}
  289. that.province = result.regeocode.addressComponent.province
  290. that.city = result.regeocode.addressComponent.city
  291. that.district = result.regeocode.addressComponent.district
  292. obj.formattedAddress = result.regeocode.formattedAddress
  293. obj.areacode = result.regeocode.addressComponent.adcode
  294. that.address = result.regeocode.formattedAddress
  295. obj.lat = that.center.lat
  296. obj.lng = that.center.lng
  297. that.$emit('pickedAddress', obj)
  298. } else {
  299. that.$emit('pickedAddress', '')
  300. }
  301. })
  302. });
  303. that.map.on('zoomend', function() {
  304. //地图变动之后需要重新赋值省市区,未完成
  305. // this.zoom = map.getZoom(); //获取当前地图级别
  306. that.center = that.map.getCenter(); //获取当前地图中心位置
  307. console.log(that.center)
  308. that.center.lat = Number(that.center.lat.toFixed(3))
  309. that.center.lng = Number(that.center.lng.toFixed(3))
  310. for (var i = 0, l = that.polygons.length; i < l; i++) {
  311. that.polygons[i].setMap(null)
  312. }
  313. that.marker.setMap(that.map)
  314. that.marker.setPosition(that.center)
  315. geocoder.getAddress(that.center, function(status, result) {
  316. if (status === 'complete') {
  317. var obj = {}
  318. that.province = result.regeocode.addressComponent.province
  319. that.city = result.regeocode.addressComponent.city
  320. that.district = result.regeocode.addressComponent.district
  321. obj.formattedAddress = result.regeocode.formattedAddress
  322. obj.areacode = result.regeocode.addressComponent.adcode
  323. that.address = result.regeocode.formattedAddress
  324. obj.lat = that.center.lat
  325. obj.lng = that.center.lng
  326. that.$emit('pickedAddress', obj)
  327. } else {
  328. that.$emit('pickedAddress', '')
  329. }
  330. })
  331. });
  332. // 根据坐标点定位,获取地址的详细信息
  333. if (that.position) {
  334. that.marker.setMap(that.map)
  335. that.marker.setPosition(that.position)
  336. geocoder.getAddress(that.position, function(status, result) {
  337. if (status === 'complete') {
  338. var obj = {}
  339. obj.formattedAddress = result.regeocode.formattedAddress
  340. obj.areacode = result.regeocode.addressComponent.adcode
  341. that.address = result.regeocode.formattedAddress
  342. that.$emit('positionAddress', obj)
  343. that.province = result.regeocode.addressComponent.province
  344. that.city = result.regeocode.addressComponent.city
  345. that.district = result.regeocode.addressComponent.district
  346. }
  347. })
  348. that.map.setFitView()
  349. } else {
  350. return false
  351. }
  352. }
  353. )
  354. }, 500)
  355. this.loadmap()
  356. // this.loadmap()
  357. }).catch(e => {
  358. console.log(e);
  359. })
  360. }
  361. },
  362. methods: {
  363. clearVal () {
  364. this.address = ''
  365. this.center=''
  366. var status = {
  367. zoomEnable: true,
  368. dragEnable: true,
  369. }
  370. this.map.setStatus(status)
  371. this.loadmap()
  372. },
  373. positions() {
  374. this.status = false
  375. var status = {
  376. zoomEnable: false,
  377. dragEnable: false,
  378. }
  379. this.map.setStatus(status)
  380. this.loadmap()
  381. let _data = []
  382. _data.push(this.province)
  383. _data.push(this.city)
  384. _data.push(this.district)
  385. _data.push(this.address)
  386. _data.push(this.type)
  387. this.$emit('addressListen', _data)
  388. },
  389. anewselect() {
  390. this.status = true
  391. var status = {
  392. zoomEnable: true,
  393. dragEnable: true,
  394. }
  395. this.map.setStatus(status)
  396. this.loadmap()
  397. },
  398. loadmap(val) {
  399. let params = val
  400. var that = this // 插件
  401. for (var j = 0, k = that.polygons.length; j < k; j++) {
  402. that.polygons[j].setMap(null)
  403. }
  404. AMap.plugin(['AMap.DistrictSearch', 'AMap.Polygon'], function() {
  405. // 标注
  406. var opts = {
  407. subdistrict: 1,
  408. extensions: 'all',
  409. showbiz: false,
  410. }
  411. var district = new AMap.DistrictSearch(opts) // 注意:需要使用插件同步下发功能才能这样直接使用
  412. function getData(data) {
  413. console.log(data)
  414. that.$emit('selectedAddress', data)
  415. // 清除地图上的所有覆盖物
  416. that.areacode = data.citycode
  417. var bounds = data.boundaries
  418. if (data.level === 'country') {
  419. that.provinces = data.districtList
  420. that.citys = []
  421. that.districts = []
  422. } else if (data.level === 'province') {
  423. that.map.remove(that.marker)
  424. that.citys = data.districtList
  425. that.districts = []
  426. that.address = ''
  427. } else if (data.level === 'city') {
  428. that.districts = data.districtList
  429. }
  430. if (data.level === 'country' && bounds) {
  431. return false
  432. } else {
  433. for (var i = 0, l = bounds.length; i < l; i++) {
  434. var polygon = new AMap.Polygon({
  435. map: that.map,
  436. strokeWeight: 1,
  437. strokeColor: '#CC66CC',
  438. fillColor: '#CCF3FF',
  439. fillOpacity: 0.5,
  440. path: bounds[i],
  441. })
  442. that.polygons.push(polygon)
  443. }
  444. that.map.setFitView()
  445. }
  446. }
  447. let sear = val ? params : '中国'
  448. district.search(sear, function(status, result) {
  449. if (status === 'complete') {
  450. getData(result.districtList[0])
  451. }
  452. })
  453. })
  454. },
  455. selectP(val) {
  456. this.province = CodeToText[val]
  457. if (this.status) {
  458. this.$emit('provinceChange', val)
  459. this.loadmap(val)
  460. this.city = ''
  461. this.district = ''
  462. }
  463. },
  464. selectC(val) {
  465. console.log(val)
  466. if (this.status) {
  467. this.loadmap(val)
  468. this.district = ''
  469. }
  470. },
  471. selectD(val) {
  472. this.district = CodeToText[val]
  473. if (this.status) {
  474. this.loadmap(val)
  475. }
  476. },
  477. submit() {
  478. let _data = []
  479. _data.push(this.province)
  480. _data.push(this.city)
  481. _data.push(this.district)
  482. _data.push(this.address)
  483. _data.push(this.type)
  484. _data.push(this.center)
  485. this.$emit('addressListen', _data)
  486. this.$parent.blurMap()
  487. console.log("submit")
  488. }
  489. },
  490. }
  491. </script>