2011年08月04日 星期四

Google Map Logs

new LOD(0, 156543.033928, 591657527.591555), new LOD(1, 78271.5169639999, 295828763.795777), new LOD(2, 39135.7584820001, 147914381.897889), new LOD(3, 19567.8792409999, 73957190.948944),new LOD(4, 9783.93962049996, 36978595.474472), new LOD(5, 4891.96981024998, 18489297.737236), new LOD(6, 2445.98490512499, 9244648.868618), new LOD(7, 1222.99245256249, 4622324.434309), new LOD(8, 611.49622628138, 2311162.217155), new LOD(9, 305.748113140558, 1155581.108577), new LOD(10, 152.874056570411, 577790.554289), new LOD(11, 76.4370282850732, 288895.277144), new LOD(12, 38.2185141425366, 144447.638572), new LOD(13, 19.1092570712683, 72223.819286), new LOD(14, 9.55462853563415, 36111.909643), new LOD(15, 4.77731426794937, 18055.954822), new LOD(16, 2.38865713397468, 9027.977411), new LOD(17, 1.19432856685505, 4513.988705), new LOD(18, 0.597164283559817, 2256.994353), new LOD(19, 0.298582141647617, 1128.497176)
  

2011年08月10日 星期三

Flex DataGird导出到excel

/**
 * Simple script to convert a Datagrid to a HTML table and then 
 * pass it on to an external excel exporter
 *
 */    

//Libs that are mostly used 
//(only a number are necessary for the datagrid conversion and export)
import flash.errors.*;
import flash.events.*;
import flash.external.*;
import flash.net.URLRequest;
import flash.net.URLVariables;

/**
 * Convert the datagrid to a html table
 * Styling etc. can be done externally
 * 
 * @param: dg Datagrid Contains the datagrid that needs to be converted
 * @returns: String
 */
private function convertDGToHTMLTable(dg:DataGrid):String {
    //Set default values
    var font:String = dg.getStyle('fontFamily');
    var size:String = dg.getStyle('fontSize');
    var str:String = '';
    var colors:String = '';
    var style:String = 'style="font-family:'+font+';font-size:'+size+'pt;"';                
    var hcolor:Array;
    
    //Retrieve the headercolor
    if(dg.getStyle("headerColor") != undefined) {
        hcolor = [dg.getStyle("headerColor")];
    } else {
        hcolor = dg.getStyle("headerColors");
    }                
    
    //Set the htmltabel based upon knowlegde from the datagrid
    str+= '<table width="'+dg.width+'" border="1"><thead><tr width="'+dg.width+'" style="background-color:#' +Number((hcolor[0])).toString(16)+'">';
    
    //Set the tableheader data (retrieves information from the datagrid header                
    for(var i:int = 0;i<dg.columns.length;i++) {
        colors = dg.getStyle("themeColor");
            
        if(dg.columns[i].headerText != undefined) {
            str+="<th "+style+">"+dg.columns[i].headerText+"</th>";
        } else {
            str+= "<th "+style+">"+dg.columns[i].dataField+"</th>";
        }
    }
    str += "</tr></thead><tbody>";
    colors = dg.getStyle("alternatingItemColors");
    
    //Loop through the records in the dataprovider and 
    //insert the column information into the table
    for(var j:int =0;j<dg.dataProvider.length;j++) {                    
        str+="<tr width=\""+Math.ceil(dg.width)+"\">";
            
        for(var k:int=0; k < dg.columns.length; k++) {
            
            //Do we still have a valid item?                        
            if(dg.dataProvider.getItemAt(j) != undefined && dg.dataProvider.getItemAt(j) != null) {
                
                //Check to see if the user specified a labelfunction which we must
                //use instead of the dataField
                if(dg.columns[k].labelFunction != undefined) {
                    str += "<td width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+dg.columns[k].labelFunction(dg.dataProvider.getItemAt(j),dg.columns[k].dataField)+"</td>";
                    
                } else {
                    //Our dataprovider contains the real data
                    //We need the column information (dataField)
                    //to specify which key to use.
                    str += "<td width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+dg.dataProvider.getItemAt(j)[dg.columns[k].dataField]+"</td>";
                }
            }
        }
        str += "</tr>";
    }
    str+="</tbody></table>";

    return str;
}

