当前位置:   article > 正文

高德离线地图vue-amap的api文档(2):创建地图,撒点等等_高德地图 离线地图api

高德地图 离线地图api

前言:

       高德离线地图的使用场景还是很多的,但是他的api在国外,想参考api对网络差的朋友来说不是一件容易的事,对我来说一样,在这里整理下他的api内容。

注:本文是将官网api挪动出来,网好的童鞋想看原版的请点击官网入口

目录:

十七、搜索框

实现效果:

API

onSearchResult

事件

十八、插件

引入方式

1 - 全局引入地图插件

2 - 配置插件

配置说明

十九、MapType 地图类型切换插件,用来切换固定的几个常用图层

实现效果:

属性

事件

二十、Overview 地图鹰眼插件。

实现效果:

属性

事件

二十一、Scale 比例尺插件。位于地图右下角,用户可控制其显示与隐藏。

二十二、ToolBar 地图工具条插件,可以用来控制地图的缩放和平移。

实现效果:

属性

事件

二十三、Geolocation

实现效果:

二十四、自定义组件

1、案例1

实现效果:

2、案例2

实现效果:

3、案例3

实现效果:

二十五、地图实例  点击地图获取经纬度和具体地址

实现效果:

二十六、点坐标 - 聚合

实现效果:

二十七、点坐标 - 自定义内容

1、基础 content 渲染

实现效果:

2、template 模板渲染

实现效果:

3、render 方式渲染  v0.4.3 开始支持。

实现效果:

4、slots 渲染 v0.4.5 开始支持。

实现效果:

二十八、信息窗体 - 切换

实现效果:

二十九、点坐标 - 自定义内容

1、基础 content 渲染

实现效果:

2、template 模板渲染

实现效果:

3、render 方式渲染 v0.4.3 开始支持。

实现效果:

4、slots 渲染 v0.4.5 开始支持。

实现效果:

 


官网入口

 

十七、搜索框

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap-search-box class="search-box" :search-option="searchOption" :on-search-result="onSearchResult"></el-amap-search-box>
  4. <el-amap vid="amapDemo" :center="mapCenter" :zoom="12" class="amap-demo">
  5. <el-amap-marker v-for="marker in markers" :position="marker" ></el-amap-marker>
  6. </el-amap>
  7. </div>
  8. </template>
  9. <style>
  10. .amap-demo {
  11. height: 300px;
  12. }
  13. .search-box {
  14. position: absolute;
  15. top: 25px;
  16. left: 20px;
  17. }
  18. .amap-page-container {
  19. position: relative;
  20. }
  21. </style>
  22. <script>
  23. module.exports = {
  24. data: function() {
  25. return {
  26. markers: [
  27. [121.59996, 31.197646],
  28. [121.40018, 31.197622],
  29. [121.69991, 31.207649]
  30. ],
  31. searchOption: {
  32. city: '上海',
  33. citylimit: true
  34. },
  35. mapCenter: [121.59996, 31.197646]
  36. };
  37. },
  38. methods: {
  39. addMarker: function() {
  40. let lng = 121.5 + Math.round(Math.random() * 1000) / 10000;
  41. let lat = 31.197646 + Math.round(Math.random() * 500) / 10000;
  42. this.markers.push([lng, lat]);
  43. },
  44. onSearchResult(pois) {
  45. let latSum = 0;
  46. let lngSum = 0;
  47. if (pois.length > 0) {
  48. pois.forEach(poi => {
  49. let {lng, lat} = poi;
  50. lngSum += lng;
  51. latSum += lat;
  52. this.markers.push([poi.lng, poi.lat]);
  53. });
  54. let center = {
  55. lng: lngSum / pois.length,
  56. lat: latSum / pois.length
  57. };
  58. this.mapCenter = [center.lng, center.lat];
  59. }
  60. }
  61. }
  62. };
  63. </script>

实现效果:

API

参数说明类型
searchOption搜索条件Object
onSearchResult)搜索回调函数function[ {lng, lat} ]
default默认值String
## searchOption  
属性说明类型
----------
city城市名String
citylimit是否限制城市内搜索Boolean

onSearchResult

参数说明类型
pois经纬度对象数组Object

事件

事件名参数说明
initObject参数包含 { autoComplete, placeSearch} ,分别为自动补全以及地址搜索插件的高德实例

十八、插件

引入方式

1 - 全局引入地图插件

首先需要在项目初始化时,通过 initAMapApiLoader 引入所需要的插件。

使用插件之前一定要初始化,否则会报错!

  1. import VueAMap from 'vue-amap';
  2. VueAMap.initAMapApiLoader({
  3. key: 'YOUR_KEY',
  4. plugin: ['Autocomplete', 'PlaceSearch', 'Scale', 'OverView', 'ToolBar', 'MapType', 'PolyEditor', 'AMap.CircleEditor']
  5. });

2 - 配置插件

全局引入后,需要给单个地图组件配置插件:

  1. <template>
  2. <div>
  3. <el-amap vid="amapDemo" :plugin="plugins"></el-amap>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. plugins: ['MapType'];
  11. };
  12. };
  13. };
  14. </script>

配置说明

插件名支持两种,不带"AMap"前缀,如"MapType",带"AMap"前缀,如"AMap.MapType"。推荐前者,以下都基于前者说明。 (v0.1.2之前版本,只支持后者)

