谷歌地图的使用,包括坐标点的刷新,设置中心点

之前官网重构,有用到谷歌地图的使用,以及切换坐标点时,图标的切换。
1、首先创建谷歌地图,并申明一个中心点,以及缩放比例。

var myOptions = {
	zoom: 17,
	center: new google.maps.LatLng(clat, clng), // 设置当前柜子为中心
	mapTypeId: google.maps.MapTypeId.ROADMAP,
	mapTypeControl: false
};
//添加map
gmap = new google.maps.Map(document.getElementById("googleMap"), myOptions);

2、取数据,并标点,并给每个标点添加点击事件:

let markers = [];
for(var i = 0; i < Mapdata.length; i++) {
	var gmarker = new google.maps.Marker({
		position: new google.maps.LatLng(Mapdata[i].latitude, Mapdata[i].longitude),
		map: gmap,
		// 下面是匹配中心点图标及一般坐标的图标
		icon: (clng == Mapdata[i].longitude && clat == Mapdata[i].latitude) ? "" : 'img/myPic.png',
		siteId: Mapdata[i].siteId,
		_lng: Mapdata[i].longitude,
		_lat: Mapdata[i].latitude,
	});
	markers.push(gmarker);
}

// 添加点击事件
for(let j = 0; j < markers.length; j++) {
	markers[j].addListener('click', function() {
		// 点击图标,跳转到对应的详情
		location.href = "detail.html?id=" + markers[j].siteId + "&lng=" + markers[j]._lng + "&lat=" + markers[j]._lat;
	});
}

下面是首页示意图,下面的图标采用的自定义的图标
这个icon是自定义的
3、点击首页标点,进入详情页,把ID传过去,
其中一个是重新定位最新的中心点,并zoom到适当的比例,并把选中的中心点标为谷歌默认的红色;下面是详情展示
在这里插入图片描述

4、详情页面点的切换,地图不刷新,地图标点重新渲染

for(let j = 0; j < markers.length; j++) {
	markers[j].addListener('click', function() {
           event.preventDefault();
           event.stopPropagation();
			// 点击图标,获取到对应的详情
             getDetail(markers[j].siteId);
             gmap.setCenter(new google.maps.LatLng(markers[j]._lat,markers[j]._lng));  // 设立新的中心点        
              // 设立当前点中的为红标,其他的为默认黑标        
              markers.forEach(function(ee, ii){
                  if (ee._lng !== markers[j]._lng && ee._lat !== markers[j]._lat) {
                      ee.setIcon("img/location/myPic.png"); //非选中的图标
                  } else {
                      ee.setIcon("");  // 选中的图标(红色)
                  }
              })

	});
		}

所以总结就是:
一、设立新的中心点:gmap.setCenter(latitude, longitude);
二、重新渲染选中的图标:ee.setIcon(“img/myPic.png”); //非选中的图标