/**
 * Load a specific datagrid into Excel
 * This method passes the htmltable string to an backend script which then
 * offers the excel download to the user.
 * The reason for not using a copy to clipboard and then javascript to
 * insert it into Excel is that this mostly will fail because of the user
 * setup (Webbrowser configuration).
 * 
 * @params: dg Datagrid The Datagrid that will be loaded into Excel
 * @params: url String The location of the excel export file
 */
private function loadDGInExcel(dg:DataGrid,url:String):void {

    //Pass the htmltable in a variable so that it can be delivered
    //to the backend script
    var variables:URLVariables = new URLVariables(); 
    variables.htmltable    = convertDGToHTMLTable(dg);
    
    //Setup a new request and make sure that we are 
    //sending the data through a post
    var u:URLRequest = new URLRequest(url);
    u.data = variables; //Pass the variables
    u.method = URLRequestMethod.POST; //Don't forget that we need to send as POST
    
    //Navigate to the script
    //We can use _self here, since the script will through a filedownload header
    //which results in offering a download to the user (and still remaining in you Flex app.)
    navigateToURL(u,"_self");
}       
  

2011年12月07日 星期三

项目难做,项目奖金分配其实也难做,避免项目奖金产生地震

  老板估计没办法了,把每个项目搞的都特烂(1、初期的开发人员做一半人走了。2、工期紧张。3、客户关系恶化(已经发警告函了)),许多项目等着验收,但是没有项目组敢接了。俗话书,重赏之下必有勇夫,老板在项目组接项目的时候,就承诺给予项目奖金。这不,我们项目组经 过8个月的现场开发,终于完美的验收了项目。老板也为了一下几个烂项目有人接,必不得已开始兑现了他的诺言。
  我们南京项目组4人,项目奖金1万,分配方案有我(项目组长)制定。我们项目组,一起吃一起住,共同生活了8个月,建立了深厚的感情,工作生活配合默契。在奖金分配方案上,老板把皮球踢给了我,让我制定。所以我在此问题上,我是相当的谨慎,分配方案既要有差异,也要保证公平,如若失策,必定产生团队地震。 以下是我初期的奖金分配方案:

    我首先把这个方案发给我的最亲切开发人员张希看,他提出两点意见:1、田雨的评价负面过多,要增加正面。2、汪刚的有点少,并且说把他的200给汪刚。我考虑他作为主力程序员,要体现他与其他人的的差异,所以就给他说,不动他的金额,把我的扣200给汪刚。然后把修改后的方案发给田雨。田雨没意见,同意。我又把方案发给汪刚,汪刚觉的他少了点,再加100,所以我又跟给汪刚说从我那扣100给你。以下是最终方案。 这次的奖金分配,基本上算是成功的,如果你作为项目组长,你应该怎么分配项目奖金呢?怎么做才会更合理?才会达到更好的效果呢?  

 

2011年12月16日 星期五

在小公司就是烦,程序员也得负责产品的原型设计

  大公司可能分工明确,程序员要做的事,可能只是实现某个复杂算法或实现某些接口,根本不需要对整个系统有所了解,所以压力相对来说小了很多。小公司程序员从需求调研、系统设计、到具体实现,甚至客户公关也都要参与。
  在小公司打拼了三四年,练就了一身什么都会,什么都不精的状态,想跳槽大公司,但是估计连第一关算法笔试都过不去。
  作为程序员的我,在受命于危难之际,去年底的时候也进行了Web 系统的原型设计,今天偶尔在电脑上发现了源码,运行一下,感觉也挺好的,跟目前实现的系统差别也不是太大。想想以后可能转行或怎么着的。也许这个源码再也不会打开。所以今天我就把源码分享出去,供园友们,参考一下。
  原型设计的好处,网上一大推,我就不在此累述了。程序员不是代码工,想要实现自己的想法,学会原型设计那是必须的。我之所以学习编程,有一个很大的原因,因为编程它只需要一台电脑,便有无限可能。
