怎样在地图上画爱心

221 阅读3分钟

七夕节时,有男生为给异地恋的女友送祝福,用电动车在地图上画了一个爱心,女友直呼“直男的浪漫”。作为老实的程序员,也想给女友送祝福,但是又没时间去外边画圈,那只好利用摸鱼的时间,云画爱心,又大又圆。

image.png

01 理论准备

首先,我们先了解下地图上的爱心是怎么画成的,其实是手机与平台之间建立的长连接,每几秒上报一个GPS点位,平台将经纬度解析后,投射到自家地图上,在将地图上相邻的点位连成线,就形成了地图上的爱心。这里的技术细节较多,不同厂家坐标系不同,可能是火星坐标系之类的,GPS定位不准需要纠偏等,此处不展开说。只需要了解地图上的爱心,就像动物世界里的狮子在不同地点撒尿,框出来的区域做为自己领地,道理是一样的。

其实很多基于地图的LBS服务,原理都类似,比如TO C的打车、导航、共享位置、爬山轨迹等,TO B的公交车、出租车、校车、运钞车等车辆运营控制平台,都需要将车辆或个人位置信息上报到服务端,常用的长连接就是MQ,通常采用如下几种协议:

STOMP:Streaming Text Orientated Message Protocol,是一种MOM设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理进行交互。ActiveMQ是该协议的典型实现,RabbitMQ可以通过插件支持该协议。

MQTT:Message Queuing Telemetry Transport,是IBM开发的一个即时通讯协议,是一种二进制协议,主要用于服务器和低功耗IoT设备间的通信。该协议支持所有平台,几乎可以把所有物联网物品和外部连接起来,被用来当做传感器和制动器的通信协议。RabbitMQ通过插件可支持该协议。另外还有JMS(Java  Messaging Service),AMQP(Advanced Message Queuing Protocol),这里不做介绍。

02 技术准备

1、安装 python里有封装好的stomp库,可直接安装。

pip install stomp

2、连接到服务端 通过ip、端口、用户名、密码、主题名称,连接到相应的主题。

import stomp
import time,random
import datetime
import uuid
def sendMsgRandMulti():
 headers = {'type''bytesMessage'}
    conn = stomp.Connection10([(ip, port)],auto_content_length=False)
    conn.start()
    conn.connect(username='admin', passcode=passcode, wait=True)

03 发送GPS

1、构造报文 基本是想要什么形状,给定基础的经纬度,按曲线取点,类比放大即可,这里采用两组数字,让GPS在江苏这片区域随机闲逛或一路向东。

    for i in range(1,500):
        # 一路向东
        # latitude = str(10876000)
        # longitude= str(43278000+i*inter)
        # 随机闲逛
        latitude = str(random.randrange(1187980411879904))
        longitude = str(random.randrange(4327829143278491))
        # longitude= str(43310000)
        nowTimeIso=datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S.%f')[0:-3]+'+08:00'
        eventId=str(uuid.uuid4())
        msg = '''{"data":{"direction":"10626","divisionEW":"E","divisionNS":"N",''' \
        '''"height":"15090","latitude":"''' + latitude + '''","longitude":"''' + longitude + '''","needsResponse":"1","precision":"6","remark":"test/debug","retransFlag":"0","satellites":"18"''' \
            ''',"speed":"''' + str(speed) + '''00000","time":"''' + nowTimeIso +'''"} '''
        conn.send(destination=topic_name, body=msg, headers=headers, content_type="text/plain")  # 发送消息
        time.sleep(t_inter)
        print(msg)
    conn.disconnect()

注意速度要控制好,不要出现超音速,甚至超过第一宇宙速度的轨迹。

04 结论

本文仅做原理上的解释,要给地图类app发送伪造GPS还需要绕过一堆权限验证,后面再说。心之所向,必有所往。

好了,今天就介绍到这儿。