好久没写文章了,之前一直有一个想法,就是做一个根据用户行走的路线,获取地理位置,然后把它们绘制出来,最后产生的效果,类似蜗牛行走留下的痕迹。

最近思考了一下,搭了一个https,简单实现了一下,提供一下思路给大家看看,具体的细节还有很多需要完善。

demo:

demo页面地址: (不会泄露你的隐私,请用移动端访问,耐心等待位置获取)
https://www.yudonghan.com/snail/

1.地理信息接口

要做这样一个东西首先要去了解html5提供了哪些地理信息接口,这些内容可以在MDN上找到:
主要是一个 Geolocation.watchPosition()Geolocation.getCurrentPosition()

getCurrentPosition 是一次性的获取你的地理信息位置,watchPosition是监听地理信息位置的改变。

2.https

了解到接口以后,遇到的第一个问题是,发现普通的http协议由于隐私限制,已经取消了对上述两个接口的支持,解决方法是必须搭建https协议的服务器!
上网找到方法,我使用伪造的假证书搭建了nginx 的https服务,但问题是用户在访问的时候需要手动确认这个不安全的访问,不过这也正常,作为定位这样敏感的信息,确实是需要极高的安全性。

3.实现思路

我希望可以过一段时间拿到一个定位,只有一个,所以我设置了一个时间周期的循环,并记录当前在哪个循环内,如果这个周期内已经拿到过watch接口得到的位置,那么我就不做操作,如果没拿到过,我就给放到记录里,如果整个周期都没拿到,也没关系,我就抛弃这个周期,去获取更精确的值。

地理信息的返回,是带有一个accurancy的精度值,是以米为单位的,对地理信息的舍弃与否,主要取决于你期望的这个精确值。

关于绘制,这边就是用一个最基本的带有透明度的圆。在最开始,我会记录下第一次进来的位置信息(对应画布的粗略的中点),之后每次跟这次进行比对,算出差值,然后放大,映射到画布坐标,作为圆心,绘制到画布上。

直接看代码:

(function () {
// 初始化画布
var canvas
var ctx
var width = 500;
var height = 500;
function initCanvas() {
canvas = document.getElementById("snail_canvas");
canvas.width = width;
canvas.height = height;
ctx = canvas.getContext("2d");
}
// 绘制点方法
function drawPoint(x, y, r) {
ctx.fillStyle = "rgba(0, 0, 200, 0.1)";
ctx.beginPath();
ctx.arc(x, y, r, 0, 2 * Math.PI);
ctx.fill();
} // 地理信息位置参数
var options = {
enableHighAccuracy: true,
desiredAccuracy: 20
}
// 一些记录用的变量
var pathArr = {}
var pathIndex = 0
var watchID = navigator.geolocation.watchPosition(checkLocation, onError, options);
var firstFlag = true
var centerPos = {}
var centerPoint = {}
centerPoint.x = width / 2
centerPoint.y = height / 2 // 检查位置,每次地理信息变化都会经过这个函数
function checkLocation(position) {
// 精度小于期望值过滤
if (position.coords.accuracy <= options.desiredAccuracy) {
// 当前周期内只能记录一次地理坐标
if (!pathArr[pathIndex]) {
var offset
pathArr[pathIndex] = position
document.getElementById('container').innerHTML += 'render in period' + pathIndex + '<br>';
// 获取地理坐标
var geoX = position.coords.longitude
var geoY = position.coords.latitude
// 全局第一次坐标作为我们画布的中点绘制
if (firstFlag) {
offset = {
x: 0,
y: 0
}
centerPos = {
x: geoX,
y: geoY
}
firstFlag = false
}
else {
// 后来的坐标我们算跟第一次坐标的差值记录
offset = {
x: geoX - centerPos.x,
y: geoY - centerPos.y
}
}
// 将差值传给点渲染方法
renderPoint(offset)
}
}
}
// 地理坐标放大倍数
var mulTime = 100000
function renderPoint(offset) {
// 用画布中点叠加放大后的差值,并绘制该点
var x = centerPoint.x + offset.x * mulTime
var y = centerPoint.y + offset.y * mulTime
drawPoint(x, y, 5)
document.getElementById('container').innerHTML += '**** : ' + offset.x + '+' + offset.y + '<br>';
} function main() {
initCanvas()
// 设置一个循环来计算周期,每个周期最多获取一次地理信息位置,最少0次
setInterval(function () {
pathIndex ++
}, 2000)
} // 页面加载和重新进入页面的时候都会运行main
window.onload = main;
window.focus = main; //失败时
function onError(error){
switch(error.code){
case 1:
alert("位置服务被拒绝");
break; case 2:
alert("暂时获取不到位置信息");
break; case 3:
alert("获取信息超时");
break; case 4:
alert("未知错误");
break;
}
} })()

4.问题

目前这套系统还存在很多问题,比如精度问题,经常产生绘制不准确的情况。

绘制上,更是不够细致,尤其是当你走出画布是无法记录的,当前的放大值过大,还很容易走出画布。该点后续可以优化。

最大问题:作为html5页面,你必须一直开启浏览器访问才能持续获取定位,不能黑屏,不能暂存浏览器,导致这个页面非常不实用!

进化:
目前是透明圆点的绘制方法,可以改用折现等其他方式。
圆点可以自定义颜色,大小,成为真正的步行绘制系统。
可以自定义放大倍数,根据用户的速度,改变不同的放大。