插件的配置支持两种方式。

1 - 默认配置

只配置插件名,配置则用默认

  1. {
  2. plugin: ['MapType']
  3. }

2 - 自定义配置

(v0.1.2开始支持)

自定义配置对象,pName为插件名。所有属性仅支持初始化配置,不支持响应式。

  1. {
  2. plugin: [{
  3. // pName为必填字段
  4. pName: 'MapType',
  5. defaultType: 1
  6. }]
  7. }

十九、MapType 地图类型切换插件,用来切换固定的几个常用图层

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap vid="amap" :plugin="plugin" class="amap-demo">
  4. </el-amap>
  5. </div>
  6. </template>
  7. <style>
  8. .amap-demo {
  9. height: 300px;
  10. }
  11. </style>
  12. <script>
  13. module.exports = {
  14. data() {
  15. return {
  16. plugin: [{
  17. pName: 'MapType',
  18. defaultType: 0,
  19. events: {
  20. init(instance) {
  21. console.log(instance);
  22. }
  23. }
  24. }]
  25. };
  26. }
  27. };
  28. </script>

实现效果:

属性

名称类型说明
defaultTypeNumber初始化默认图层类型。 取值为0:默认底图 取值为1:卫星图 默认值:0
showTrafficBoolean叠加实时交通图层 默认值:false
showRoadBoolean叠加路网图层 默认值:false

事件

事件参数说明
initObject高德插件示例

二十、Overview 地图鹰眼插件。

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap vid="amap" :plugin="plugin" class="amap-demo">
  4. </el-amap>
  5. </div>
  6. </template>
  7. <style>
  8. .amap-demo {
  9. height: 300px;
  10. }
  11. </style>
  12. <script>
  13. module.exports = {
  14. data() {
  15. return {
  16. plugin: [{
  17. pName: 'OverView',
  18. events: {
  19. init(instance) {
  20. console.log(instance);
  21. }
  22. }
  23. }]
  24. };
  25. }
  26. };
  27. </script>

实现效果:

属性

名称类型说明
isOpenBoolean鹰眼是否展开,默认为false
visibleBoolean鹰眼是否显示,默认为true

事件

事件参数说明
initObject高德插件示例

二十一、Scale 比例尺插件。位于地图右下角,用户可控制其显示与隐藏。

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap vid="amap" :plugin="plugin" class="amap-demo">
  4. </el-amap>
  5. </div>
  6. </template>
  7. <style>
  8. .amap-demo {
  9. height: 300px;
  10. }
  11. </style>
  12. <script>
  13. module.exports = {
  14. data() {
  15. return {
  16. plugin: [{
  17. pName: 'Scale',
  18. events: {
  19. init(instance) {
  20. console.log(instance);
  21. }
  22. }
  23. }]
  24. };
  25. }
  26. };
  27. </script>

二十二、ToolBar 地图工具条插件,可以用来控制地图的缩放和平移。

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap vid="amap" :plugin="plugin" class="amap-demo">
  4. </el-amap>
  5. </div>
  6. </template>
  7. <style>
  8. .amap-demo {
  9. height: 300px;
  10. }
  11. </style>
  12. <script>
  13. module.exports = {
  14. data() {
  15. return {
  16. plugin: [{
  17. pName: 'ToolBar',
  18. events: {
  19. init(instance) {
  20. console.log(instance);
  21. }
  22. }
  23. }]
  24. };
  25. }
  26. };
  27. </script>

实现效果:

属性

名称类型说明
positionString控件停靠位置 LT:左上角; RT:右上角; LB:左下角; RB:右下角; 默认位置:LT
rulerBoolean标尺键盘是否可见,默认为true
noIpLocateBoolean定位失败后,是否开启IP定位,默认为false
locateBoolean是否显示定位按钮,默认为false
liteStyleBoolean是否使用精简模式,默认为false
directionBoolean方向键盘是否可见,默认为true
autoPositionBoolean是否自动定位,即地图初始化加载完成后,是否自动定位的用户所在地,仅在支持HTML5的浏览器中有效,默认为false
useNativeBoolean是否使用高德定位sdk用来辅助优化定位效果,默认:false.

仅供在使用了高德定位sdk的APP中,嵌入webview页面时使用注:如果要使用辅助定位的功能,除了需要将useNative属性设置为true以外,还需要调用高德定位sdk中,AMapLocationClient类的startAssistantLocation()方法开启辅助H5定位功能;不用时,可以调用stopAssistantLocation()方法停止辅助H5定位功能。具体用法可参考定位SDK的参考手册

事件

事件参数说明
initObject高德插件示例

二十三、Geolocation

Geolocation定位服务插件。融合了浏览器定位、高精度IP定位、安卓定位 sdk 辅助定位等多种手段,提供了获取当前准确位置、获取当前城市信息、持续定位(浏览器定位)等功能。用户可以通过两种当时获得定位的成败和结果,一种是在 getCurrentPosition 的时候传入回调函数来处理定位结果,一种是通过事件监听来取得定位结果。Geolocation 定位常见问题说明 注:默认情况下,PC端优先使用精确IP定位,解决多数浏览器无法完成定位的现状,IP定位失败后使用浏览器定位;手机端优先使用浏览器定位,失败后使用IP定位;对于安卓WebView页面的开发者,可以结合定位 sdk 进行辅助定位,详细说明见 useNative 参数。IP定位的精度值为 null