废话不多说了,点击下面的地址下载吧,需要AxureRP-Pro-5.6.0.2097原型设计工具,下面也会附上AxureRP-Pro-5.6.0.2097汉化版注册码。
1、源码:江苏雨情系统.rp http://files.cnblogs.com/zitsing/%E6%B1%9F%E8%8B%8F%E9%9B%A8%E6%83%85%E7%B3%BB%E7%BB%9F.rar 2、一个比较好的Axure RP Libraries:Better GUI.rplib http://files.cnblogs.com/zitsing/BetterGUI.rar 3、原型生成后的html,可直接点击运行,查看原型运行效果http://files.cnblogs.com/zitsing/%E5%8E%9F%E5%9E%8BHTML.rar 4、AxureRP-Pro-5.6.0.2097汉化版注册码 IloveyouAxure
UChpuxwbDW6eAIaAf9UujEFSBwN3vpEz9snHvlCQVJGQy4p7WrCyKLLvV5QLvqva 开始的标题有点大,有人说我虎头蛇尾,想想也是。所以现在改小了,我不是专门的原型设计师,只是偶尔用用,没有深厚的内功,写不出系列的文章,惭愧呀 最后附上两张图片

2011年12月16日 星期五

关于江苏水文分析评价项目阶段总结会议

主题:关于江苏水文分析评价项目阶段总结会议 时间:2011年7月2日傍晚

地点:南京 江苏水利厅 22楼 江苏水文局 会议室 ,后转到水情科办公室

人员

安徽远望信息科技有限公司:刘总、王总、程子清、张希、初燕巍、李兰

记录:刘总

审核:刘总 转发:与会人员   一、背景: 1.根据领导的反馈,进一步理清问题 2.探讨下一阶段行动方案。 二、结论: 1.程子清 a)          去年12月入手,开始做一些技术性的具体工作,后来发现客户反馈和我们的理解差距很大。 b)         和客户沟通,发现每个领导关注的要点不一样

  1. 司科长,关心自动报表,算法总结
  2. 黄科长,关心年月报表,还有任何新特色都想引进
  3. 唐局长,关心特征库
  4. 周科长,关心好用
  5. 闻教授,务实,在我们的业务框架内提出问题
c)          客户甚至拒绝沟通,让我们自己看标书 d)         我们发现有图有表,但是没有文。 e)          统一性现在是主要困难,openPortal思想很好,但是目前实现的功能有限,不灵活。 f)          树看起来比较单薄,只有叶子,没有花儿。 g)         统一节点,导致很多功能不好扩充,在写死与写活之间两难,操作性灵活性低 h)         希望后期有些节点可以固话 i)           领导不愿意配sql(刘总:复杂性膨胀,用户无法找到想要的节点。) j)           成熟的东西应该稳定 k)         科室内部意见不统一 2.王总 a)          需求调研、设计方案没有认真做 b)         如果规划好,可以将真正有难度的去掉 c)          希望能整理出验收前的list d)         实质性推动项目 3.初艳巍 a)          特征库算法设计现在受徐清那边影响 b)         现有算法工作量膨胀,时间控制不了 4.李兰 a)          没有写方案 b)         经常得不到客户认可,做重复性的工作,推倒重来 5.张希 a)          来4个月了 b)         主要负责item修改 c)          客户意见不统一 d)         需要差异表 6.刘总 a)          回答了团队成员的困惑 b)         再次详细阐述了本项目的设计思路,见附录 7.黄科长 a)          很久没看到领导这么重视,很好 b)         一定要现场指挥,坐镇指挥

行动计划

1.需要综合考虑领导建议,纳入下一步工作计划。

2.加强沟通

3.加强管理

4.强调设计的的规范化

2011年08月01日 星期一

