微信小程序,地图开发:实现判断点在面中

传送门:实现的原理参考

上图:

上代码:

在utils中:

//判断点是否在面中
function inArea(l, p) {
  var minX = l[0].longitude,
    maxX = l[0].longitude,
    minY = l[0].latitude,
    maxY = l[0].latitude;
  for (var i = 1; i < l.length; i++) {
    if (l[i].longitude < minX) {
      minX = l[i].longitude;
    }
    if (l[i].longitude > maxX) {
      maxX = l[i].longitude;
    }
    if (l[i].latitude < minY) {
      minY = l[i].latitude;
    }
    if (l[i].latitude > maxY) {
      maxY = l[i].latitude;
    }
  }
  if (p.longitude < minX && p.longitude > maxX && p.latitude < minY && p.latitude > maxY) {
    return false // 这个测试都过不了。。。直接返回false;
  } else {
    var vertx = [],
      verty = [];
    for (var i = 0; i < l.length; i++) {
      vertx.push(l[i].longitude)
      verty.push(l[i].latitude)
    }
    var c = pnpoly(l.length, vertx, verty, p.longitude, p.latitude);
    return c;
  }
}

function pnpoly(nvert, vertx, verty, testx, testy) {
  var i, j, c = false;
  for (i = 0, j = nvert - 1; i < nvert; j = i++) {
    if (((verty[i] > testy) != (verty[j] > testy)) &&
      (testx < (vertx[j] - vertx[i]) * (testy - verty[i]) / (verty[j] - verty[i]) + vertx[i]))
      c = !c;
  }
  return c;
}

module.exports = {
  inArea: inArea,
}

 

在地图界面中: wxml

<view  class="tbfb">
<map show-location="true" show-compass="true"  style="width: 100%; height:100%"></map>
<map   longitude="{{longitude}}" latitude="{{latitude}}"scale="14"  show-location="true" bindtap="clickMapTap" markers="{{marks}}" 
polygons="{{polygons}}"
bindmarkertap="markertap"  style="width: 100%; height:1200rpx"/>

</view>

注意的是bindtap事件,其他的属性可以参考微信的api

JS:

 clickMapTap: function(e) { //单击地图事件,在page中作为一个方法的存在。
    //console.log("点击了地图"
    // if (!false) {
    //   return
    // }
    var mark = new Object();//创建一个mark对象
    mark.id = this.data.marks.length;
    mark.longitude = e.detail.longitude; //经度
    mark.latitude = e.detail.latitude;
    mark.iconPath = "/images/point.png";//点图标,自己弄
    mark.width = 10;
    mark.height = 12;
//将点击得到的经纬度赋值
    var point = {
      longitude: e.detail.longitude,
      latitude: e.detail.latitude
    }
//声明 fw(范围)是一个坐标集合,可以自己找一些固定的点。
//(组织形式:[{lat,lng},{lat,lng}...]),
    var inin = util.inArea(fw, point)//条用util中的判断方法
    mark.label = {
      fontSize: 25,
      anchorX: -5,
      anchorY: 0,
      content: inin ? "在面内" : "在面外",
      textAlign: 'center',
      color: '#000000',
    }
    this.data.marks.push(mark);

    this.setData({//在点击位置设置mark
      marks: this.data.marks,
    })

  },

代码上完了,讲下流程,通过绑定地图的单击事件,然后判断点击的点是否在面内!

遇到的坑,1.首先地图中的polygons是一个面集合,所以不能用面对象直接塞进去,这样无法显示面,

2.maker的label是mark的一个对象属性,直接复制是没有问题的,

3.setData是用于界面数据更新的方法,所以等于号赋值是不起用作的

3.在page的顶端加上var util = require('../../utils/util.js');utils的路径,来获取工具类里面的方法

4.在utils中module.exports是用来映射方法的,所以如果不在里面添加上你写的方法是无法使用的