由于 Chrome 、IOS10 等已不再支持非安全域的浏览器定位请求,为保证定位成功率和精度,请尽快升级您的站点到 HTTPS 

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap vid="amap" :plugin="plugin" class="amap-demo" :center="center">
  4. </el-amap>
  5. <div class="toolbar">
  6. <span v-if="loaded">
  7. location: lng = {{ lng }} lat = {{ lat }}
  8. </span>
  9. <span v-else>正在定位</span>
  10. </div>
  11. </div>
  12. </template>
  13. <style>
  14. .amap-demo {
  15. height: 300px;
  16. }
  17. </style>
  18. <script>
  19. module.exports = {
  20. data() {
  21. let self = this;
  22. return {
  23. center: [121.59996, 31.197646],
  24. lng: 0,
  25. lat: 0,
  26. loaded: false,
  27. plugin: [{
  28. pName: 'Geolocation',
  29. events: {
  30. init(o) {
  31. // o 是高德地图定位插件实例
  32. o.getCurrentPosition((status, result) => {
  33. if (result && result.position) {
  34. self.lng = result.position.lng;
  35. self.lat = result.position.lat;
  36. self.center = [self.lng, self.lat];
  37. self.loaded = true;
  38. self.$nextTick();
  39. }
  40. });
  41. }
  42. }
  43. }]
  44. };
  45. }
  46. };
  47. </script>

实现效果:

二十四、自定义组件

实际开发中面对复杂业务,库中现有的几个基础组件很多时候无法满足我们的业务需求,另一个方面在于高德的sdk也在疯狂更新,一味的包装也不是长久之计,所以这里提供一个方法 -- createCustomComponent,让用户自己开发并维护自己特定业务组件,同时也希望通过社区成员一起建设公共组件。

1、案例1

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap vid="amapDemo" :zoom="zoom" :center="center" class="amap-demo">
  4. <amap-canvas-markers
  5. :data="markerData"
  6. :get-position="markerOptions.getPosition"
  7. :get-hover-title="markerOptions.getHoverTitle"
  8. :visible="markerOptions.visible"
  9. render-constructor="PointSimplifier.Render.Canvas"
  10. :render-options="markerOptions.renderOptions"
  11. :events="markerOptions.events"
  12. ></amap-canvas-markers>
  13. </el-amap>
  14. <div class="toolbar">
  15. <button type="button" name="button" @click="toggleVisible">toggle visible</button>
  16. </div>
  17. </div>
  18. </template>
  19. <style>
  20. .amap-demo {
  21. height: 300px;
  22. }
  23. </style>
  24. <script>
  25. // import {createCustomComponent} from 'vue-amap'
  26. const { createCustomComponent } = VueAMap;
  27. // 组件定义
  28. const AmapCanvasMarkers = createCustomComponent({
  29. name: 'amap-canvas-marker',
  30. props: [
  31. 'visible',
  32. 'zIndex',
  33. 'data',
  34. 'getPosition',
  35. 'getHoverTitle',
  36. 'compareDataItem',
  37. 'autoSetFitView',
  38. 'renderConstructor',
  39. 'renderOptions',
  40. 'maxChildrenOfQuadNode',
  41. 'maxDepthOfQuadTree',
  42. 'badBoundsAspectRatio'
  43. ],
  44. contextReady() {
  45. console.log('context ready', AMap);
  46. },
  47. init(options, map) {
  48. return new Promise((resolve, reject) => {
  49. AMapUI.loadUI(['misc/PointSimplifier'], PointSimplifier => {
  50. const {renderConstructor: renderStr, renderOptions } = options;
  51. // console.log(renderStr);
  52. if (renderStr) options.renderConstructor = renderStr.split('.').reduce((pre, cur) => pre[cur], {PointSimplifier});
  53. if (options.renderOptions && options.renderOptions.pointStyle) {
  54. const {pointStyle} = options.renderOptions;
  55. if (pointStyle.contentImg) pointStyle.content = PointSimplifier.Render.Canvas.getImageContent(pointStyle.contentImg, () => this.$amapComponent.renderLater()),
  56. e => console.error(e)
  57. }
  58. resolve(new PointSimplifier(options))
  59. });
  60. })
  61. },
  62. converters: {},
  63. handlers: {
  64. zIndex(index) {
  65. this.setzIndex(index);
  66. },
  67. visible(flag) {
  68. flag === false ? this.hide() : this.show();
  69. }
  70. }
  71. });
  72. const center = [121.5273285, 31.21515044];
  73. const markerData = Array.from({length: 10000},(x, index) => ({position: [
  74. center[0] + (Math.random() > 0.5 ? 1 : -1) * Math.random() * 0.6,
  75. center[1] + (Math.random() > 0.5 ? 1 : -1) * Math.random() * 0.6
  76. ], title: `小点坐标-${index}`}));
  77. module.exports = {
  78. components: {AmapCanvasMarkers},
  79. data() {
  80. return {
  81. zoom: 14,
  82. center,
  83. markerData,
  84. markerOptions: {
  85. visible: true,
  86. getPosition(dateItem) {
  87. return dateItem.position
  88. },
  89. getHoverTitle(dateItem) {
  90. return dateItem.title
  91. },
  92. renderOptions: {
  93. pointStyle: {
  94. contentImg: 'http://webapi.amap.com/theme/v1.3/markers/n/mark_b1.png',
  95. width: 19,
  96. height: 31,
  97. offset: ['-50%', '-100%'],
  98. fillStyle: null,
  99. strokeStyle: null
  100. }
  101. },
  102. events: {
  103. pointClick(e, point) {
  104. console.log('event pointClick', e, point)
  105. },
  106. pointMouseover(e, point) {
  107. console.log('event pointMouseover', e, point);
  108. },
  109. pointMouseout(e, point) {
  110. console.log('event pointMouseout', e, point)
  111. }
  112. }
  113. }
  114. }
  115. },
  116. methods: {
  117. toggleVisible() {
  118. this.markerOptions.visible = !this.markerOptions.visible;
  119. }
  120. }
  121. }
  122. </script>