arcgis for flex 基本操作

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s
="library://ns.adobe.com/flex/spark"
xmlns:esri
="http://www.esri.com/2008/ags"
xmlns:flash
="flash.text.*"
pageTitle
="Using a WMS map service with the ArcGIS API for Flex" xmlns:arcgis="cn.com.vistech.arcgis.*" xmlns:containers="net.brandonmeyer.containers.*" xmlns:supportClasses="com.esri.ags.layers.supportClasses.*">
<fx:Declarations>
<esri:SimpleMarkerSymbol id="mySymbol"
alpha
="0.8"
color
="0xDDDD00"
size
="10"
style
="circle">
<esri:SimpleLineSymbol width="2"
alpha
="1"
color
="0xDD0000"
style
="solid"/>
</esri:SimpleMarkerSymbol>
<esri:TextSymbol id="myText" text="南京 78.6" placement="start" xoffset="7" yoffset="0" color="0x333333" border="false" borderColor="0x000000" background="false" backgroundColor="0xFFFFFF" >
<flash:TextFormat size="13" font="宋体" bold="true" italic="false" underline="false" />
</esri:TextSymbol>
</fx:Declarations>
<esri:Map id="map">
<esri:lods>
<esri:LOD resolution="1.71661376953125E-4" scale="1"/>
<esri:LOD resolution="3.4332275390625E-4" scale="2"/>
<esri:LOD resolution="6.866455078125E-4" scale="3"/>
<esri:LOD resolution="0.001373291015625" scale="4"/>
<esri:LOD resolution="0.00274658203125" scale="5"/>
<esri:LOD resolution="0.0054931640625" scale="6"/>
<esri:LOD resolution="0.010986328125" scale="7"/>
</esri:lods>
<arcgis:JiangSuWMSLayer id="jsLayer" />
<esri:GraphicsLayer symbol="{mySymbol}" id="rain">
</esri:GraphicsLayer>
<esri:MapImageLayer>
<supportClasses:MapImage href="http://10.32.22.250:8080/appServices/emf2vec/visoline-e8ae9217c5f11185fcc46d24f89ff9ac.swf" extent="{new Extent(114.85300,30.37240,123.09154,35.62217)}"/>
</esri:MapImageLayer>
</esri:Map>
<containers:SuperPanel id="yuqing" width="320" right="10" top="36" height="294" title="水情" allowMinimize="true" alpha="0.8" visible="true">
<s:Button label="载入水情" click="button1_clickHandler(event)"/>
<s:Button label="载入等值线" click="button2_clickHandler(event)"/>
</containers:SuperPanel>
<s:ButtonBar id="navButtonBar" requireSelection="true" width="320"
change
="changeSelection(event)" right="10" top="10" height="21">
<s:dataProvider>
<s:ArrayCollection source="['雨情', '水情']" />
</s:dataProvider>
</s:ButtonBar>
<fx:Script>
<![CDATA[
import cn.com.vistech.arcgis.MySymbol;
import cn.com.vistech.utils.ObjectOP;
import spark.events.IndexChangeEvent;

import com.adobe.serialization.json.JSON;
import com.esri.ags.Graphic;
import com.esri.ags.SpatialReference;
import com.esri.ags.geometry.Extent;
import com.esri.ags.geometry.Geometry;
import com.esri.ags.geometry.MapPoint;
import com.esri.ags.geometry.Polygon;
cn.com.vistech.arcgis.MySymbol;

import mx.collections.ArrayCollection;
import mx.collections.ArrayList;
import mx.controls.Alert;
import mx.core.UIComponent;
import mx.rpc.events.ResultEvent;
import mx.rpc.http.HTTPService;
import mx.utils.ArrayUtil;

protected function button1_clickHandler(event:MouseEvent):void
{
var hts:HTTPService=new HTTPService();
hts.url="http://localhost:8080/FlexGis/getDAnyTimePP.action";
hts.method="POST";
var params:URLVariables=new URLVariables();
params.startDate="2011-07-20";
params.endDate="2011-07-27";
params.r=new Date().getMilliseconds();
hts.send(params);
hts.addEventListener(ResultEvent.RESULT,getDAnyTimePPResult);
}
private function getDAnyTimePPResult(event:ResultEvent):void
{
var json:Object=JSON.decode(event.result.toString());
json=JSON.decode(json.result);
var dAnyTimePPArray:Object;
dAnyTimePPArray=ArrayUtil.toArray(json);

for each(var row:Object in dAnyTimePPArray){
var myGraphicPolygon:Graphic = new Graphic(new MapPoint(row.lgtd,row.lttd));
var text:TextSymbol=MySymbol.getTextSymbol();
text.text=row.stnm+" "+row.rainFallVal;
myGraphicPolygon.symbol=text;
rain.add(myGraphicPolygon);

var myGraphicPolygon1:Graphic = new Graphic(new MapPoint(row.lgtd,row.lttd));
rain.add(myGraphicPolygon1);
}
}


protected function button2_clickHandler(event:MouseEvent):void
{
map.logoVisible=false;
map.openHandCursorVisible=false;
Alert.show(map.scale.toString());
}
private function changeSelection(event:IndexChangeEvent): void {
///Alert.show(ButtonBar(event.target).selectedItem);
if("水情"==ButtonBar(event.target).selectedItem){
yuqing.visible=true;
}else{
yuqing.visible=false;
}
//selectionText.text = "Selected Item: " + ButtonBar(event.target).selectedItem;
}

]]>
</fx:Script>
</s:Application>
  

