爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 97712|回复: 40

[参考资料] CIMISS接口之Python:支持任意版本ICE,Python3.x

[复制链接]

新浪微博达人勋

发表于 2020-4-3 12:46:15 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 scmeiqy 于 2020-4-3 16:51 编辑

CIMISS接口之Python:支持任意版本ICE,Python3.x
疫情期间,为了完成上级交待的工作:关于CIMISS数据获取方法,给同事们作个培训。
经调查,几乎都只会使用windows平台下的fortran,而Cimiss文档中没有基于windows平台的fortran接口;查询ICE文档,也没有见到。
征询大家意见,说是部分人会python,好吧,python!
开工,才发现官网那个python接口文档,实在………………
经实验,按照官网那个python接口文档,如果你在环境ICE3.4.2、python2.7.17、Windows10_X64下,能实验成功的话,算你人品好————超级好!!!
当然,最后我成功了————但是我把visual studio 2008请出来,专门在Windows7_x64下,把ICE3.4.2的部分库基于其源码重编译了一遍,替换到Windows10_X64下。

工作不止步于此,通过读ZeroC ICE官方文档,有所发现,共享于广大家园朋友,所以才有了此发布。
很简单,很简单,很简单……重要的事说三遍:
1、库只需三个文件(全在cimiss_python.7z中):
一个配置文件,一个ice文件,一个接口包装文件。
2、说明一点:现在的库,我改变了接口包装文件的位置(改变的理由:我把cimiss的java接口,也使用ICE3.7.3、java8环境,全部重新实现了,也改变了接口包装文件的位置,两者统一了):
原位置:cma.cimiss.DataQueryClient
新位置:sc.mqy.client.DataQueryClient

下面是demo代码:
# coding=utf8
'''
Created on 2017/08/25
@author: zhangxin
Modified on 2020/04/01
@author: scmeiqy
'''
import datetime
import sys
import Ice
from sc.mqy.client.DataQueryClient import DataQuery
if __name__ == '__main__':
    # 定义client对象,指定数据服务ip和port
    # client = DataQuery(serverIp="10.96.89.55", serverPort=1888)
    # 定义client对象,默认使用client.config指定服务连接配置,需根据自己的地址进行修改
    client = DataQuery()
    # 用户名和密码
    userName = "userName"
    password = "password"
    # 接口ID
    interfaceId = "getSurfEleInRegionByTime"
    # 当前时间减一天
    now_time = (datetime.datetime.now() - datetime.timedelta(hours=8)).strftime('%Y%m%d%H') + "0000"
    print('now_time:', now_time)
    # 接口参数
    params = {'dataCode': "SURF_CHN_MUL_HOR_N",
              'elements': "Station_ID_C,PRE_12h",
              'times': now_time,
              'adminCodes': "230100",
              'orderby': "Station_ID_C:ASC",
              'limitCnt': "100000"}
    retArray2D = ""
    # 调用接口
    # 1.获取数据返回结构体/类
    # retArray2D = client.callAPI_to_array2D(userName, password, interfaceId, params)
    # 2.获取数据返回序列化字符串
    # dataFormat 序列化的数据格式,可取:xml、json、csv、text、spaceText、commaText、tabText等。
    #            其中,spaceText、commaText、tabText表示保存为文本,记录间换行,要素值间分别用空格、逗号和TAB分割;text同spaceText。
    # retArray2D = client.callAPI_to_serializedStr(userName, password, interfaceId, params, dataFormat="csv")
    # 3.获取数据写入本地文件
    # dataFormat 序列化的数据格式,可取:xml、json、csv、text、spaceText、commaText、tabText等。
    #            其中,spaceText、commaText、tabText表示保存为文本,记录间换行,要素值间分别用空格、逗号和TAB分割;text同spaceText。
    # savePath 保持的本地文件路径(全路径,含文件名)
    # 保存文件的路径及文件名
    _saveDir_ = '.\data'
    # 一种字符串拼接方法
    _saveFile_ = '%s.txt' % now_time
    # 又一种字符串拼接方法
    _savePath_ = _saveDir_ + _saveFile_
    print('savePath:', _savePath_)
    result = client.callAPI_to_saveAsFile(userName, password, interfaceId, params, dataFormat='csv', savePath=_savePath_)
    # 输出结果预览
    print(result)
    result = client.callAPI_to_saveAsFile(userName,password, "getSurfEleByTime",\
                                    {'dataCode':"SURF_CHN_MUL_HOR",\
                                     'elements':"Station_ID_C,PRE_1h,PRS,RHU,VIS,WIN_S_Avg_2mi,WIN_D_Avg_2mi,Q_PRS",\
                                     'times':"20141224000000",\
                                     'orderby': "Station_ID_C:ASC",\
                                     'limitCnt': "20000" },'json','20200401data.txt')
    print(result)
    # 销毁client对象
    client.destroy()
   
    #print(client.getStatus())
    print(Ice.stringVersion())
    sys.exit(client.getStatus())

