微信小程序地图功能开发:绘制多边形和标记点

在微信小程序中,地图功能是一个常见的需求,尤其是在需要展示地理位置、导航指引或区域覆盖的应用中。本文将通过一个实际的微信小程序地图组件示例,介绍如何在地图上绘制多边形区域和标记点,以及如何响应用户的点击事件。

项目背景

本项目的目标是开发一个微信小程序,用于展示和管理泊位信息。用户可以通过点击地图上的不同区域,获取到泊位的详细信息。为了实现这一功能,我们需要在地图上绘制多边形区域,并在每个泊位上放置标记点。

技术栈

  • 微信小程序:腾讯的小程序平台,用于开发轻量级应用。
  • 微信小程序地图组件:微信小程序提供的地图展示和操作组件。
  • gcoord:一个用于坐标转换的JavaScript库,支持不同坐标系之间的转换。

组件实现

这里提供的代码块仅展示了部分关键功能,以帮助读者理解整个实现过程,完整的代码和项目资源可以在个人中心-资源库获取

1. 地图组件模板

在微信小程序中,我们使用<map>组件来承载地图,并设置必要的属性,如纬度、经度、缩放级别等。

html 复制代码
<template>
	<view style="width: 100%;">
		<view class="page-section page-section-gap">
			<!-- subkey:地图密钥  theme="satellite":卫星图模式 -->
			<map class="map-container" :latitude="latitude" 
			:longitude="longitude" :theme="'satellite'" :scale="14"
			:subkey="process.env.VUE_APP_MAP_KEY"  
			@click="onMapTap"
			:markers="markers"
				:polygons="polygonList" theme="satellite">
			</map>
		</view>
	</view>
</template>

2. 脚本逻辑

在脚本部分,我们定义了组件的数据属性,包括地图实例、经纬度、多边形列表和标记点列表。同时,我们实现了一系列的生命周期钩子和方法,用于初始化地图、处理地图点击事件、转换坐标系等。

javascript 复制代码
<script>
import { calculatePolygonCenter, isPointInPolygon } from '@/utils' // 自定义转换工具函数
import gcoord from 'gcoord'  // 地理坐标转换工具
import { apiberthDistribution } from '@/api/berthInfoSearch'

export default {
  data() {
    return {
      map: null,
      latitude: '21.588014',
      longitude: '111.819785',
      polygonList: [],
      markers: [],
      mapKey: '你的微信小程序地图密钥'
    }
  },
  methods: {
    onMapTap(e) {
      const point = { latitude: e.detail.latitude, longitude: e.detail.longitude }
      const area = this.polygonList.find(item => isPointInPolygon(point, item.points))
      if (area) {
        // 跳转到泊位详情页面
      }
    },
    initMap() {
      // 获取泊位数据并初始化地图上的多边形和标记点
    },
    parseStringTo2DArray2(item) {
      // 将字符串形式的坐标转换为二维数组,并计算多边形的中心点,用于标记点
    },
    parseStringTo2DArray(item) {
      // 将字符串形式的坐标转换为二维数组,并创建多边形对象
      let strArr = item.berthCoordinate.split(';').map(item => item.split(','))
	  let ply = []
	  strArr.forEach(item => {
	      let m = this.transitionMap(item[1],item[0])
	      ply.push(m)
	  })
	  let polygon = {
		  id:item.id,
		  points: ply,
		  strokeColor: item.lineColor || '#ceaf93', // 多边形线颜色
		  strokeWidth: 3,
		  fillColor: item.berthColour + 'b3', // 多边形填充颜色
		  zIndex: 11
      }
	  return polygon
    },
    transitionMap(lng, lat) {
      // 转换坐标系
    }
  }
}
</script>

3. 样式定义

为了确保地图能够正确显示,我们定义了地图容器的样式,设置了其高度和宽度。

css 复制代码
<style lang="scss" scoped>
.map-container {
  height: 100vh;
  width: 100vw;
}
</style>

4. 坐标转换

为了确保地图上显示的坐标准确,我们使用了gcoord库和自定义的转换函数来处理坐标系的转换。

javascript 复制代码
/**
 * 判断点是否在某多边形闭合区域内
 * @typedef Point
 * @property {number} latitude
 * @property {number} longitude
 * @param {Point} point 坐标点
 * @param {Point[]} polygon 多边形坐标
 * @returns {boolean}
 */
export const isPointInPolygon = (point, polygon) => {
  let xi, xj, yi, yj
  let inside = false

  for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
    xi = polygon[i].longitude
    yi = polygon[i].latitude
    xj = polygon[j].longitude
    yj = polygon[j].latitude

    /* 如果点在多边形的顶点上,直接返回 true */
    if ((xi === point.longitude && yi === point.latitude) || (xj === point.longitude && yj === point.latitude)) {
      return true;
    }

    /* 如果点在多边形的边界上,也返回 true */
    if (yi > point.latitude != yj > point.latitude && point.longitude <= (xj - xi) * (point.latitude - yi) / (yj - yi) + xi) {
      inside = !inside
    }
  }

  return inside
}

/**
 * 获取多边形闭合区域中心点坐标
 * @param {Point[]} polygon 多边形坐标
 * [{latitude: 21.5727777646496, longitude: 111.82918938585996},
    {latitude: 21.572896900539284, longitude: 111.82948384286787},
    {latitude: 21.573441024780955, longitude: 111.82921084053669},
    {latitude: 21.573281991421084, longitude: 111.8289163807698}]
 * @returns {latitude,longitude}
 */
export const calculatePolygonCenter = vertices => {
  let totalLatitude = 0
  let totalLongitude = 0
  vertices.forEach(vertex => {
    totalLatitude += vertex.latitude
    totalLongitude += vertex.longitude
  })
  const centerLatitude = totalLatitude / vertices.length
  const centerLongitude = totalLongitude / vertices.length
  return { latitude: centerLatitude, longitude: centerLongitude }
}

结论

通过本文的介绍,我们了解了如何在微信小程序中集成地图功能,并在地图上绘制多边形区域和标记点。这为开发具有地理位置展示和交互功能的应用提供了一个实用的解决方案。随着微信小程序平台的不断更新和扩展,我们可以期待未来能够实现更多创新的地图功能和交互体验。

相关推荐
Z_ One Dream11 分钟前
css 在 hover 子元素时,不要让父元素触发 hover 效果
前端·javascript·css
井眼11 分钟前
微信小程序-全局数据共享/页面间通信
微信小程序·小程序
程序媛_文乐1 小时前
微信小程序如何实现地图轨迹回放?
微信小程序·小程序
硬汉嵌入式6 小时前
H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)
开发语言·junit·小程序·lua
Python私教7 小时前
Flutter颜色和主题
开发语言·javascript·flutter
大力水手~8 小时前
css之loading旋转加载
前端·javascript·css
前端郭德纲8 小时前
深入浅出ES6 Promise
前端·javascript·es6
天天进步20159 小时前
Lodash:现代 JavaScript 开发的瑞士军刀
开发语言·javascript·ecmascript
王哲晓9 小时前
第六章 Vue计算属性之computed
前端·javascript·vue.js
假装我不帅9 小时前
js实现类似与jquery的find方法
开发语言·javascript·jquery