2011年02月11日 星期五

花开花落,又是一季,2010年,我都做了啥?

  花开花落,又是一季,一年就这样过去了。   2010年,可以用一个字描述我的生活——“梦”。黄粱一梦、如梦初醒、梦醒时分、追梦的人。2010年11月9日人人网我的心情是:一场很长很长的梦醒后,我起身坐在床上。窗外的阳光射入我的眼睛,我努力的睁开眼,却看不到外面的风景。闭着眼,想回忆一下昨夜的梦,却怎么也想不清。   一直埋怨自己怎么老不变,却在2010年这个似梦的一年改变了。改的面目全非,以至于有时自己都不认识自己。看着以前照片的自己都怀疑,那是我吗?在我的印象中,我有3次改变。第一次是小学一年级时搬家,从一个调皮捣蛋的坏学生变成了一个安静好学的好学生;第二次是高一,从一个腼腆的人变成了侃侃而谈的人;第三次就是2010年,改变的不再是性格,而是改变了对自己、对他人、对世界以及对人生和爱情的看法。第三次改变与前两次不同,前两次是性格的改变,是日然而然的事情。而第三次则是刻意的改变,对自己人生进行了太多的思考,以至于曾经一段时间一直生活在极度痛苦之中。渴望改变又害怕改变,渴望改变是希望自己进步,而害怕改变就是担心自己变坏。我的痛苦就是在改变之前痛苦的抉择,我该走哪一条路?   2010年05月03日QQ空间日志:(为选之路——森林叶黄,林中岔道各奔一方。我一人独行,无限惆怅。不能把两条路同时造访,良久伫立,我朝第一条路眺望。路转处惟见林深草长,我再把另一条路探望。一样美丽,一样坦荡。但或许更令人向往,虽然两条路都曾有行人过往。但这条路芳草萋萋,更少人踏荒。那天早晨落叶满道上,落叶上尚无脚踩的痕伤。啊,且将第一条路留待他日寻访,明知道路穷处又是路。重游此地怕是痴想, 数年后,谈起此事,常叹息。林中两条路,我选择了行人更少的一条路,我的人生也从此便不同。)   写总结以前又把QQ空间,人人网以及其他微博空间2010年心情看了一遍,感叹万分。里面其实没有记录当时的心情,更多的是天气。可笑,人往往越想逃避,越想掩饰的东西,却无意间已经暴露了。   在2010年做了几件事可以说的事情,不可以说的就埋在我心里了:   1、 考驾照,用时半年,比计划中长了2个月。在里面认识了不少朋友。毕业后的第一个证。   2、 减肥,计划半年,却提前了2个月成功,最后害怕照这样速度掉,实在无法见父母,就不再坚持。   3、 搬家。搬到那地方也许就是一个错误。搬走,就是结束了那个错误。其实我觉得我更适合一个住。   4、 跳槽,计划中的事情,但在在哪地方发展的问题上,也深深痛苦了一把。   5、 喝醉,从来没喝醉过,那一次却喝醉了,从来没有这么放纵过自己。喝醉很可怕,明白了,什么叫一片空白,想不起,真的想不起。   6、 听歌,意外中的事情,我既然爱上了歌曲,同时也爱上了寂寞。   7、 看书,每年都看书,但以前看更多适用性的书,而2010年看了更多的思想类,经济类等书籍。   8、 看电影,电影陪我度过很多无聊的时间,明白了什么叫孤独,就是看着看着电影,睡着了,然后半夜起来关掉电脑,而再躺下久久不能入睡。   9、 买手机,换掉了索尼爱立信手机K750C,TMD那个手机太不给力了,再也不买索爱手机了,太不稳定了,操作频繁经常白屏,以至于我都不敢发短信。白屏的话还会把没有保存到卡上的 通讯录丢失。最后换了一款号称地板杀手的诺基亚E63智能手机,感觉良好,目前没有白屏。   10、 买电脑,用了4年的台式电脑退休了,带回家给我外甥玩,这个电脑可出了不少力,在这4年里几乎我在屋必开机。话说电脑是我的女朋友,旧女朋友退休,新女朋友就要上,经过深思熟虑花了7000元,买了一款dell studio 1458。性能强悍,机器很稳定,使用良好。   11、 买衣服,减掉肥,许多衣服都不能穿了,以前乐于网上买,可是减肥后也不知道自己的尺寸了,只得到实体店买。   2010年过去了,过去的就过去吧。对得起自己,对得起别人,无论我怎么改变,都不会改变我的心,心是好的,人就不会坏。展望2011,努力工作,奋进拼搏,期待有个人能陪我一起走过2011,直到永远。

