地球観測データ取得-JaxaAPI Pythonスケッチ @wtoy.net 2015/5/24
#/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
import urllib2
import json
import getopt
#####################################################################
# jaxaの公開データ取得:
#
# jaxaAPIを使用するには、jaxaからAPI利用トークンを取得してください
# 以下のサイトから取得できます
#
# http://www.satnavi.jaxa.jp/jaxa_api_competition/
#
#--------------------------------------------------------------------
# jaxaAPI のAPI利用トークン
#
apikey = "xxxxx_xxxx_"
#####################################################################
# 2012-05-18 打ち上げ:データは 2012-08-01〜前日
#
# https://joa.epi.bz/api/<物理量指定文字列>+ 'all' | 'avg'
#
# 物理量指定文字列 = prc,sst,ssw,smc,snd
# +-- 数値例
# | +-- 単位
# prc=日降水量 1.500[mm/day]
# sst=海面水温 23.840[℃]
# ssw=海面風速 10.94[m/s]
# smc=土壌水分量 40.800[%]
# snd=積雪深 26.400[cm]
#############################################################
# jaxaAPIをコール:json形式でデータを取得する
#
def get_jaxaAPIjson(kind='prc',t_str='all',dat='2012-08-01',lat='35.7',lon='139.7',range='0.1'):
apiType = kind + t_str
jaxa_url = 'https://joa.epi.bz/api/' + apiType + '?token='+apikey+'&date='+dat+'&lat='+lat+'&lon='+lon+'&range='+range+'&format=JSON'
print jaxa_url
try:
#- リクエストヘッダーを付加して呼ぶ
#req = urllib2.Request(jaxa_url)
#req.add_header('Referer', 'http://www.python.org/')
#req.add_header('User-Agent', 'Mozilla/5.0')
#r = urllib2.urlopen(req)
###################################
# 取得
r = urllib2.urlopen(jaxa_url)
#-
row = r.read()
#print 'row:',row
r.close()
jsonunits = row.split(os.linesep)
#print jsonunits
res = ""
for unit in jsonunits:
if not unit:
contine
obj = json.loads(unit)
#print 'obj:',obj
#
# result='ok'でデータ有
rtc = obj['result']
print 'result',rtc
################################
# 平均値 : -t avg の時
if t_str == 'avg':
for v in obj[kind]:
print kind, v
else:
# 指定範囲全データ取得:メッシュデータ
vals = obj['values']
#print vals
for v in vals:
print 'lat:',v['lat'],'lon:',v['lon'],kind+':',v[kind]
##############################################################
# エラー
except urllib2.HTTPError, e:
print e.code,e.reason
#
e_dic = e.read()
if e.code != 404:
print e_dic
#########################
#for k,v in e_dic.items():
# print k,v
#
#########################################
#
if __name__ == '__main__':
#
# 起動パラメータの説明
#
#(1)物理量指定
# -k prc|sst|ssw|smc|snd
# prc = 日降水量 1.500[mm/day] ok
# sst = 海面水温 23.840[度] errになる(データなし)
# ssw = 海面風速 10.94[m/s] ok
# smc = 土壌水分量 40.800[%] errになる(データなし)
# snd = 積雪深 errになる
#
#(2)日付指定
# -d YYYY-MM-DD
#
#(3)緯度指定
# -n 30.0
#
#(4)経度指定
# -e 130.0
#
#(5)レンジ指定
# -r 0.1
#
#(6)取得方法
# -t all | avg
# all = 指定レンジのメッシュデータ
# avg = allデータの平均値
##############################################################
# 起動パラメータ処理
g_options, g_args = getopt.getopt(sys.argv[1:],'k:d:e:n:r:t:')
g_option_d = dict(g_options) # 辞書化
#################################
# 標準パラメータのセット
#
d_str = '2012-08-01'
lat = '35.7'
lon = '139.7'
range = '0.1'
kind = 'prc'
t_str = 'all'
#
# 起動パラメータを反映
#
if g_option_d.has_key('-k'):
kind = g_option_d['-k']
if g_option_d.has_key('-d'):
d_str = g_option_d['-d']
if g_option_d.has_key('-e'):
lat = g_option_d['-e']
if g_option_d.has_key('-n'):
lon = g_option_d['-n']
if g_option_d.has_key('-r'):
range = g_option_d['-r']
if g_option_d.has_key('-t'):
t_str = g_option_d['-t']
#
get_jaxaAPIjson(kind=kind,t_str=t_str,dat=d_str,lat=lat,lon=lon,range=range)
#