一些体会,收获
Dec 29
Jul 14

在Flex的开发过程中,常常会遇到复制ArrayCollection的情况。以前只是从网上找个方法拿来就用,也没有具体的搞清楚所以然来。今天有时间,研究了一下,总结如下:

Flex中的复制同java一样,也分为深复制和浅复制下面总结一下ArrayCollection的浅复制,共有4种方法:

1、var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list);

2、var newArray:ArrayCollection=new ArrayCollection(oldArray.source);

3、var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice());

4、var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray());

以上方法中,第一种方法由于不是创建的独立的ArrayCollection对象,所以不推荐使用。第二、三、四种方法相似,可以参考使用。

有的时候,我们也会用到深复制,方法如下:

var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));

this.clone()方法定义如下:

function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}

下面是我测试以上程序的Flex程序代码,大家可以参考:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()" layout="absolute">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.collections.ListCollectionView;
import mx.controls.Alert;
import flash.utils.ByteArray;


public function initApp():void
{
}


//开始测试:
//浅复制1
private function test1():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list);

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}
//浅复制2
private function test2():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=new ArrayCollection(oldArray.source);

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//浅复制3
private function test3():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice());

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//浅复制4
private function test4():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray());

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//深复制
private function test5():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//深复制调用的方法
function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
]]>
</mx:Script>
<mx:Button label="第一种浅复制方法" click="test1()" x="61" y="36"/>
<mx:Button label="第二种浅复制方法" click="test2()" y="57" x="61" width="114"/>
<mx:Button label="第三种浅复制方法" click="test3()" y="78" x="61" width="114"/>
<mx:Button label="第四种浅复制方法" click="test4()" y="98" x="61" width="114"/>

<mx:Button label="深复制方法" click="test5()" y="147" x="61"/>
</mx:Application>



删除


<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init()"

backgroundGradientColors="[#ffffff, #ffffff]" >

<mx:Script>

<![CDATA[

import mx.collections.ArrayCollection;

[Bindable]

public var ac:ArrayCollection=new ArrayCollection([

{name:"1",sex:"男",age:"11"},

{name:"2",sex:"女",age:"12"},

{name:"3",sex:"女",age:"14"},

{name:"4",sex:"女",age:"15"},

{name:"5",sex:"男",age:"16"},

{name:"6",sex:"男",age:"13"}

]);

public function init():void{

for(var i:int=0;i<ac.length;i++){

var item:Object=ac.getItemAt(i);

if(item.sex=="女"){

ac.removeItemAt(i);

}

}

}

]]>

</mx:Script>

<mx:DataGrid width="100%" dataProvider="{ac}">

<mx:columns>

<mx:DataGridColumn dataField="name" width="100" headerText="ID"/>

<mx:DataGridColumn dataField="sex" width="100" headerText="性别"/>

<mx:DataGridColumn dataField="age" width="100" headerText="年龄"/>

</mx:columns>

</mx:DataGrid>

</mx:Application>




Jun 30
ArcGIS Server Flex API调用GP服务的一般步骤

1、说明

ArcGIS Geoprocessing提供了大量地理处理和分析工具,可根据需要对这些工具进行组合构造自己的GIS分析模型,然后发布成GP服务,以方便各种Web客户端调用。Flex API中提供了访问GP服务的接口,通过该接口和GP工具,可实现具有高级GIS分析功能的Web应用。

2、模型创建与测试

创建模型可在modelbuilder可视化环境下进行,也可使用Python脚本定义。模型创建完成需要在ArcMap环境下测试是否正常运行。

详细建模过程请参考ArcGIS的帮助文档。

3GP服务发布

发布GP服务可使用两种资源类型:GP工具;包含结果图层的MXD文档。其中包含结果图层的MXD文档发布成GP服务时又有两种选择:一种只发布为GP服务;另一种发布成MapServiceGP服务。第二种方式可预先在MXD文档中对结果图层渲染,这样可简化客户端的可视化工作。实际项目中选择使用哪一种方式,需要根据具体业务需要确定,不能一概而论。

4GP服务测试

1)在ArcMap中加载MapService

注意为方便测试,该MapService不能使用发布GP服务时一同发布出来的MapService

2)在ArcToolbox中添加GP服务

将发布的GP服务添加到ArcToolbox中,点击运行,生成的结果会自动添加到当前的地图中。

5ArcGIS Server Flex API调用GP服务示例