实现效果:

2、案例2

  1. <style>
  2. .amap-demo {
  3. height: 300px;
  4. }
  5. .container {
  6. position: relative;
  7. }
  8. .tip {
  9. background-color: #ddf;
  10. color: #333;
  11. border: 1px solid silver;
  12. box-shadow: 3px 4px 3px 0px silver;
  13. position: absolute;
  14. top: 10px;
  15. right: 10px;
  16. border-radius: 5px;
  17. overflow: hidden;
  18. line-height: 20px;
  19. z-index: 99;
  20. }
  21. .tip input {
  22. height: 25px;
  23. border: 0;
  24. padding-left: 5px;
  25. width: 280px;
  26. border-radius: 3px;
  27. outline: none;
  28. }
  29. </style>
  30. <template>
  31. <div class="container">
  32. <div class="tip">
  33. <input class="custom-componet-input" id="custom-componet-input" />
  34. </div>
  35. <el-amap vid="xxx" :zoom="zoom" :center="center" class="amap-demo">
  36. <custom-map-searchbox @select="selectSearch" input="custom-componet-input" ></custom-map-searchbox>
  37. <el-amap-marker v-if="selectMarker" :position="selectMarker.position" :label="selectMarker.label"></el-amap-marker>
  38. </el-amap>
  39. </div>
  40. </template>
  41. <script>
  42. const customMapSearchbox = VueAMap.createCustomComponent({
  43. props: {
  44. input: String
  45. },
  46. init(options, map) {
  47. return new Promise(resolve => {
  48. AMap.plugin(['AMap.Autocomplete','AMap.PlaceSearch'], () => {
  49. const autocomplete = new AMap.Autocomplete(options)
  50. AMap.event.addListener(autocomplete, 'select', (e) => {
  51. this.$emit('select', e.poi)
  52. });
  53. resolve(autocomplete)
  54. })
  55. });
  56. }
  57. })
  58. module.exports = {
  59. data() {
  60. return {
  61. selectMarker: null,
  62. zoom: 14,
  63. center: [121.5273285, 31.21515044]
  64. }
  65. },
  66. components: {customMapSearchbox},
  67. methods: {
  68. selectSearch(poi) {
  69. console.log(poi)
  70. const {location, name, adcode, district, address, } = poi
  71. const center = [location.lng, location.lat];
  72. console.log(center)
  73. this.selectMarker = {
  74. label: {content: `<div>
  75. <div>${name}</div>
  76. <div>${district}</div>
  77. </div>`, offset: [20, 20]},
  78. position: [...center]
  79. },
  80. console.log(this.selectMarker);
  81. this.center = center;
  82. }
  83. }
  84. }
  85. </script>

实现效果:

3、案例3

  1. <style>
  2. .xxconatiner {
  3. position: relative;
  4. padding: 60px 10px
  5. }
  6. .tip {
  7. background-color: #ddf;
  8. color: #333;
  9. border: 1px solid silver;
  10. box-shadow: 3px 4px 3px 0px silver;
  11. display: inline-block;
  12. border-radius: 5px;
  13. overflow: hidden;
  14. line-height: 20px;
  15. z-index: 99;
  16. }
  17. .tip input {
  18. height: 25px;
  19. border: 0;
  20. padding-left: 5px;
  21. width: 280px;
  22. border-radius: 3px;
  23. outline: none;
  24. }
  25. </style>
  26. <template>
  27. <div class="xxconatiner">
  28. <custom-search @select="select">
  29. </custom-search>
  30. </div>
  31. </template>
  32. <script>
  33. const customSearch = VueAMap.createCustomComponent({
  34. template: `<div class="tip">
  35. <input class="custom-componet-input" :id="id" />
  36. </div>`,
  37. data() {
  38. return {
  39. id: `custom-componet-input-${Math.random()}`
  40. }
  41. },
  42. contextReady(_options) {
  43. const options = {
  44. ..._options,
  45. input: this.id
  46. }
  47. AMap.plugin(['AMap.Autocomplete','AMap.PlaceSearch'], () => {
  48. const autocomplete = new AMap.Autocomplete(options)
  49. AMap.event.addListener(autocomplete, 'select', (e) => {
  50. this.$emit('select', e.poi)
  51. })
  52. this.$amapComponent = autocomplete
  53. })
  54. }
  55. })
  56. module.exports = {
  57. components: {customSearch},
  58. methods: {
  59. select(poi) {
  60. console.log(poi)
  61. }
  62. }
  63. }
  64. </script>