2011年12月16日 星期五

江苏实时分析评价系统项目总结报告

1.   引言

1.1.  编写目的

江苏实时雨水情分析评价项目的开发已经基本完成。写此项目开发总结报告,以方使我们在以后的项目开发中来更好的实施项目的定制开发。让我们在今后的项目开发中有更多的有据资料来规范我们的开发过程和提高我们的开发效率,从而创造更多的公司效益。

1.2.  项目背景

项目名称:江苏实时雨水情分析评价系统 客户:水资源勘测局 用户 :水情科

1.3.  参考资料项目开发文档

1、              分析评价系统标书 2、              特征库设计标书 3、              江苏省实时分析评价系统需求分析报告 4、              江苏省实时雨水情分析评价系统概要设计 5、              江苏省实时雨水情分析评价系统特征值库设计 6、              江苏省实时雨水情分析评价系统详细设计 7、              江苏省实时雨水情分析评价系统测试报告 8、              江苏省实时雨水情分析评价系统方法库测试报告 9、              江苏省实时雨水情分析评价系统安装维护手册 10、         江苏省实时雨水情分析评价系统之iOpenApp操作手册 11、         江苏省实时雨水情分析评价系统之iOpenPortal操作手册 12、         江苏省实时雨水情分析评价系统之iTemplete操作手册 13、         项目部署资料

2.   开发工作评价

2.1.  对开发效率的评价

1、              系统开发已历时1年多的时间了 2、              开发的反复性比较多 3、              对客户端需求不是很透彻 综合以上,此项目的开发效率不是很高,相反有相当的一定时间的浪费。

2.2.  对产品功能的评价

经过我们江苏项目组团队的共同努力协作下,江苏实时雨水情分析评价系统已经很好的完成了客户的业务需求,经过对客户使用过程的观察,此项目开发的还是比较成功的,客户也在积极准备报科技奖。但是项目还是存在着一些问题,如,自定义报表,没有采用数据共享的设计思想,造成生产效率的低下等问题。

2.3.  对产品使用到的技术

1、              Flash 图表AmCharts:在我们项目中使用了Flash  Amcharts和Flex  AmCharts。在开始使用过程中碰到一些问题,但是在深入研究后基本上碰到的问题都已解决。在以后的项目中,我们可以参考当前项目,更快的完成图表的设计。但是此控件不是开源产品,并且是通用图表工具,在绘制水情部分图表并不能很好的满足需求,公司可以考虑为特定需求的图表设计出自己图表控件。 2、              可视化Web 编辑器CKEditor:在我们项目自定义报表中使用了CKEditor,很好的完成了客户对自定报告的需求。我们也对CKEditor深入的了解,开发出了基于CKEditor的插件。 3、              Flex 技术:在Gis方面使用了Flex4开发工具,Flex在用户界面方面存在很多优势,不用考虑跨浏览器的问题,很好的解决了用户对界面的需求。对这一技术的研究,基本上可以满足公司以后类似项目的开发。 4、              ArcGis for Flex:在Gis雨水情分析系统中,我们抛弃了原先一个开源的Flex for Gis 控件。而使用ArcGis for Flex这个用户比较多的控件,这个控件很好的满足客户对网络地图和本地地图的支持。在使用过程中,确实验证了其功能的强大,基本满足对GIS的开发任务。 5、              Spring 框架:在ismart项目中使用 了,Spring框架。也验证了其稳定性和方便性。 6、              SSH框架:在OpenPort项目中使用了,也很成熟。