<think>好的,我需要帮助用户解决在UniApp中实现地图标记点随缩放调整的问题。首先,用户提到了地图标记点的自适应调整,这通常涉及到根据地图的缩放级别动态改变标记的大小或样式。结合用户提供的引用内容,特别是引用[3]中的代码示例,里面有使用circles和scale属性,这可能与动态调整有关。 首先,我应该回顾UniApp的地图组件文档,确认有哪些属性和事件可用。地图组件通常有scale属性控制缩放级别,而markers数组定义标记点。用户希望标记点随缩放调整,可能需要监听地图的缩放变化事件,然后更新markers的样式,比如图标大小。 引用[2]提到微信小程序的map组件使用scale参数,并且可以通过regionchange事件监听地图区域变化。在UniApp中,类似的事件可能是regionchange,当用户缩放或拖动地图时触发。所以需要在页面中监听这个事件,并在回调函数中获取当前的缩放级别。 接下来,如何根据缩放级别调整标记点的大小?每个标记的iconPath可以设置不同的图标,或者调整iconSize。例如,当scale较大时(即放得较大),可能需要显示更大的图标,反之则缩小。因此,需要动态计算每个标记的iconSize,可能根据scale的值进行比例调整。 引用[3]中的示例使用circles的radius,这可能与圆形覆盖物有关,但用户的问题是关于标记点(markers)。不过,其处理缩放的方式可能有参考价值,比如通过setData更新circles的radius。类似地,可以更新markers的iconSize。 可能的实现步骤包括: 1.地图组件中绑定regionchange事件。 2. 在事件处理函数中获取当前的scale值。 3. 根据scale计算需要的图标大小。 4. 更新markers数组中的iconSize属性,并触发视图更新。 需要注意的是,频繁更新markers可能会导致性能问题,所以可能需要适当的节流处理,或者只在缩放结束时触发更新(根据regionchange的type判断是begin还是end)。 另外,引用[1]提到视野自适应的实现,这可能包括计算所有标记点的范围并调整scale和中心点。虽然用户的问题不是视野自适应,但相关的坐标计算可能有帮助,比如确保在缩放时标记点保持在合适的位置。 最后,可能需要测试不同的缩放级别对图标大小的影响,调整计算方式,使视觉效果更自然。同时,确保在不同平台(如微信小程序)上的兼容性,因为UniApp需要编译到不同平台,某些API或行为可能有所差异。</think>在UniApp中实现地图标记点随缩放动态调整,需结合地图组件的事件监听与数据响应机制。以下是具体实现步骤: --- ### 一、基础实现原理 1. **监听地图缩放事件** 使用`@regionchange`事件捕获地图视野变化,通过回调参数判断是否为缩放操作[^3]。 2. **动态计算标记点尺寸** 根据当前缩放级别(`scale`值)按比例调整标记点图标大小(`iconSize`)。 3. **响应式更新数据** 修改`markers`数组中的`iconSize`属性,触发视图重新渲染。 --- ### 二、代码实现示例 ```html <template> <map id="mapId" :markers="markers" :scale="currentScale" @regionchange="handleRegionChange" show-scale ></map> </template> <script> export default { data() { return { currentScale: 16, // 初始缩放级别 originalIconSize: 20, // 基准图标大小(scale=16时的尺寸) markers: [{ id: 1, latitude: 39.909, longitude: 116.39742, iconPath: '/static/marker.png', iconSize: [20, 20] // 初始大小 }] }; }, methods: { handleRegionChange(e) { if (e.type === 'end') { // 仅处理缩放结束事件 const mapContext = uni.createMapContext('mapId', this); mapContext.getScale({ success: (res) => { this.currentScale = res.scale; this.updateMarkersSize(); } }); } }, updateMarkersSize() { // 根据缩放级别计算新尺寸(示例公式,可调整) const newSize = this.originalIconSize * (this.currentScale / 16); this.markers = this.markers.map(marker => ({ ...marker, iconSize: [newSize, newSize] })); } } }; </script> ``` --- ### 三、关键优化点 1. **节流控制** 在`handleRegionChange`中添加防抖/节流逻辑,避免频繁触发更新: ```javascript import { throttle } from 'lodash'; methods: { handleRegionChange: throttle(function(e) { /* ... */ }, 500) } ``` 2. **非线性缩放公式** 使用对数函数优化尺寸计算,避免极端缩放级别下图标过大/过小: ```javascript const newSize = this.originalIconSize * Math.log2(this.currentScale + 1); ``` 3. **多级图标策略** 预定义不同缩放级别对应的图标(更精细控制): ```javascript const iconLevels = [ { scale: 10, size: 10 }, { scale: 15, size: 20 }, { scale: 20, size: 30 } ]; ``` --- ### 四、注意事项 1. **平台差异** iOS与Android对`scale`值的解释可能不同,需真机测试校准公式参数[^2]。 2. **性能优化** 标记点数量较多时,建议使用`wx.createSelectorQuery`替代`createMapContext`获取缩放级别。 3. **视觉连续性** 添加CSS过渡效果使图标大小变化更平滑: ```css map { transition: transform 0.3s ease; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值