更新时间:2023-12-15 GMT+08:00

构建函数程序

编辑函数程序

打开创建的函数iotdemo,复制以下坐标转换代码,仅供测试不建议用于生产用途,用户也可以根据自己的需要修改。

 # -*- coding:utf-8 -*-
import json
import math
from math import pi
 
def handler(event, context):
    data = event["notify_data"]["body"]
    lat = data["lat"]
    lng = data["lng"]
    print(f" WGS84: ({lng},{lat})")
    gcj_lng, gcj_lat = transform(lng, lat)
    print(f" GCJ02: ({gcj_lng},{gcj_lat})")
    body = {
        "gcj_lng": gcj_lng,
        "gcj_lat": gcj_lat
    }
    return {
        "statusCode": 200,
        "isBase64Encoded": False,
        "body": json.dumps(body),
        "headers": {
            "Content-Type": "application/json"
        }
    }
 
def transform(lon, lat):
    a = 6378245.0
    ee = 0.00669342162296594323
 
    dlat = transform_lat(lon - 105.0, lat - 35.0)
    dlon = transform_lon(lon - 105.0, lat - 35.0)
 
    rad_lat = lat / 180.0 * pi
    magic = math.sin(rad_lat)
    magic = 1 - ee * magic * magic
    sqrt_magic = math.sqrt(magic)
 
    dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrt_magic) * pi)
    dlon = (dlon * 180.0) / (a / sqrt_magic * math.cos(rad_lat) * pi)
 
    mg_lon = lon + dlon
    mg_lat = lat + dlat
 
    return mg_lon, mg_lat
 
def transform_lon(x, y):
    ret = 300.0 + x + 2.0 * y + 0.1 * x * x + \
        0.1 * x * y + 0.1 * math.sqrt(math.fabs(x))
    ret += (20.0 * math.sin(6.0 * pi * x) +
            20.0 * math.sin(2.0 * pi * x)) * 2.0 / 3.0
    ret += (20.0 * math.sin(pi * x) +
            40.0 * math.sin(pi / 3.0 * x)) * 2.0 / 3.0
    ret += (150.0 * math.sin(pi / 12.0 * x) +
            300.0 * math.sin(pi / 30.0 * x)) * 2.0 / 3.0
return ret
 
def transform_lat(x, y):
    ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + \
        0.1 * x * y + 0.2 * math.sqrt(math.fabs(x))
    ret += (20.0 * math.sin(6.0 * pi * x) +
            20.0 * math.sin(2.0 * pi * x)) * 2.0 / 3.0
    ret += (20.0 * math.sin(pi * y) +
            40.0 * math.sin(pi / 3.0 * y)) * 2.0 / 3.0
    ret += (160.0 * math.sin(pi / 12.0 * y) +
            320 * math.sin(pi / 30.0 * y)) * 2.0 / 3.0
    return ret

通过IoTDA 进行线上联调测试

  1. 登录IoTDA控制台,左侧导航栏选择“规则 > 数据转发”后,并在“规则列表”中单击目标规则名称所在行右侧的“详情” ,进入数据转发规则详情页面。
  2. 选择“设置转发目标”,并单击转发目标所在行右侧的“测试”,开始编辑测试数据。

    图1 转发规则测试

  3. 输入测试数据单击 “连通性测试” 。

    {
        "resource": "device.message",
        "event": "report",
        "event_time": "string",
        "notify_data": {
            "header": {
                "app_id": "d4922d8a-6c8e-4396-852c-164aefa6638f",
                "device_id": "d4922d8a-6c8e-4396-852c-164aefa6638f",
                "node_id": "ABC123456789",
                "product_id": "ABC123456789",
                "gateway_id": "d4922d8a-6c8e-4396-852c-164aefa6638f",
                "tags": [
                    {
                        "tag_key": "testTagName",
                        "tag_value": "testTagValue"
                    }
                ]
            },
            "body": {
                "lat": 92.64763932844794,
                "lng": 35.25202546134364
            }
        }
    }

  4. 到FunctionGraph 页面 , 单击 “监控” “日志” 随后点击蓝色的请求id 查看日志。

    可以对程序进行修改,使数据可以用于调用其他系统或进行持久化存储,如存储到obs 等。