WebGIS第十课:智慧校园项目(2)

这就是这一课的成品,实现了打卡功能,能在标记点显示打卡次数。标记点不会消失,就算重启浏览器也能保存。

书接上回,我们用geojson实现了标记点的保存,那么怎么来实现打卡功能呢,这就需要监听标记点的点击事件了。

上一节说的是监听map的点击事件,实现了新增热门标记点的功能,现在就来实现下监听标记点的点击事件,一样的语法:

marker.on('click',function(e){ }

当点击标记时,就能启动function。为了保存打卡次数,需要对标记点进行属性赋值,这时候就需要对geojson进行修改:

            var marker = new AMap.Marker({  // 创建标记
                position:e.lnglat,
                extData:{
                    _geoJsonProperties:{
                        gid: geojson.getOverlays().length+1,
                        click:0,
                    },
                }
            })

这里设置了gid就是标记序号属性,从1开始;还有点击属性,用来记录点击次数,初始值为0.

创建marker后,还要给marker创建绑定事件。注意,这是写在map.on事件中的。语法就是上面的写法。

这样,就只有对新创建的marker才绑定了点击事件。

但是,对于已有的marker就没办法监听了,这时候,还要对已有的marker绑定。

已有的marker都是通过importData的方式拿到的。这时候就需要再导入的时候,就对这些已有的数据进行绑定点击事件。

// 导入数据
        if(JSON.stringify(getData()) != '[]'){ // 判断local是否有数据
            geojson.importData(getData()) //导入数据
            geojson.eachOverlay(function(item){
                item.on('click',function(e){
                    console.log(e)
            })
        }
        map.add(geojson)   // 将geojson添加到地图

函数里item就是旧的数据的每一项,这样就给每个marker都绑定点击事件了。这里eachOverlay是一个 对geojson进行遍历的方法。

设置好事件后,就需要实现,当用户点击i标记时,点击属性加1.这时候就在事件中实现:

                var ext = marker.getExtData()
                var click = ++ext._geoJsonProperties.click

这个意思就是先获取extdata属性值赋予ext变量,然后从中提取click属性,当点击时候,就加1,然后赋值给click变量。

同样的内容,也得给旧标记点在来一次,复制过去即可

                item.on('click',function(e){
                    var ext = item.getExtData()
                    var click = ++ext._geoJsonProperties.click
                }

这就实现了新旧点在点击时 都能让click属性加1.

注意:如果调试时,需要先把已有的geojson存储删除,因为这里已经改变了geojson的结构,已有的数据是没有这些属性的。

实现上述步骤后,还有个问题,就是click的值并没有实现在本地存储geojson数组中的保存,所以还得加上一句:

saveData(geojson.toGeoJSON())

这样才能实现在local storage中的保存。

同样的 这个操作也需要在新旧标记都要进行一遍。

这样就实现了打卡功能,但是,打卡次数现在是在控制台输出的,如何让用户看见呢,这样就需要使用信息框了。

思路就是把console.log替换成消息框的显示模式。

                // 使用消息提示框
                var infowindow = new AMap.InfoWindow({
                    anchor:'top-center',//模板字符串
                    content:`<div>打卡了${click}次</div>`,
                })

这样来实现消息的显示,注意,这个也是在map.on里实现的,接下来就是显示:

             // 打开信息窗
                infowindow.open(map,marker.getPosition())

就是实现了消息窗在哪里显示。当然,新旧标记都要来实现一遍。

有个小问题:为什么点击标记时候,不会触发点击map时候的新加标记的事件?

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Intimes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值