3.   项目经验总结

  1. 3.     

3.1.    签订合同

一个项目的开发成败或者说项目开发带来的效益的大小,在很大程度上是受项目合同签订的影响。往往,很多一部分公司与客户签订的项目合同都是很模糊的,也很难签订的比较清楚,这样以后就会导致在项目的开发后期,工作量会越来越大,影响项目的竣工周期,而且,项目的开发费用一般不会变的,这样以后,我们就大大降低了我们的开发效益,虽然需求范围很难签订的明确,但是我们在签订合同同时,要尽量的去把合同功能边界和添加新功能的条件签订。

3.2.  开发团队

1、       在项目确立后,要尽快建立项目开发团队。项目团队成员的团结合作,互相沟通是非常重要的,团队成员之间要互相学习彼此的优点和技术,使团队的能力不断提高,这样,在项目的开发过程中,团队不会被难题困住。另外,团队中要有一个项目负责人,这个人物不管是在于客户的沟通上,还是在技术上都要是很出众的人。此项目负责人要能很好的沟通客户与开发成员之间,以此更好的理解客户的功能需求。 2、       保持项目开发团队的稳定性。项目团队的人员的走失,不仅造成他以前的工作白费,而且会造成团队人员的士气低落。我们这个项目前期的人员离开,造成项目开发周期加大。 

3.3.  需求调研

1、              项目组对客户的整体组织结构,公司有关人员的关系,职责等如果没有一个很好,足够了解掌握。这样项目组就无法很好的完整的整理到客户的需求,或者说是客户真实的功能需求。如此一来我们就为自己埋下了地雷,影响项目的开发周期。这就要求我们要与客户搞好无论是工作的还是生活上的朋友关系,要深入的去了解客户需求。 2、              我们要尽量的让客户也参与到我们项目的开发团队来。有些客户对项目有自己的设计思路,让他们积极参与进来,产品做出来后会增加他们的成就感,同时他们对系统更加了解,解决了以后培训的麻烦。 3、              控制好客户需求,不要听到客户的需求就满口答应,更不要扩散客户的需求。本来客户只是想要一个简单功能,你却由他的思想扩展更多需求。任何一个功能可以简单也可以复杂,把握功能的平衡点,才能尽快的把项目结束掉。 4、              抓住需求要点,大而全不是项目验收的必要条件,在做好最重要的功能,才考虑锦上添花。客户立项目一方面想解决工作中实际问题,另一方面想通过这个项目的亮点,展示给别人看,来抬高自己的地位或政绩。

3.4.  项目商务

做好商务工作,特别政府项目,他们立项目一方面是提高工作效率增加政绩,另一方面是想在项目中得到好处。在政府项目中,基本上都有这样的潜规则,拿回扣。如果这方面不做,务必拖延项目验收周期,增加公司其他方面的开支。公司应该定制自己的商务规则,公司想做大做强,至少在中国,这点是迈不过去的坎。面对这样的问题不能逃避,要主动应对把握主动权,这样,不管是项目还是与客户关系上都可以得到更好的效果,为以后的二期打下鉴定的基础。

4.   项目后期计划

4.1.  项目的价值

江苏实时雨水情分析评价系统,很好的解决了,水情科长期以来繁重的报表查询工作,解放了人力,他们可以把工作的重点分析模型的研究上。GIS分析系统可以更加宏观系统的对雨水情有个全面的分析,这些亮点都得到了客户领导的一致好评。在予其他客户演示此系统的时候,他们都产生了极大的兴趣。

4.2.  项目的推广