实现效果:

  1. import {createCustomComponent} from 'vue-amap'
  2. const customComponent = createCustomComponent({
  3. name: 'custom-component-name',
  4. init() { // required
  5. ...
  6. return amapInstance // required
  7. // or
  8. return new Promise(resolve => {
  9. ...
  10. resolve(amapInstance)
  11. })
  12. ...
  13. },
  14. converters: {
  15. [propKey](propVal) {
  16. return customConvert(propVal)
  17. }
  18. },
  19. handlers: {
  20. [propKey]() {
  21. // callback
  22. }
  23. },
  24. contextReady() {},
  25. created() {},
  26. mounted() {},
  27. destoryed() {},
  28. // other hooks
  29. })
  30. Vue.use(customComponent) // registered as a component named [custom-component-name]

以上是一个简单的组件的例子,关键函数就是 createCustomComponent(VueComponentOptionsPlus),返回是一个完整的 VueComponentOptions, 入参除了具有基本的 VueComponentOptions 的相关属性外,还有以下的关键属性

名称类型说明
nameStringcomponent Name
initFunction(options, AMapInstance)该 hook 是父组件vue-amap中地图实例初始化后进行调用的, 所以依赖于父组件,该函数的作用是组件对应的高德实例进行初始化,关键步骤return componentInstance / resolve(componentInstance),返回个实例,异步初始化需要返回一个 Promise,将实例 resolve 出来;
contextReadyFucntion该 hook 在组件 mounted 中并且浏览器上下文完成高德脚本加载后执行,该 hook 内部可安全使用高德API,该 hook 依赖于内部的 lazyAMapApiLoaderInstance, 请务必保证在该组件 mounted 前完成初始化函数 initAMapApiLoader 调用。该 hook 并不依赖父组件,可独立存在,适用于一些简单无交互的工具组件
convertersObject: {[propKey]:Function}对于组件原始入参的转换函数,像一些坐标类型数据需要从原始数组转为 AMap.LngLat,本库内部内置了 position: toLngLat, offset: toPixel, bounds: toBounds 的转换
handlersObject: {[propKey]: Function}自定义组件属性值变化后对应的回调,内置的回调指定规则是 自定义 handler -> 高德实例 set[PropKey] 方法 -> setOptions 方法 从左到右的依次判空,如果存在则指定调用该回调,注:回调函数的默认 this 是该 高德实例

原理其实很简单,内部 watch 了所有提前申明的 prop,propValue 改变时执行对应回调,规则如上。自定义组件的实例上维护了有两个特殊的属性 $amap 高德地图实例(父组件为 vue-amap 才会初始化)和 $amapComponent高德组件实例;

关于 destoryed 内置了通用的回收方法,如果不满足请务必自行回收。

二十五、地图实例  点击地图获取经纬度和具体地址

如果需要坐标转地址服务,也就是下面用到的 Geocoder ,请注意在地图初始化的时候要记得引入:

  1. window.VueAMap.initAMapApiLoader({
  2. key: 'YOUR_CODE',
  3. plugin: [... 'Geocoder']
  4. });
  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap
  4. vid="amapDemo"
  5. :center="center"
  6. :zoom="zoom"
  7. class="amap-demo"
  8. :events="events">
  9. </el-amap>
  10. <div class="toolbar">
  11. position: [{{ lng }}, {{ lat }}] address: {{ address }}
  12. </div>
  13. </div>
  14. </template>
  15. <style>
  16. .amap-demo {
  17. height: 300px;
  18. }
  19. </style>
  20. <script>
  21. module.exports = {
  22. data: function() {
  23. let self = this;
  24. return {
  25. zoom: 12,
  26. center: [121.59996, 31.197646],
  27. address: '',
  28. events: {
  29. click(e) {
  30. let { lng, lat } = e.lnglat;
  31. self.lng = lng;
  32. self.lat = lat;
  33. // 这里通过高德 SDK 完成。
  34. var geocoder = new AMap.Geocoder({
  35. radius: 1000,
  36. extensions: "all"
  37. });
  38. geocoder.getAddress([lng ,lat], function(status, result) {
  39. if (status === 'complete' && result.info === 'OK') {
  40. if (result && result.regeocode) {
  41. self.address = result.regeocode.formattedAddress;
  42. self.$nextTick();
  43. }
  44. }
  45. });
  46. }
  47. },
  48. lng: 0,
  49. lat: 0
  50. };
  51. }
  52. };
  53. </script>

实现效果:

二十六、点坐标 - 聚合

