view->config = Zend_Registry::get('config'); $this->db=Zend_Registry::get('db'); $this->dbh = new PDO("pgsql:dbname=qinghaihu;host=localhost", "gis", "gispassword" ); $auth = Zend_Auth::getInstance(); if($auth->hasIdentity()) { $user = $auth->getIdentity(); $this->uid = $user->id; }else{ $this->_redirect('/account/login?href=/data/visual'); } } function indexAction() { } /**************************************************************** 气象数据 *****************************************************************/ /* * getMeteorologyValueByStation 按站点查询变量 * * param int $sid 站点编号 * param string $field 变量类型 * * return array */ function getMeteorologyValueByStation($sid,$field) { $sql = "select id,station_id as sid,date,$field as v from daily_meteorological_data where station_id=$sid ORDER BY date ASC"; $sth = $this->dbh->prepare($sql); $sth->execute(); $temp = $sth->fetchAll(); $dataSet = array(); foreach ($temp as $k=>$v) { $dataSet[] = array(strtotime($v['date'])*1000,$v['v']); } unset($temp); return $dataSet; }// getMeteorologyValueByStation 按站点查询变量 /* * createMeteorologyDataSet 创建气象数据 * * param int $sid 站点id * param string $valuetype 请求变量类型 * param String $labe 单位 * param int $round 数据精确度(小数点后位数) * * return array */ function createMeteorologyDataSet($sid,$valuetype,$label,$round=1) { if(empty($label)) { $label=""; } $varField = array( 'temperature' => 'avg_air_temperature', //日平均气温 'windspeed' => 'avg_wind_speed', //日平均风速 'precipitation' => 'sum_precipitation', //日合计降水量 'sunshine' => 'sunshine_hours' //日照小时数 ); $data = array( "name"=>"站点:$sid", "data"=>$this->getMeteorologyValueByStation($sid,$varField[$valuetype]), "tooltip"=>array( "valueDecimals"=> $round, "valueSuffix"=> $label ) ); return $data; }// createMeteorologyDataSet 创建气象数据 /* * getMeteorologyDataByStationId 获得变量值 * * param string $valuetype 变量类型 * param string $label 单位 * param int $sid 可选,为空则查询所有站点 * param int $round 数值精确度,小数点后位数 * * return array */ function getMeteorologyDataByStationId($valuetype,$label,$sid=0,$round=1) { if(empty($sid)) { $sql = "select station_id as sid from daily_meteorological_data group by station_id"; $sth = $this->dbh->prepare($sql); $sth->execute(); $stations = $sth->fetchAll(); $data = array(); foreach ($stations as $v) { $data[] = $this->createMeteorologyDataSet($v['sid'],$valuetype,$label,$round); } return $data; } else { return $this->createMeteorologyDataSet($sid,$valuetype,$label,$round=1); } }//getMeteorologyDataByStationId 获得气象数据变量值 /********************************************************** 水文数据 ***********************************************************/ /* * getHydrologyValueByStation 按站点查询变量 * * param int $sid 站点编号 * param string $table 变量类型 * * return array */ function getHydrologyValueByStation($sid,$t) { $field = array(); //查询字段 $order = array(); if(is_array($t['time'])) { foreach ($t['time'] as $v) { $field[] = $v; $order[] = $v.' ASC'; } }else{ $field[] = $t['time']; $order[] = $t['time'].' ASC'; } $t['field'] .= " as v"; $field[] = $t['field']; $field[] = $t['sf']; $field = join(",",$field); //拼接 $order = join(',',$order); $sql = "select $field from {$t['table']} where {$t['sf']}='$sid' ORDER BY $order"; $sth = $this->dbh->prepare($sql); $sth->execute(); $temp = $sth->fetchAll(); $dataSet = array(); foreach ($temp as $k=>$v) { $time = 0; if(!empty($v['dt'])) { $time = strtotime($v['dt']); } if(!empty($v['yr']) && !empty($v['mth'])) { $time = strtotime($v['yr'].'-'.$v['mth'].'-'.'01 00:00:00'); } if(!empty($v['yr']) && empty($v['mth'])) { $time = strtotime($v['yr'].'-01-01 00:00:00'); } $dataSet[] = array($time*1000,$v['v']); } unset($temp); return $dataSet; }// getHydrologyValueByStation 按站点查询变量 /* * createHydrologyDataSet 创建水文数据 * * param int $sid 站点编号 * param string $valuetype 变量类型 * param string $label 单位 * param int $round 数值精确度,小数点后位数 * * return array */ function createHydrologyDataSet($sid,$valuetype,$label,$round){ if(empty($label)) { $label=''; } $varTable = array( "dp"=>array( "table"=>"hy_dp_c", //表名 "field"=>"p", //值字段 "sf"=>"stcd", //站点id字段 "time"=>array("dt") //时间字段,数组 ), //日降水量 "mtp"=>array( "table"=>"hy_mtp_e", "field"=>"p", "sf"=>"stcd", "time"=>array('yr','mth') ), //月降水量 "yrp"=>array( "table"=>"hy_yrp_f", "field"=>"p", "sf"=>"stcd", "time"=>array("yr") ), //年降水量 "dq"=>array( "table"=>"hy_dq_c", "field"=>"avq", "sf"=>"stcd", "time"=>array("dt") ), //日平均流量 "mtq"=>array( "table"=>"hy_mtq_e", "field"=>"avq", "sf"=>"stcd", "time"=>array('yr','mth') ), //月平均流量 "yrq"=>array( "table"=>"hy_yrq_f", "field"=>"avq", "sf"=>"stcd", "time"=>array('yr') ) //年平均流量 );//$varTable $data = array( "name"=>"站点:$sid", "data"=>$this->getHydrologyValueByStation($sid,$varTable[$valuetype]), "tooltip"=>array( "valueDecimals"=> $round, "valueSuffix"=> $label ) ); return $data; }//createHydrologyDataSet 创建水文数据 /* * getHydrologyDataByStationId 获得水文数据变量值 * * param string $valuetype 变量类型 * param string $label 单位 * param int $sid 站点编号,默认为空,空值将列出所有站点变量值 * param int $round 数值精确度,小数点后位数 * * return array */ function getHydrologyDataByStationId($valuetype,$label,$sid=0,$round=1){ if(empty($sid)) { //降水 $p = array('dp','mtp','yrp'); $q = array('dq','mtq','yrq'); if(in_array($valuetype,$p)) { $sql = "select stcd from hy_dp_c group by stcd"; } if(in_array($valuetype,$q)) { $sql = "select stcd from hy_dq_c group by stcd"; } $sth = $this->dbh->prepare($sql); $sth->execute(); $stations = $sth->fetchAll(); $data = array(); foreach ($stations as $v) { $data[] = $this->createHydrologyDataSet($v['stcd'],$valuetype,$label,$round); } return $data; }//所有站点 if(is_array($sid)) { foreach($sid as $v) { } }//多个指定站点 else { }//单个站点 } //getHydrologyDataByStationId() 获得水文数据变量值 /**************************** 环境监测数据 *****************************/ /* * createAmbientDataSet 创建环境监测数据 * * param int $sid 站点编号、名称 * param string $valuetype 变量类型 * param string $label 单位 * param int $round 数值精确度,小数点后位数 * * return array */ function createAmbientDataSet($sid,$valuetype,$label,$round=4){ if(empty($label)) { $label=''; } $data = array( "name"=>"站点:$sid", "data"=>$this->getAmbientValueByStation($sid,$valuetype), "tooltip"=>array( "valueDecimals"=> $round, "valueSuffix"=> $label ) ); return $data; }//createAmbientDataSet 创建环境监测数据的数据 /* * getAmbientValueByStation 按站点查询变量 * * param int $sid 站点编号 * param string $table 变量类型 * * return array */ function getAmbientValueByStation($sid,$t) { $field = array(); //查询字段 $field[] = 'id'; $field[] = '"position"'; $field[] = 'dt'; $field[] = $t.' as v'; $field = join(",",$field); //拼接 $sql = "select $field from ambient_air where \"position\"='$sid' ORDER BY dt ASC"; $sth = $this->dbh->prepare($sql); $sth->execute(); $temp = $sth->fetchAll(); $dataSet = array(); foreach ($temp as $k=>$v) { $time = 0; if(!empty($v['dt'])) { $time = strtotime($v['dt']); } if(!empty($v['yr']) && !empty($v['mth'])) { $time = strtotime($v['yr'].'-'.$v['mth'].'-'.'01 00:00:00'); } if(!empty($v['yr']) && empty($v['mth'])) { $time = strtotime($v['yr'].'-01-01 00:00:00'); } $dataSet[] = array($time*1000,$v['v']); } unset($temp); return $dataSet; }// getAmbientValueByStation 按站点查询变量 /* * getAmbientDataByStationId 获得环境监测数据变量 * * param string $valuetype 变量类型 * param string $label 单位 * param int $sid 站点编号,默认为空,空值将列出所有站点变量值 * param int $round 数值精确度,小数点后位数 * * return array */ function getAmbientDataByStationId($valuetype,$label,$sid=0,$round=4){ if(empty($sid)) { //降水 $p = array('tsp','pm10','so2','no2'); if(in_array($valuetype,$p)) { $sql = "select \"position\" from ambient_air group by \"position\""; } $sth = $this->dbh->prepare($sql); $sth->execute(); $stations = $sth->fetchAll(); $data = array(); foreach ($stations as $v) { $data[] = $this->createAmbientDataSet($v['position'],$valuetype,$label,$round); } return $data; }//所有站点 if(is_array($sid)) { }//多个指定站点 else { }//单个站点 } //getAmbientDataByStationId() 获得环境监测数据变量的值 //******************************************************** /* * dataAction() ajax获取数据 * * param string $ac //请求的数据类型 * param string $dt //请求的数据来源(气象,水文) * * return view */ function dataAction() { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $ac = $this->_request->getParam('ac'); $base = $this->_request->getParam('dt'); if(!in_array($base,array('meteorology','hydrology','ambient'))) { $data = array( "error"=>"参数错误" ); $this->jsonexit($data); return true; } $datas = array(); $label = ""; $title = ""; $range = 0; $type = "line"; if($base == "meteorology") { if($ac=='temperature') { $title = "日平均温度"; $label = "℃"; $type = "line"; $datas = $this->getMeteorologyDataByStationId($ac,$label); }//日平均温度 if($ac == 'windspeed') { $title = "日平均风速"; $label = "m/s"; $type = "line"; $datas = $this->getMeteorologyDataByStationId($ac,$label); }//日平均风速 m/s if($ac == 'precipitation') { $title = "日合计降水量"; $label = "mm"; $type = "line"; $datas = $this->getMeteorologyDataByStationId($ac,$label); }//日合计降水量 mm if($ac == 'sunshine') { $title = "日照小时数"; $label = "h"; $type = "line"; $datas = $this->getMeteorologyDataByStationId($ac,$label); }//日照小时数 h }//气象数据 if($base == 'hydrology') { if($ac == 'dp') { $title = "日降水量"; $label = "mm"; $type = "line"; $datas = $this->getHydrologyDataByStationId($ac,$label); }//日降水量 if($ac == 'mtp') { $title = "月均降水"; $label = "mm"; $type = "line"; $datas = $this->getHydrologyDataByStationId($ac,$label); }//月均降水 if($ac == 'yrp') { $title = "年均降水"; $label = "mm"; $type = "line"; $datas = $this->getHydrologyDataByStationId($ac,$label); }//年均降水 if($ac == 'dq') { $title = "日均流量"; $label = "mm"; $type = "line"; $datas = $this->getHydrologyDataByStationId($ac,$label); } if($ac == 'mtq') { $title = "月均流量"; $label = "mm"; $type = "line"; $datas = $this->getHydrologyDataByStationId($ac,$label); } if($ac == 'yrq') { $title = "年均流量"; $label = "mm"; $type = "line"; $datas = $this->getHydrologyDataByStationId($ac,$label); } }//水文数据 if($base=="ambient") { if($ac=='tsp') { $title = "总悬浮颗粒物"; $label=""; $type = "column"; $range = 6; $datas = $this->getAmbientDataByStationId($ac,$label); } if($ac=='pm10') { $title = "可吸入颗粒物"; $label=""; $type = "column"; $range = 6; $datas = $this->getAmbientDataByStationId($ac,$label); } if($ac=='so2') { $title = "二氧化硫"; $label=""; $type = "column"; $range = 6; $datas = $this->getAmbientDataByStationId($ac,$label); } if($ac=='no2') { $title = "二氧化氮"; $label=""; $type = "column"; $range = 6; $datas = $this->getAmbientDataByStationId($ac,$label); } }//环境监测数据 if(empty($range)) { $range = 0; } $data = array( "label"=>$label, "title"=>$title, "type"=>$type, "range"=>$range, "datas"=>$datas ); $this->jsonexit($data); return true; }//dataAction() Ajax获取数据 function utcMsTime($time=''){ if(empty($time)) return (time()+8*3600)*1000; else return $time*1000; } /* * jsonexit() 退出并返回json数据 * * param array $data 要返回的JSON数据,可以是任意数组 * * return application/JSON */ public function jsonexit($data){ $this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(json_encode($data,JSON_NUMERIC_CHECK)); return true; }//jsonexit() 退出并返回json数据 } /* 数据模型 "data"=>array( //第一条曲线 "data1"=>array( "title"=>"5米风速", "unit"=>"m/s", "sensor"=>"传感器XXX", "sensor_type"=>"传感器类型", "datas"=>array( array($this->utcMsTime(),26.0), array($this->utcMsTime()+3600*1000,28.1), array($this->utcMsTime()+7200*1000,30.9), array($this->utcMsTime()+10800*1000,32.0), array($this->utcMsTime()+12800*1000,28.0), array($this->utcMsTime()+13800*1000,22.0) ) ), //第二条曲线 "data2"=>array( "title"=>"10米风速", "unit"=>"m/s", "sensor"=>"传感器XXX", "sensor_type"=>"传感器类型", "datas"=>array( array($this->utcMsTime(),26.0), array($this->utcMsTime()+5600*1000,22.1), array($this->utcMsTime()+8200*1000,35.9), array($this->utcMsTime()+11800*1000,32.0), array($this->utcMsTime()+13900*1000,22.0), array($this->utcMsTime()+16800*1000,21.0) ) ), //第三条....... ) */