江苏实时雨水情分析评价项目虽然已经验收。这不是终点,而是起点,我们在这个项目中投入了大量的人力物力,成功的把分析评价这个特色功能做起来了。所以我们不能就此结束项目的生命周期,我们要加大对此产品的推广工作。

4.3.  项目的产品化

项目产品化是公司发展到一定阶段,必然碰到的问题。从实时雨水情分析评价系统的价值来看,它完全可以产品化。 1、          自定义报表重构。 2、          开发android、iphone、ipad版Gis雨水情分析评价系统。 3、          OpenPortal重构,加强安全性以及可操作性。 4、          其他水情专业图表的研究

4.4.  项目团队的稳定

项目虽然结束了,但是团队不能解散。人与人之间最大的问题是沟通、默契。一个项目组,想想达到一个融洽的氛围,是需要长时间磨合才能那个完成的。江苏项目组长期的出差工作生活,我们已经达到了很好的默契,互相了解彼此的秉性。这种关系是这个项目中得到最宝贵的财富。相信以后这个团队会在以后项目中发挥更大作用。公司应加大鼓励保持这个团队的稳定性。

5.   项目人员工作概况

这项目先后参与人员众多,中间也走了不少人。现在能留下来,坚持下来的都是优秀员工,他们承受对了客户的压力,技术的考验。不管在业务上,还是技术上都上升到一个新的台阶。他们的经验教训一定会为公司的发展,有着举足轻重的作用。所以公司要给予更多精神上和物质上的待遇。 下面我把最后留下的人员在这个项目的工作情况作出简单汇报: 1、              田雨:田雨主要做了月报的配置、自定义报表的配置、特征库设计整理,以及自定义报表的完善工作。前期与客户沟通,策划请客户吃饭送礼,打破了公司与客户的僵局。为后续工作开展奠定了坚实的基础。后期由于家庭等原因,没有能全心的投入到工作上。 2、              张希:张希主要做了自定义报表的大部分功能编写和Gis 算法的编写以及自定报表的配置。坚实的Java基础为项目提供高效稳定的算法。 3、              汪刚:汪刚是后期参与到项目中来,完善修改了以前的部分存储过程,也新了几个存储过程和配置了许多自定义报表。 4、              程子清:作为项目负责人主要负责项目整体推进和关键技术的公关。设计了自定义报表,自定报表原型技术设计,构架了ismart算法项目以及Flex GIS分析评价系统,组织汇报项目情况,与客户沟通调研需求。对整个系统相当的了解,承受了客户的巨大压力。

2011年09月19日 星期一

java JDK6 静态导入

Java语言中引入了导入静态数据,以简化静态属性和方法的使用。在导入静态信息后,就可以使用方法/属性,而不需要限制方法/属性到所属类名称。例如,通过导入Math类的静态成员,就可以编写abs或者sqrt,而不用写成Math.abs和Math.sqrt。
Colors.java
package scy;

public class Colors {
	public static int white=0;
	public static int black=1;
	public static int red=2;
}
 StaticTest.java
package scy;
import static scy.Colors.*;
public class StaticTest {

public static void main(String[] args) {
System.out.println(red);
}
}
运行结果:2

2011年07月28日 星期四

移除arcgis for flex 上的logo

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s
="library://ns.adobe.com/flex/spark"
xmlns:esri
="http://www.esri.com/2008/ags"
pageTitle
="Using a WMS map service with the ArcGIS API for Flex" xmlns:arcgis="cn.com.vistech.arcgis.*">
<esri:Map id="map" load="removeArcgisLogo()">
<arcgis:JiangSuWMSLayer/>
</esri:Map>
<fx:Script>
<![CDATA[
import mx.core.UIComponent;
private function removeArcgisLogo():void{
if(map.numChildren < 1)
{
return;
}
for(var i : int = 0 ; i < map.numChildren ; i++)
{
var component:UIComponent = map.getChildAt(i) as UIComponent;
if(component != null)
{
if(component.className == "StaticLayer")
{
for(var j : int = 0 ; j < component.numChildren ; j++)
{
var stComponent : UIComponent = component.getChildAt(j) as UIComponent;
if(stComponent.className == "Image")
{
stComponent.visible = false;
return;
}
}
}
}
}
}
]]>
</fx:Script>
</s:Application>