可以只下载cimiss_python.7z文件。用这里的张贴代码测试即可————cimiss_python_demo.7z只包含demo.py一个文件。

cimiss_python_demo.7z (1.4 KB, 下载次数: 141)

评分

参与人数 1金钱 +20 贡献 +10 收起 理由
mofangbao + 20 + 10

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2020-4-3 12:58:30 | 显示全部楼层
本帖最后由 scmeiqy 于 2021-1-9 12:38 编辑

demo.py文件,必须放在库包的根目录下执行————如果你会配置python调用库路径,则不受此限!!!

鉴于许多人问如何配置目录结构的问题,下面放两张图,按照图配置,就没问题了。
目录结构_1.JPG
目录结构_2.JPG

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-4-3 13:04:57 | 显示全部楼层
再说明:
我的测试环境:
ICE3.7.3+python3.6/python3.7/python3.8

python安装ICE
pip install zeroc-ice


如果,你使用出错,你看看库包的产生日期,04/01,所以应该一笑了之。或者再埋头苦干:)
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-3 13:30:57 | 显示全部楼层
这个非常nice!以前也想做这个,奈何水平有限。感谢分享!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-8 14:51:19 | 显示全部楼层
感谢分享。
以前用python2.7调用,总是不行,后来下载了python26,安装ice的过程总是各种周折,后来转到python3,但数据源又不行了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-4-8 15:43:03 | 显示全部楼层
本帖最后由 scmeiqy 于 2020-4-8 17:24 编辑
平流层的萝卜 发表于 2020-4-8 14:51
感谢分享。
以前用python2.7调用,总是不行,后来下载了python26,安装ice的过程总是各种周折,后来转到py ...

这里共享的是:动态方式。这种方式对大多数人来说,最简单——对ICE版本无依赖。

如果考虑程序性能,还有一种方式:静态方式。性能很优,但对ICE版本有依赖,所以就没有发布了。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-9 17:34:42 | 显示全部楼层
还有一种方式,通过调用CIMISS的WEB接口,其实就是相当于爬虫来获取资料,其实我觉得这种方式最简单,不需要ICE库,而且现在爬虫技术也非常简单了。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-4-9 17:41:57 | 显示全部楼层
本帖最后由 scmeiqy 于 2020-4-9 17:43 编辑
解脱 发表于 2020-4-9 17:34
还有一种方式,通过调用CIMISS的WEB接口,其实就是相当于爬虫来获取资料,其实我觉得这种方式最简单,不需 ...

嗯,用爬虫技术,只要浏览器页面能显示的,都能分析出其中自己需要的部分。

但,这里所指接口——sock,存在的价值:大数据量!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-10 11:18:21 | 显示全部楼层
scmeiqy 发表于 2020-4-9 17:41
嗯,用爬虫技术,只要浏览器页面能显示的,都能分析出其中自己需要的部分。

但,这里所指接口——sock ...

我18年的时候取CIMISS资料,发现资料行数超过1000行的时候,就会报错,不知道现在怎么样啦。
后来我用CIMISS的WEB接口取资料,发现差不多,数据行数不能太大,后来就通过WEB接口获取资料。
不知道你说的大数据量是多大,有没有测试过,或者可能是各省CIMISS配置的策略不同。
我是安徽的。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-4-10 11:30:33 | 显示全部楼层
解脱 发表于 2020-4-10 11:18
我18年的时候取CIMISS资料,发现资料行数超过1000行的时候,就会报错,不知道现在怎么样啦。
后来我用CI ...

科研,经常要的是几十年资料!
比如:51-2014年,某几个要素、某几个区域,你用WEB接口去提一次,就知道这个接口的价值及意义了。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表