上面几小节简单的介绍了GP工具的制作和GP服务的发布,本小节正式进入正题,讲讲如何使用ArcGIS Server Flex API调用GP服务。

GP服务分同步和异步两种执行模式,Flex API也提供了两种处理方式与之对应。Flex API调用GP服务使用的是Geoprocessor类。该类提供了execute(params)submitJob(params)两个方法调用后台的GP服务进行数据处理,其中execute(params)对应的是同步执行模式,执行完成触发executeComplete事件。submitJob(params)对应的是异步执行模式,执行完成触发jobComplete事件。对GP服务结果的处理我们可以定义在这些complete事件中。如果GP服务处理过程比较简单而且耗费时间少,我们可以选择同步执行模式,但如果比较耗时,为避免客户端长时间等待,常使用异步执行模式。

为保证Flex API正常调用GP服务,在GP模型定义和GP服务发布过程需要,还需要注意以下几项:

1)在配置MXD文档时,设置临时工作空间

MXD中添加完GP工具后,如果未设置临时工作空间,则运行GP工具生成的结果将默认保存在C盘下,该路径会导致GP服务无法读取结果图层,可通过设置临时工作空间解决。设置方法:在ArcToolbox上右键选择Environment,设置scratchworkspace的路径即可。

2GP工具输出路径的处理

为方便访问输出图层,一般情况下使用环境变量来指定输出路径,即使用scratchworkspace变量,该变量指向ArcGIS Serverarcgisjobs目录。例如:%scratchworkspace%\idwraster

3)输出图层中文字符处理

如果GP工具中输出的图层名包含中文,需要更改为英文名称,否则添加到地图上的结果图层无法正常显示。

本示例以生成等值面为例,数据使用ArcGIS自带的World地图,软件环境使用ArcGIS Server9.3.1ArcGIS for Flex API 1.3版本。示例代码如下:

1)发布服务

将包含GP工具的MXD文档发布成同名的地图服务和GP服务。

2Flex调用GP服务

<mx:Script>
<![CDATA[
import mx.controls.Alert;
import com.esri.ags.events.*;
import com.esri.ags.tasks.*;
import com.esri.ags.layers.*;

private function gpJobCompleteHandler(event:GeoprocessorEvent):void
{

var imageParameters : ImageParameters = new ImageParameters();
var myImageLayer2 :GPResultImageLayer = gp.getResultImageLayer(event.jobInfo.jobId,"dzhm",imageParameters);
//dzhm参数为GP工具中定义的输出文件名
baseLayer.visible = false;
map1.addLayer(myImageLayer2,0);

Alert.show("job:"+event.jobInfo.jobId);
}
]]>
</mx:Script>

<esri:Geoprocessor id="gp" url="http://xinli:8399/arcgis/rest/services/test/world_gdb/GPServer/IDW"
jobComplete="gpJobCompleteHandler(event)">
<esri:fault>
<![CDATA[
Alert.show(event.fault.message);
]]>
</esri:fault>
</esri:Geoprocessor>
<mx:Button x="10" y="10" label="执行">
<mx:click>
<![CDATA[
var params:Object = {};
gp.submitJob(params);
]]>
</mx:click>
</mx:Button>
<esri:Map id="map1" width="100%" height="100%">
<esri:ArcGISDynamicMapServiceLayer id="baseLayer" url="http://xinli:8399/arcgis/rest/services/test/world_gdb/MapServer"/>
</esri:Map>
May 19

decode

 

 

在Oracle/PLSQL中,  decode 具有和 IF-THEN-ELSE 一样的功能。

decode 函数语法如下:

decode( expression , search , result [, search , result]... [, default] )

expression 要比较的表达式.

 

search 要与expression 比较的字段。.

 

result 如果expression 与search 一样的话,返回该结果。.

default 此参数可选,如果没有与expression 匹配上的search . 就返回此结果,如果此参数没有设置,当没有与expression匹配上的search时,返回null。

search 和 result可成对出现多次,代表各种要匹配的情况。 
 

应用于

  • Oracle 9i, Oracle 10g, Oracle 11g

判断数据正负然后统计 

sum(DECODE(SIGN(INTENS-0), 1, 1, 0) ) as zINTENS,sum(DECODE(SIGN(INTENS-0), -1, 1, 0) ) as fINTENS
May 18
arcgis 雷电查询
支持 线杆走廊半径内雷电查询(缓冲区)  支持手工画区域查询
结合大气电场仪 支持区域雷电报警

分页: 1/11 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]