引入插件

  1. import VueAMap from 'vue-amap';
  2. VueAMap.initAMapApiLoader({
  3. key: 'YOUR CODE',
  4. plugin: [..., 'MarkerClusterer']
  5. });
  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap
  4. vid="amapDemo"
  5. :center="center"
  6. :zoom="zoom"
  7. class="amap-demo"
  8. :events="events">
  9. <el-amap-marker v-for="marker in markers" :position="marker.position" :content="marker.content" :events="marker.events"></el-amap-marker>
  10. </el-amap>
  11. </div>
  12. </template>
  13. <style>
  14. .amap-demo {
  15. height: 300px;
  16. }
  17. </style>
  18. <script>
  19. module.exports = {
  20. data: function() {
  21. let self = this;
  22. return {
  23. zoom: 12,
  24. center: [121.59996, 31.197646],
  25. markers: [],
  26. markerRefs: [],
  27. events: {
  28. init(o) {
  29. setTimeout(() => {
  30. console.log(self.markerRefs);
  31. let cluster = new AMap.MarkerClusterer(o, self.markerRefs,{
  32. gridSize: 80,
  33. renderCluserMarker: self._renderCluserMarker
  34. });
  35. console.log(cluster);
  36. }, 1000);
  37. }
  38. }
  39. };
  40. },
  41. created() {
  42. let self = this;
  43. let markers = [];
  44. let index = 0;
  45. let basePosition = [121.59996, 31.197646];
  46. while (++index <= 30) {
  47. markers.push({
  48. position: [basePosition[0] + 0.01 * index, basePosition[1]],
  49. content: '<div style="text-align:center; background-color: hsla(180, 100%, 50%, 0.7); height: 24px; width: 24px; border: 1px solid hsl(180, 100%, 40%); border-radius: 12px; box-shadow: hsl(180, 100%, 50%) 0px 0px 1px;"></div>',
  50. events: {
  51. init(o) {
  52. self.markerRefs.push(o);
  53. }
  54. }
  55. });
  56. }
  57. this.markers = markers;
  58. },
  59. methods: {
  60. _renderCluserMarker(context) {
  61. const count = this.markers.length;
  62. let factor = Math.pow(context.count/count, 1/18)
  63. let div = document.createElement('div');
  64. let Hue = 180 - factor* 180;
  65. let bgColor = 'hsla('+Hue+',100%,50%,0.7)';
  66. let fontColor = 'hsla('+Hue+',100%,20%,1)';
  67. let borderColor = 'hsla('+Hue+',100%,40%,1)';
  68. let shadowColor = 'hsla('+Hue+',100%,50%,1)';
  69. div.style.backgroundColor = bgColor
  70. let size = Math.round(30 + Math.pow(context.count/count,1/5) * 20);
  71. div.style.width = div.style.height = size+'px';
  72. div.style.border = 'solid 1px '+ borderColor;
  73. div.style.borderRadius = size/2 + 'px';
  74. div.style.boxShadow = '0 0 1px '+ shadowColor;
  75. div.innerHTML = context.count;
  76. div.style.lineHeight = size+'px';
  77. div.style.color = fontColor;
  78. div.style.fontSize = '14px';
  79. div.style.textAlign = 'center';
  80. context.marker.setOffset(new AMap.Pixel(-size/2,-size/2));
  81. context.marker.setContent(div)
  82. }
  83. }
  84. };
  85. </script>

实现效果:

二十七、点坐标 - 自定义内容

1、基础 content 渲染

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap
  4. vid="amapDemo"
  5. :center="center"
  6. :zoom="zoom"
  7. class="amap-demo">
  8. <el-amap-marker v-for="(marker, index) in markers" :position="marker.position" :vid="index" :content="marker.content"></el-amap-marker>
  9. </el-amap>
  10. </div>
  11. </template>
  12. <style>
  13. .amap-demo {
  14. height: 300px;
  15. }
  16. </style>
  17. <script>
  18. module.exports = {
  19. data: function() {
  20. let self = this;
  21. const center = [121.59996, 31.197646];
  22. return {
  23. zoom: 12,
  24. center,
  25. markers: []
  26. };
  27. },
  28. created() {
  29. let self = this;
  30. let markers = [];
  31. let index = 0;
  32. let basePosition = [121.59996, 31.197646];
  33. let num = 10;
  34. for (let i = 0 ; i < num ; i++) {
  35. markers.push({
  36. position: [basePosition[0], basePosition[1] + i * 0.03],
  37. content: `content ${i}`
  38. });
  39. }
  40. this.markers = markers;
  41. }
  42. };
  43. </script>

实现效果:

2、template 模板渲染

支持传入 Vue 模板,支持 Vue 机制的事件绑定和状态访问。当同时设置 content 和 template 时,优先 contentv0.4.0 开始支持。

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap
  4. vid="amapDemo1"
  5. :center="center"
  6. :zoom="zoom"
  7. class="amap-demo">
  8. <el-amap-marker v-for="marker in markers" :position="marker.position" :template="marker.template"></el-amap-marker>
  9. </el-amap>
  10. </div>
  11. </template>
  12. <style>
  13. .amap-demo {
  14. height: 300px;
  15. }
  16. </style>
  17. <script>
  18. module.exports = {
  19. data: function() {
  20. let self = this;
  21. return {
  22. zoom: 12,
  23. center: [121.59996, 31.197646],
  24. markers: [],
  25. markerRefs: [],
  26. source: 'click'
  27. };
  28. },
  29. created() {
  30. let self = this;
  31. let markers = [];
  32. let index = 0;
  33. let basePosition = [121.59996, 31.197646];
  34. let num = 10;
  35. for (let i = 0 ; i < num ; i++) {
  36. markers.push({
  37. position: [basePosition[0], basePosition[1] + i * 0.03],
  38. template: `<button @click="handler(${ i })">{{ source }} ${ i }</button>`
  39. });
  40. }
  41. this.markers = markers;
  42. },
  43. methods: {
  44. handler(index) {
  45. alert(`${ index } - trigger`);
  46. }
  47. }
  48. };
  49. </script>