根据地理信息绘画的html5 小游戏 - 简单实现的更多相关文章

  1. HTML5小游戏-简单抽奖小游戏

    换了新工作以后,专注前端开发,平常空闲时间也比较多,可以多钻研一下技术,写一下博客.最近在学习canvas,参考网上的slotmachine插件,用canvas实现了一个简单抽奖小游戏.       ...

  2. HTML5小游戏UI美化版

    HTML5小游戏[是男人就下一百层]UI美化版 之前写的小游戏,要么就比较简单,要么就是比较难看,或者人物本身是不会动的. 结合了其它人的经验,研究了一下精灵运动,就写一个简单的小游戏来试一下. 介绍 ...

  3. 推荐10款超级有趣的HTML5小游戏

    HTML5的发展速度比任何人的都想像都要更快.更加强大有效的和专业的解决方案已经被开发......甚至在游戏世界中!这里跟大家分享有10款超级趣味的HTML5游戏,希望大家能够喜欢! Kern Typ ...

  4. 菜鸟做HTML5小游戏 - 翻翻乐

    记录下开放过程.做小游戏开发,又要跨平台,flash又不支持iPhone,html5是最好的选择. 先看看最后效果: 好了,开始demo. 1.准备工作: 图片素材(省略...最后代码一起打包) 了解 ...

  5. 通通制作Html5小游戏——第二弹(仿flappy bird像素鸟)

    亲爱的博友们,我又回来啦~因为我们技术宅的思想只有技术宅懂得,好不容易写了点好玩的东西发QQ空间,结果只有11的UV,0回复....10分钟ps一个女神的素描效果发QQ空间朋友圈,一大堆回复加赞,作为 ...

  6. HTML5小游戏【是男人就下一百层】UI美化版

    之前写的小游戏,要么就比较简单,要么就是比较难看,或者人物本身是不会动的. 结合了其它人的经验,研究了一下精灵运动,就写一个简单的小游戏来试一下. 介绍一下几个主要的类: Frame:帧的定义,主要描 ...

  7. HTML5小游戏源码收藏

    html5魅族创意的贪食蛇游戏源码下载 html5网页版打砖块小游戏源码下载 html5 3D立体魔方小游戏源码下载 html5网页版飞机躲避游戏源码下载 html5三国人物连连看游戏源码下载 js ...

  8. Html5 小游戏 俄罗斯方块

    导言 在一个风和日丽的一天,看完了疯狂HTML 5+CSS 3+JavaScript讲义,跟着做了书里最后一章的俄罗斯方块小游戏,并做了一些改进,作为自己前端学习的第一站. 游戏效果: 制作思路 因为 ...

  9. HTML5小游戏之见缝插针

    今天给大家带来的就是一款叫做<见缝插针>的游戏.有空你就往里插,直到你无处可插!看你能过多少关! 简洁大气 黑白搭配游戏画面非常的简洁,米白色的背景中央,放置着一个不断旋转的太阳状的球体, ...

随机推荐

  1. Qt:QDateTime、QDate、QTime与QDateTimeEdit

    时间日期是经常遇到的数据类型,Qt中的时间日期类如下: QTime:时间类型,只表示时间,如15:23:13: QDate:日期类型,只表示日期,如2017-4-5: QDateTime:日期时间类型 ...

  2. JAVA——类与对象

    目录 类与对象 一.类 二.对象 2.1对象的内存布局形式 三.类与对象 3.1如何创建 3.2如何访问属性 3.2类与对象的分配机制 3.2.1Java内存的结构分析 注意事项和细节 类与对象 为什 ...

  3. json web token JWT实现TP5创建和验证

    根据博客进行jwt初始化配置 https://blog.csdn.net/weixin_43389208/article/details/117442266?spm=1001.2014.3001.55 ...

  4. BBS项目分布搭建五(评论相关功能实现)

    BBS项目分布搭建五(评论相关) 1. 根评论逻辑实现 # 在models.py文件中 修改: # 7. 评论表 parent = models.ForeignKey(to='self', null= ...

  5. 1354:括弧匹配检验ybt

    [题目描述]假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配. 现在 ...

  6. 内网渗透----windows信息收集整理

    一.基础信息收集 1.信息收集类型 操作系统版本.内核.架构 是否在虚拟化环境中,已安装的程序.补丁 网络配置及连接 防火墙设置 用户信息.历史纪录(浏览器.登陆密码) 共享信息.敏感文件.缓存信息. ...

  7. docker学习笔记(4)- 应用数据管理(容器外)

    简介 docker storage driver支持了image分层存储和容器可写层的存储管理,使用挂载主机目录的方式可以将数据存储在主机的文件系统上或内存中. 之前学习过镜像的分层存储,以Docke ...

  8. 解决Hadoop集群hdfs无法启动DataNode的问题

    问题描述: 在hadoop启动hdfs的之后,使用jps命令查看运行情况时发现hdfs的DataNode并没有打开. 笔者出现此情况前曾使用hdfs namenode -format格式化了hdfs ...

  9. 《手把手教你》系列基础篇(八十三)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-下篇(详解教程)

    1.简介 其实前边好像简单的提到过测试报告,宏哥觉得这部分比较重要,就着重讲解和介绍一下.报告是任何测试执行中最重要的部分,因为它可以帮助用户了解测试执行的结果.失败点和失败原因.另一方面,日志记录对 ...

  10. leetcode-3无重复字符的最长子串

    题目原题: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 ...