diff --git a/application/default/controllers/ServiceController.php b/application/default/controllers/ServiceController.php
new file mode 100644
index 00000000..203c5d6b
--- /dev/null
+++ b/application/default/controllers/ServiceController.php
@@ -0,0 +1,429 @@
+_helper->viewRenderer->setNoRender();
+ $this->_helper->layout->disableLayout();
+ }
+
+ function preDispatch()
+ {
+ $this->db=Zend_Registry::get('db');
+ $this->view->config = Zend_Registry::get('config');
+ $this->messenger=$this->_helper->getHelper('FlashMessenger');
+ $this->view->messages = $this->messenger->getMessages();
+ }
+
+ /*
+ * 返回XML源文件
+ */
+ function xmlAction()
+ {
+ $uuid=$this->_request->getParam('uuid');
+ $row=$this->db->fetchRow("select xml.data from xml left join metadata on xml.id=metadata.id where metadata.uuid=?",array($uuid));
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ $this->getResponse()->setHeader('Content-Type', 'text/xml')
+ ->setBody($row['data']);
+ }
+ /*
+ * 查看数据缩略图
+ */
+ function thumbAction()
+ {
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ $uuid = $this->_request->getParam('uuid');
+ $thumb=$this->db->fetchRow("select t.data,t.filetype from thumbnail t left join metadata m on t.id=m.id where m.uuid=?",array($uuid));
+ if (empty($thumb)) {
+ header("Content-Type:image/png");
+ header("Content-Length: " . filesize("images/nothumb.png"));
+ $file=fopen("images/nothumb.png",'r');
+ fpassthru($file);
+ } else {
+ header("Content-Type:image/".$thumb['filetype']);
+ print base64_decode($thumb['data']);
+ }
+ }
+
+ /*
+ * 高级搜索, no page, json output
+ */
+ function searchAction()
+ {
+ $this->view->addHelperPath('helper','Zend_View_Helper_');
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ //$page=(int)$this->_request->getParam('page');
+ //if (empty($page)) $page=1;
+ //$offset=$this->limit*($page-1);
+ $key=$this->_request->getParam('q');
+ $n=(int)$this->_request->getParam('n');
+ $s=(int)$this->_request->getParam('s');
+ $e=(int)$this->_request->getParam('e');
+ $w=(int)$this->_request->getParam('w');
+ if (!(empty($n) && empty($key))) {
+ if (empty($n)) $n=90;
+ if (empty($s)) $s=-90;
+ if (empty($e)) $e=180;
+ if (empty($w)) $w=-180;
+ //$start=$this->_request->getParam('start');
+ //$end=$this->_request->getParam('end');
+ $sql="select id,uuid,description,filesize,fileformat from metadata where east and west>? and north and south>?";
+ if (!empty($key)) {
+ $sql.= " and (title ilike ? or description ilike ?)";
+ $sql.= " order by title";
+ $rows=$this->db->fetchAll($sql,array($e,$w,$n,$s,'%'.$key.'%','%'.$key.'%'));
+ } else {
+ $sql.= " order by title";
+ $rows=$this->db->fetchAll($sql,array($e,$w,$n,$s));
+ }
+ $this->_helper->json($rows);
+ }
+ }
+
+ /*
+ * 数据浏览
+ */
+ function browseAction()
+ {
+ $md=new MetadataTable();
+ $db=$md->getAdapter();
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $limit=10;
+ $offset=$limit*($page-1);
+ $state=$db->query('select count(*) from metadata');
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $select=$db->select();
+ $select->from('metadata','*')->order('title')->limitPage($page,$limit);
+ $this->view->metadata = $db->fetchAll($select);
+ $this->view->page=new Pagination($sum,$page,$limit);
+ }
+
+
+ /*
+ * 产生geojson数据
+ */
+ function jsonAction()
+ {
+ $md=new MetadataTable();
+ $db=$md->getAdapter();
+ $id = (int)$this->_request->getParam('id');
+ $where='';
+ if (!empty($id)) { $where=' where id='.$id; }
+ $sql='select id,uuid,west,south,north,east,title from metadata'.$where;
+ $state=$db->query($sql);
+ $rows=$state->fetchAll();
+ $geomd=new GeoMetaData();
+ foreach($rows as $row){
+ if ($id)
+ $box=new GeoBox($row['west'],$row['south'],$row['east'],$row['north']);
+ else
+ $box=new GeoBoxLine($row['west'],$row['south'],$row['east'],$row['north']);
+ $feature=new Geofeature();
+ $feature->id=$row['id'];
+ $feature->addProperties('title',$row['title']);
+ $feature->addProperties('uuid',$row['uuid']);
+ $feature->addProperties('id',$row['id']);
+ $feature->geometry=$box;
+ $geomd->addFeature($feature);
+ }
+ $this->_helper->json($geomd);
+ }
+ /*
+ * 时空动态浏览
+ */
+ function timemapAction()
+ {
+ $sql='select id,uuid,west,south,north,east,title,timebegin,timeend from metadata where timebegin is not null';
+ $this->view->rows=$this->db->fetchAll($sql);
+ }
+
+ function detailAction()
+ {
+ $id=(int)$this->_request->getParam('id');
+ $xml=new XmlTable();
+ $db=$xml->getAdapter();
+ $where=$db->quoteInto('id=?',$id);
+ $order='id desc';
+ $row=$xml->fetchRow($where,$order);
+ // Load the XML source
+ $xml = new DOMDocument;
+ $xml->loadXML($row->data);
+ $xsl = new DOMDocument;
+ $xsl->load($this->view->config->westdc->xsl);
+ // Configure the transformer
+ $proc = new XSLTProcessor;
+ $proc->importStyleSheet($xsl); // attach the xsl rules
+ $this->view->xml=$proc->transformToXML($xml);
+ //$this->_helper->layout->disableLayout();
+ //$this->_helper->viewRenderer->setNoRender();
+ //$this->getResponse()->setHeader('Content-Type', 'text/html')
+ // ->setBody($proc->transformToXML($xml));
+ }
+ function feedAction()
+ {
+ $feedArray = array(
+ 'title' => '中国西部环境与生态科学数据中心',
+ 'link' => 'http://'.$_SERVER['SERVER_NAME'].'/data/feed',
+ 'description' => '共享西部计划产生的数据',
+ 'language' => 'zh-CN',
+ 'charset' => 'utf-8',
+ 'published' => time(),
+ //'generator' => 'Zend Framework Zend_Feed',
+ 'entries' => array()
+ );
+ $sql="select * from metadata order by ts_created desc";
+ $rs=$this->db->fetchAll($sql);
+ $feedArray['published']=strtotime($rs[0]['ts_created']);
+ foreach($rs as $r)
+ {
+ $feedArray['entries'][] = array(
+ 'title' => $r['title'],
+ 'link' => 'http://'.$_SERVER['SERVER_NAME'].'/data/' . $r['uuid'],
+ 'guid' => 'http://'.$_SERVER['SERVER_NAME'].'/data/' . $r['uuid'],
+ //'content'=>$r['description'],
+ 'description' => $r['description'],
+ 'lastUpdate' => strtotime($r['ts_created'])
+ );
+ }
+ $feed = Zend_Feed::importArray($feedArray,'rss');
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ $feed->send();
+ }
+
+ public function pingbackAction()
+ {
+ $this->_helper->ViewRenderer->setNoRender();
+ $this->_helper->layout->disableLayout();
+ $server = new Zend_XmlRpc_Server();
+ $server->setClass('PingbackRpc', 'pingback');
+ echo $server->handle();
+ }
+
+ public function pingtestAction()
+ {
+ $this->_helper->ViewRenderer->setNoRender();
+ $this->_helper->layout->disableLayout();
+ $client = new Zend_XmlRpc_Client('http://test.westgis.ac.cn/data/pingback');
+ $arg1 = 'http://wlx.westgis.ac.cn/567/';
+ $arg2 = 'http://test.westgis.ac.cn/data/487591d0-d437-4114-b810-cbef7c4ee4b2';
+ //$result = $client->call('pingback.ping', array($arg1, $arg2));
+ $test = $client->getProxy('pingback');
+ $test->ping($arg1,$arg2);
+ //var_dump($result);
+ }
+ public function outputAction()
+ {
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ $sql="select title,datatype,filesize,id from metadata";
+ $md=$this->db->fetchAll($sql);
+ foreach($md as $m)
+ {
+ print $m["title"].",";
+ print ($m["datatype"]?"内部":"公开").",";
+ print ($m["filesize"]==1?" ":$m["filesize"]).",";
+ $sql1="select keyword from keyword where id=".$m["id"]." and keytype='place'";
+ $kd=$this->db->fetchAll($sql1);
+ foreach ($kd as $p) print $p["keyword"]." ";
+ print ",";
+ $sql1="select keyword from keyword where id=".$m["id"]." and keytype='temporal'";
+ $kd=$this->db->fetchAll($sql1);
+ foreach ($kd as $p) print $p["keyword"]." ";
+ print ",";
+ print "
";
+ }
+
+ }
+
+ /**
+ * parse the wiki syntax used to render tables, code modified from mediawiki
+ *
+ * @private
+ */
+ function parseTable ( $text ) {
+ $lines = explode ( "\n" , $text );
+ $td_history = array (); // Is currently a td tag open?
+ $last_tag_history = array (); // Save history of last lag activated (td, th or caption)
+ $tr_history = array (); // Is currently a tr tag open?
+ $tr_attributes = array (); // history of tr attributes
+ $has_opened_tr = array(); // Did this table open a