实现效果:

3、render 方式渲染  v0.4.3 开始支持。

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap
  4. vid="amapDemo2"
  5. :center="center"
  6. :zoom="zoom"
  7. class="amap-demo">
  8. <el-amap-marker v-for="(marker, index) in componentsMarkers" :position="marker.position" :vid="marker.vid" :content-render="marker.contentRender"></el-amap-marker>
  9. </el-amap>
  10. </div>
  11. </template>
  12. <style>
  13. .amap-demo {
  14. height: 300px;
  15. }
  16. </style>
  17. <script>
  18. module.exports = {
  19. data: function() {
  20. let self = this;
  21. const BtnComponent = {
  22. props: ['text'],
  23. template: `<button>{{text}}</button>`
  24. };
  25. const center = [121.59996, 31.197646];
  26. const componentsMarkers = [1,2,3,4].map((item, index) => {
  27. return {
  28. position: [center[0] + index * 0.02, center[1] + index * 0.02],
  29. vid: `${index}-vid`,
  30. contentRender: h => h(BtnComponent, {
  31. props: {
  32. text: `component ${index}`
  33. },
  34. style: {
  35. background: 'rgb(173, 47, 47)',
  36. color: '#eee'
  37. },
  38. nativeOn: {
  39. click: () => this.handler(`component-${index}`)
  40. }
  41. })
  42. }
  43. });
  44. return {
  45. zoom: 12,
  46. center,
  47. markers: [],
  48. markerRefs: [],
  49. source: 'click',
  50. componentsMarkers
  51. };
  52. },
  53. created() {
  54. let self = this;
  55. let markers = [];
  56. let index = 0;
  57. let basePosition = [121.59996, 31.197646];
  58. let num = 10;
  59. for (let i = 0 ; i < num ; i++) {
  60. markers.push({
  61. position: [basePosition[0], basePosition[1] + i * 0.03],
  62. contentRender: h => h('button', {
  63. on: {click: () => this.handler(i)}}, [`source-${i}`])
  64. });
  65. }
  66. this.markers = markers;
  67. },
  68. methods: {
  69. handler(index) {
  70. alert(`${ index } - trigger`);
  71. }
  72. }
  73. };
  74. </script>

实现效果:

4、slots 渲染 v0.4.5 开始支持。

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap
  4. vid="amapDemo3"
  5. :center="center"
  6. :zoom="zoom"
  7. class="amap-demo">
  8. <el-amap-marker v-for="(marker, index) in markers" :position="marker.position" :vid="index">
  9. <div :style="slotStyle">
  10. <b>Hello {{ count }} times</b>
  11. <button @click="onClick">Add</button>
  12. </div>
  13. </el-amap-marker>
  14. </el-amap>
  15. </div>
  16. </template>
  17. <style>
  18. .amap-demo {
  19. height: 300px;
  20. }
  21. </style>
  22. <script>
  23. module.exports = {
  24. data: function() {
  25. let self = this;
  26. const center = [121.59996, 31.197646];
  27. return {
  28. zoom: 12,
  29. center,
  30. markers: [],
  31. count: 0,
  32. slotStyle: {
  33. padding: '2px 8px',
  34. background: '#eee',
  35. color: '#333',
  36. border: '1px solid #aaa'
  37. }
  38. };
  39. },
  40. methods: {
  41. onClick() {
  42. this.count += 1;
  43. }
  44. },
  45. created() {
  46. let self = this;
  47. let markers = [];
  48. let index = 0;
  49. let basePosition = [121.59996, 31.197646];
  50. let num = 10;
  51. for (let i = 0 ; i < num ; i++) {
  52. markers.push({
  53. position: [basePosition[0], basePosition[1] + i * 0.03]
  54. });
  55. }
  56. this.markers = markers;
  57. }
  58. };
  59. </script>

实现效果:

二十八、信息窗体 - 切换

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap
  4. vid="amapDemo"
  5. :center="center"
  6. :zoom="zoom"
  7. class="amap-demo">
  8. <el-amap-marker v-for="marker in markers" :position="marker.position" :events="marker.events"></el-amap-marker>
  9. <el-amap-info-window v-if="window" :position="window.position" :visible="window.visible" :content="window.content"></el-amap-info-window>
  10. </el-amap>
  11. </div>
  12. </template>
  13. <style>
  14. .amap-demo {
  15. height: 300px;
  16. }
  17. .prompt {
  18. background: white;
  19. width: 100px;
  20. height: 30px;
  21. text-align: center;
  22. }
  23. </style>
  24. <script>
  25. module.exports = {
  26. data: function() {
  27. return {
  28. zoom: 16,
  29. center: [121.59996, 31.197646],
  30. markers: [],
  31. windows: [],
  32. window: ''
  33. };
  34. },
  35. mounted() {
  36. let markers = [];
  37. let windows = [];
  38. let num = 10;
  39. let self = this;
  40. for (let i = 0 ; i < num ; i ++) {
  41. markers.push({
  42. position: [121.59996, 31.197646 + i * 0.001],
  43. events: {
  44. click() {
  45. self.windows.forEach(window => {
  46. window.visible = false;
  47. });
  48. self.window = self.windows[i];
  49. self.$nextTick(() => {
  50. self.window.visible = true;
  51. });
  52. }
  53. }
  54. });
  55. windows.push({
  56. position: [121.59996, 31.197646 + i * 0.001],
  57. content: `<div class="prompt">${ i }</div>`,
  58. visible: false
  59. });
  60. }
  61. this.markers = markers;
  62. this.windows = windows;
  63. }
  64. };
  65. </script>

