• 【移远QuecPython】EC800M物联网开发板调用网络API(使用SIM卡联网并调用高德地图API的定位坐标转换)


    【移远QuecPython】EC800M物联网开发板调用网络API(使用SIM卡联网并调用高德地图API的定位坐标转换)

    高德API使用方法:

    API相关配置

    SIM卡联网

    首先得联网 我是用的sim卡
    sim卡可以通过

    import sim
    sim.status()
    
    • 1
    • 2

    获取sim卡状态

    为1表示正常

    def SIM_Init():
        if sim.getStatus()==1:
            print("SIM init OK")
        else:
            print("SIM init failed",sim.getStatus())
    
    • 1
    • 2
    • 3
    • 4
    • 5

    网络操作

    这里用的库是request
    类似Python的requests库 但略有不同

    get 文本:

    import request
    
    response = request.get("http://httpbin.org/get")
    for i in response.text:
        print(i)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    get json:

    import request
    
    response = request.get("http://httpbin.org/get")
    data = response.json()
    print(data)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    测试效果:

    {'url': 'http://httpbin.org/get', 'headers': {'X-Amzn-Trace-Id': 'Root=1-65470fd8-1c1a52d30ad8b5d82256ca49', 'Host': 'httpbin.org'}, 'args': {}, 'origin': '114.85.210.18'}
    
    • 1

    与requests不同的是 request库不能直接对response.text进行打印 否则返回一个状态值 如:

    <Response object at 7e32f730>
    
    • 1

    另外 对于get 到的文本 并不能用json.loads函数获取值
    此处的json库对应import ujson

    所以 推荐采用response.json()方法来获取值

    API调用

    一般来说 很多API都是直接通过get来获取json文本 所以需要进行一个转换:

    r = requests.get(url).text
    r = json.loads(r)
    
    • 1
    • 2

    但是这个方法用不了 所以得换成:

    r = requests.get(url).json()
    
    • 1

    调用高德地图API的函数:

    #高德地图API
    def location_to_GCJ02(lon,lat,coordsys):
        url = "https://restapi.amap.com/v3/assistant/coordinate/convert?key="+"你的keys"+"&locations="+str(lon)+","+str(lat)+"&coordsys="+str(coordsys)
        r = requests.get(url).json()
        print(r)
        return r["locations"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    调用方法:

        lon=114.304569
        lat=30.593354
        print(location_to_GCJ02(lon,lat,"gps"))
    
    • 1
    • 2
    • 3

    转换结果:

    {'locations': '114.310011664497,30.590942382813', 'status': '1', 'infocode': '10000', 'info': 'ok'}
    114.310011664497,30.590942382813
    
    • 1
    • 2

    在我的高德API里面也能看到被使用的次数
    在这里插入图片描述

    高德地图API

    API申请:

    lbs.amap.com/api/webservice/guide/api/convert/
    
    • 1

    产品介绍

    坐标转换是一类简单的HTTP接口,能够将用户输入的非高德坐标(GPS坐标、mapbar坐标、baidu坐标)转换成高德坐标。

    使用前您需先申请Key。若无高德地图API账号需要先申请账号。

    适用场景

    为了使用高德服务,用户需要将非高德坐标转换为高德坐标。

    使用限制

    服务调用量的限制请点击这里查阅。

    使用说明

    第一步,申请”Web服务API”密钥(Key);

    第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;

    第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。

    如无特殊声明,接口的输入参数和输出数据编码全部统一为UTF-8。

    坐标转换

    坐标转换API服务地址:

    URL

    restapi.amap.com/v3/assistant/coordinate/convert?parameters
    
    • 1

    请求方式

    GET

    parameters代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。下面的列表枚举了这些参数及其使用规则。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    运行:
    在这里插入图片描述
    在Python中 需要用到requests库 另外json库用于将json文本转换为字典

    import requests
    import json
    
    def location_to_GCJ02(lon,lat,coordsys):
        url = "https://restapi.amap.com/v3/assistant/coordinate/convert?key="+"你的key"+"&locations="+str(lon)+","+str(lat)+"&coordsys="+str(coordsys)
        r = requests.get(url).text
        r = json.loads(r)
        return r["locations"]
    
    lon=114.304569
    lat=30.593354
    print(location_to_GCJ02(lon,lat,"gps"))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果:
    在这里插入图片描述

    附录:列表的赋值类型和py打包

    列表赋值

    BUG复现

    闲来无事写了个小程序 代码如下:

    # -*- coding: utf-8 -*-
    """
    Created on Fri Nov 19 19:47:01 2021
    
    @author: 16016
    """
    
    a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
    #print(len(a_list))
    #b_list = ['','','','','','','','','','','','','','','','']
    c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
    #for i in range(16):
    if len(a_list):
        for j in range(16):
            a_list[j]=str(a_list[j])+'_'+str(j)
            print("序号:",j)
            print('a_list:\n',a_list)
            
            
            c_list[j]=a_list
            print('c_list[0]:\n',c_list[0])
            print('\n')
    #        b_list[j]=a_list[7],a_list[8]
    #        print(b_list[j])
            # 写入到Excel:
    #print(c_list,'\n')    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    我在程序中 做了一个16次的for循环 把列表a的每个值后面依次加上"_"和循环序号
    比如循环第x次 就是把第x位加上_x 这一位变成x_x 我在输出测试中 列表a的每一次输出也是对的
    循环16次后列表a应该变成[‘0_0’, ‘1_1’, ‘2_2’, ‘3_3’, ‘4_4’, ‘5_5’, ‘6_6’, ‘7_7’, ‘8_8’, ‘9_9’, ‘10_10’, ‘11_11’, ‘12_12’, ‘13_13’, ‘14_14’, ‘15_15’] 这也是对的

    同时 我将每一次循环时列表a的值 写入到空列表c中 比如第x次循环 就是把更改以后的列表a的值 写入到列表c的第x位
    第0次循环后 c[0]的值应该是[‘0_0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘10’, ‘11’, ‘12’, ‘13’, ‘14’, ‘15’] 这也是对的
    但是在第1次循环以后 c[0]的值就一直在变 变成了c[x]的值
    相当于把c_list[0]变成了c_list[1]…以此类推 最后得出的列表c的值也是每一项完全一样
    我不明白这是怎么回事
    我的c[0]只在第0次循环时被赋值了 但是后面它的值跟着在改变

    如图:
    在这里插入图片描述
    第一次老出bug 赋值以后 每次循环都改变c[0]的值 搞了半天都没搞出来
    无论是用appen函数添加 还是用二维数组定义 或者增加第三个空数组来过渡 都无法解决

    代码改进

    后来在我华科同学的指导下 突然想到赋值可以赋的是个地址 地址里面的值一直变化 导致赋值也一直变化 于是用第二张图的循环套循环深度复制实现了

    代码如下:

    # -*- coding: utf-8 -*-
    """
    Created on Fri Nov 19 19:47:01 2021
    
    @author: 16016
    """
    
    a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
    #print(len(a_list))
    #b_list = ['','','','','','','','','','','','','','','','']
    c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
    #for i in range(16):
    if len(a_list):
        for j in range(16):
            a_list[j]=str(a_list[j])+'_'+str(j)
            print("序号:",j)
            print('a_list:\n',a_list)
            
            
            for i in range(16):
                c_list[j].append(a_list[i])
            print('c_list[0]:\n',c_list[0])
            print('\n')
    #        b_list[j]=a_list[7],a_list[8]
    #        print(b_list[j])
            # 写入到Excel:
    print(c_list,'\n')    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    解决了问题

    在这里插入图片描述

    优化

    第三次是请教了老师 用copy函数来赋真值

    代码如下:

    # -*- coding: utf-8 -*-
    """
    Created on Fri Nov 19 19:47:01 2021
    
    @author: 16016
    """
    
    a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
    #print(len(a_list))
    #b_list = ['','','','','','','','','','','','','','','','']
    c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
    #for i in range(16):
    if len(a_list):
        for j in range(16):
            a_list[j]=str(a_list[j])+'_'+str(j)
            print("序号:",j)
            print('a_list:\n',a_list)
            
            
            c_list[j]=a_list.copy()
            print('c_list[0]:\n',c_list[0])
            print('\n')
    #        b_list[j]=a_list[7],a_list[8]
    #        print(b_list[j])
            # 写入到Excel:
    #print(c_list,'\n')    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    同样能解决问题
    在这里插入图片描述
    最后得出问题 就是指针惹的祸!

    a_list指向的是个地址 而不是值 a_list[i]指向的才是单个的值 copy()函数也是复制值而不是地址

    如果这个用C语言来写 就直观一些了 难怪C语言是基础 光学Python不学C 遇到这样的问题就解决不了

    C语言yyds Python是什么垃圾弱智语言

    总结

    由于Python无法单独定义一个值为指针或者独立的值 所以只能用列表来传送
    只要赋值是指向一个列表整体的 那么就是指向的一个指针内存地址 解决方法只有一个 那就是将每个值深度复制赋值(子列表内的元素提取出来重新依次连接) 或者用copy函数单独赋值

    如图测试:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    部分代码:

    # -*- coding: utf-8 -*-
    """
    Created on Sat Nov 20 16:45:48 2021
    
    @author: 16016
    """
    
    def text1():
        A=[1,2,3]
        B=[[],[],[]]
        for i in range(len(A)):
            A[i]=A[i]+i
            B[i]=A
            print(B)
    
    def text2():
        A=[1,2,3]
        B=[[],[],[]]
        
        A[0]=A[0]+0
        B[0]=A
        print(B)
        A[1]=A[1]+1
        B[1]=A
        print(B)
        A[2]=A[2]+2
        B[2]=A
        print(B)
        
    if __name__ == '__main__':
        text1()
        print('\n')
        text2()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    py打包

    Pyinstaller打包exe(包括打包资源文件 绝不出错版)

    依赖包及其对应的版本号

    PyQt5 5.10.1
    PyQt5-Qt5 5.15.2
    PyQt5-sip 12.9.0

    pyinstaller 4.5.1
    pyinstaller-hooks-contrib 2021.3

    Pyinstaller -F setup.py 打包exe

    Pyinstaller -F -w setup.py 不带控制台的打包

    Pyinstaller -F -i xx.ico setup.py 打包指定exe图标打包

    打包exe参数说明:

    -F:打包后只生成单个exe格式文件;

    -D:默认选项,创建一个目录,包含exe文件以及大量依赖文件;

    -c:默认选项,使用控制台(就是类似cmd的黑框);

    -w:不使用控制台;

    -p:添加搜索路径,让其找到对应的库;

    -i:改变生成程序的icon图标。

    如果要打包资源文件
    则需要对代码中的路径进行转换处理
    另外要注意的是 如果要打包资源文件 则py程序里面的路径要从./xxx/yy换成xxx/yy 并且进行路径转换
    但如果不打包资源文件的话 最好路径还是用作./xxx/yy 并且不进行路径转换

    def get_resource_path(relative_path):
        if hasattr(sys, '_MEIPASS'):
            return os.path.join(sys._MEIPASS, relative_path)
        return os.path.join(os.path.abspath("."), relative_path)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    而后再spec文件中的datas部分加入目录
    如:

    a = Analysis(['cxk.py'],
                 pathex=['D:\\Python Test\\cxk'],
                 binaries=[],
                 datas=[('root','root')],
                 hiddenimports=[],
                 hookspath=[],
                 hooksconfig={},
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher,
                 noarchive=False)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    而后直接Pyinstaller -F setup.spec即可

    如果打包的文件过大则更改spec文件中的excludes 把不需要的库写进去(但是已经在环境中安装了的)就行

    这些不要了的库在上一次编译时的shell里面输出
    比如:
    在这里插入图片描述

    在这里插入图片描述
    然后用pyinstaller --clean -F 某某.spec

  • 相关阅读:
    多态的定义 以及 虚函数重写(覆盖)
    IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven使用前准备
    Flink 源码解读系列 DataStream 时间服务管理器 TimeServiceManager 设计与实现
    【LCR 170. 交易逆序对的总数】
    软路由vs传统路由器ip:选择合适的网络设备
    Cesium 问题:获取高度值,高度值又是相对于谁来说的
    Java基础----多线程
    SQL 行列转换
    1393. 股票的资本损益
    Gartner发布2024年十大战略技术趋势
  • 原文地址:https://blog.csdn.net/weixin_53403301/article/details/134229175