接下来实现了吗?欢迎提问。

 

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
清凉一夏 来点一杯星巴克吧! 当我们还在家吹着空调敲着代码吃着西瓜的时候,可能你的她还在炎炎夏日下大汗淋漓,打开这个小程序,为她点上一杯冰镇的星巴克,后续的故事就不用再说了把,作为还在起跑线上的全栈的学习者,初试微信小程序,花了四天左右的时间初步的完成了这个小程序,这个小程序吸引我的真的就是颜啊(身为颜控的我),有木有觉得很美观,下面我们就一起看下这个demo吧 如果各位看官觉得还行不妨点个赞哦项目源码: GitHub 求小星星鼓励项目工具及文档1.微信web开发者工具:微信小程序官网 一款很好用的小程序编辑软件2.开发文档:微信小程序必备无敌文档 你想要的都在里面页面注册 app.json {"pages":[    "pages/index/index",     星巴克用星说 主页    "pages/detail/detail",   @all 我想对你们说    "pages/giftcard/giftcard", 礼品卡详情页 ], }项目功能已实现的功能scroll-view等基础事件tab切换及其高亮事件添加购物车的显示隐藏功能付款的显示隐藏及其高亮的功能未实现的功能门店列表(显示最近30家门店)功能地图定位功能具体功能预览1.tab切换在tab切换上,做到了大图切换和小图高亮,是不是效果还不错具体效果图:如下 这里底部闪光是因为录屏软件的问题哦_实现代码:如下                                   选择卡面                                                                                                                                                                                             使用点击事件就可以实现这些功能啦,有没有很简单 2.giftcard在点击左边一部分的时候是跳转礼品卡详情3.购物付款功能在点击右边部分的➕和➖就会修改对应的数量了,当然哦,下面的结账也会显示你所购买的数量和总价哦,是不是觉得符合现代化简约美呀这是这个小程序最闪光点也最需要思考的地方啦,仔细一看发现是不是操作后有很多小的变化,也是这小小的变化让整个小程序更美观了这是选择礼品的布局样式             <tex
### 回答1: 微信小程序开发是一种方便开发者在微信小程序进行快速开发的云服务。它提供了两种主要的后台语言选择,分别是Spring Boot和Node.js。 Spring Boot是一款基于Java语言的开发框架,它能够帮助开发者快速搭建企业级应用程序。Spring Boot具有简化配置、自动化配置、快速开发等特点,能够加快开发速度、提高开发效率。在微信小程序开发,使用Spring Boot作为后台语言可以基于Java进行开发实现业务逻辑的处理、数据库的操作、接口的开发等。Spring Boot在企业级开发被广泛应用,因此使用它进行微信小程序开发能够获得更丰富的技术支持和生态系统。 Node.js是一种基于JavaScript语言的后台开发语言,它具有高效、轻量、可伸缩等特点。Node.js使用事件驱动、非阻塞I/O模型,能够处理大量并发访问,适合构建高性能的网络应用和服务。在微信小程序开发,使用Node.js作为后台语言可以基于JavaScript进行开发实现业务逻辑的处理、数据库的操作、接口的开发等。Node.js在全球拥有庞大的开发者社区和生态系统,因此使用它进行微信小程序开发能够获得更多的开发资源和共享的代码库。 总而言之,无论选择Spring Boot还是Node.js作为微信小程序开发的后台语言,都能够通过其相应的特点和优势,快速实现小程序的开发需求,并获得广泛的技术支持和共享资源。具体选择哪种语言取决于开发者的经验和偏好,以及项目需求的复杂性和规模等因素。 ### 回答2: 微信小程序开发是一种用于开发微信小程序的新型开发方式,它提供了一整套云开发能力,包括云函数、数据库、存储等等。而Spring Boot和Node.js则是两种常用于开发Web应用的后端技术。 Spring Boot是一个基于Spring框架的快速开发应用的工具,它简化了Spring的配置过程,提供了很多开箱即用的功能,让开发者可以更快速地搭建Web应用。Spring Boot主要使用Java语言进行开发,它的特点是分层架构、模块化开发、依赖管理等。 Node.js是一种基于事件驱动、非阻塞I/O模型的后端JavaScript运行环境,它可以用于构建高性能、可扩展的网络应用。Node.js使用JavaScript语言进行开发,它的特点是单线程、事件循环、异步非阻塞等。 相比而言,微信小程序开发更适合开发小程序,而Spring Boot和Node.js则更适合开发Web应用。微信小程序开发主要利用云开发能力,将开发者的代码逻辑部署在云端,并提供了强大的实时数据库、云函数等功能。而Spring Boot和Node.js则需要自己搭建服务器环境,并且需要开发者编写后端逻辑代码来处理请求和响应。 总结来说,微信小程序开发适合开发小程序,提供了丰富的云开发能力;而Spring Boot和Node.js适合开发Web应用,提供了快速开发、高性能的后端技术。根据具体的应用需求和开发者的技术背景,可以选择合适的技术进行开发。 ### 回答3: 微信小程序开发是一种基于微信生态系统的开发框架,它允许开发者通过云函数、数据库和存储等服务器端资源来扩展小程序的功能。在微信小程序开发,可以使用多种后端技术来开发云函数,其包括Spring Boot和Node.js。 Spring Boot是一个基于Java语言的开发框架,它提供了快速开发和构建Web应用程序的能力。通过Spring Boot,开发者可以使用Java语言编写云函数,这些函数可以通过请求-响应的方式与小程序进行交互。Spring Boot具有强大的生态系统和丰富的功能库,可以轻松处理各种业务逻辑,并提供高效稳定的性能。 Node.js是一个基于JavaScript语言的开发平台,它提供了基于事件驱动、非阻塞IO模型的服务器端编程能力。通过Node.js,开发者可以使用JavaScript语言编写云函数,并使用其丰富的模块库来快速开发小程序的后端功能。另外,Node.js还具有高效的并发处理能力,可以处理大量的用户请求。 无论是Spring Boot还是Node.js,都可以在微信小程序开发充当云函数的开发语言,开发者可以根据自己的喜好和经验选择使用哪种语言。两者都具有丰富的开发资源和社区支持,可以满足各种复杂的业务需求。当然,选择哪种语言还需要考虑开发者的技术背景和项目需求。 总而言之,微信小程序开发支持使用Spring Boot和Node.js来开发云函数,通过灵活的后端技术选择,开发者可以更加便捷地扩展小程序的功能,提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WindFutrue

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

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

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

打赏作者

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

抵扣说明:

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

余额充值