实现效果:

二十九、点坐标 - 自定义内容

1、基础 content 渲染

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap
  4. vid="amapDemo"
  5. :center="center"
  6. :zoom="zoom"
  7. class="amap-demo">
  8. <el-amap-info-window :position="window.position" :content="window.content"></el-amap-info-window>
  9. </el-amap>
  10. </div>
  11. </template>
  12. <style>
  13. .amap-demo {
  14. height: 300px;
  15. }
  16. </style>
  17. <script>
  18. module.exports = {
  19. data: function() {
  20. let center = [121.59996, 31.197646];
  21. return {
  22. zoom: 12,
  23. center,
  24. window: {
  25. position: center,
  26. content: 'content'
  27. }
  28. };
  29. },
  30. created() {
  31. }
  32. };
  33. </script>

实现效果:

2、template 模板渲染

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap
  4. vid="amapDemo1"
  5. :center="center"
  6. :zoom="zoom"
  7. class="amap-demo">
  8. <el-amap-info-window :position="window.position" :template="window.template"></el-amap-info-window>
  9. </el-amap>
  10. </div>
  11. </template>
  12. <style>
  13. .amap-demo {
  14. height: 300px;
  15. }
  16. </style>
  17. <script>
  18. module.exports = {
  19. data: function() {
  20. let self = this;
  21. return {
  22. zoom: 12,
  23. center: [121.59996, 31.197646],
  24. markers: [],
  25. markerRefs: [],
  26. source: 'click'
  27. };
  28. },
  29. created() {
  30. let basePosition = [121.59996, 31.197646];
  31. this.window = {
  32. position: [basePosition[0], basePosition[1]],
  33. template: `<button @click="handler('hello')">{{ source }}</button>`
  34. }
  35. },
  36. methods: {
  37. handler(index) {
  38. alert(`${ index } - trigger`);
  39. }
  40. }
  41. };
  42. </script>

实现效果:

3、render 方式渲染 v0.4.3 开始支持。

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap
  4. vid="amapDemo2"
  5. :center="center"
  6. :zoom="zoom"
  7. class="amap-demo">
  8. <el-amap-info-window :position="window.position" :content-render="window.contentRender"></el-amap-info-window>
  9. </el-amap>
  10. </div>
  11. </template>
  12. <style>
  13. .amap-demo {
  14. height: 300px;
  15. }
  16. </style>
  17. <script>
  18. module.exports = {
  19. data: function() {
  20. let self = this;
  21. const BtnComponent = {
  22. props: ['text'],
  23. template: `<button>{{text}}</button>`
  24. };
  25. const center = [121.59996, 31.197646];
  26. return {
  27. zoom: 12,
  28. center,
  29. markers: [],
  30. source: 'click',
  31. window: {
  32. position: center,
  33. contentRender: h => h(BtnComponent, {
  34. props: {
  35. text: 'hello'
  36. },
  37. style: {
  38. background: 'rgb(173, 47, 47)',
  39. color: '#eee'
  40. },
  41. nativeOn: {
  42. click: () => this.handler(`hello click`)
  43. }
  44. })
  45. }
  46. };
  47. },
  48. created() {
  49. },
  50. methods: {
  51. handler(val) {
  52. alert(`${ val } - trigger`);
  53. }
  54. }
  55. };
  56. </script>

实现效果:

4、slots 渲染 v0.4.5 开始支持。

  1. <template>
  2. <div class="amap-page-container">
  3. <el-amap
  4. vid="amapDemo3"
  5. :center="center"
  6. :zoom="zoom"
  7. class="amap-demo">
  8. <el-amap-info-window :position="window.position">
  9. <div :style="slotStyle">
  10. <b>Hello {{ count }} times</b>
  11. <button @click="onClick">Add</button>
  12. </div>
  13. </el-amap-info-window>
  14. </el-amap>
  15. </div>
  16. </template>
  17. <style>
  18. .amap-demo {
  19. height: 300px;
  20. }
  21. </style>
  22. <script>
  23. module.exports = {
  24. data: function() {
  25. let self = this;
  26. const center = [121.59996, 31.197646];
  27. return {
  28. zoom: 12,
  29. center,
  30. count: 0,
  31. slotStyle: {
  32. padding: '2px 8px',
  33. background: '#eee',
  34. color: '#333',
  35. border: '1px solid #aaa'
  36. },
  37. window: {
  38. position: [121.59996, 31.197646]
  39. }
  40. };
  41. },
  42. methods: {
  43. onClick() {
  44. this.count += 1;
  45. }
  46. },
  47. created() {
  48. }
  49. };
  50. </script>

实现效果:

到此就结束了,累坏我了。。。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/424964
推荐阅读
相关标签
  

闽ICP备14008679号