??xml version="1.0" encoding="utf-8" standalone="yes"?> 打开资源理器,工具菜单Q?gt;文g多w项Q?gt;查看Q去掉里面的单文件共? 如果q不行就从控刉板关闭window防火?/p>
下面的两q图分别描述了ArcIMS 和ArcGIS server REST的是h机制
ArcIMS
ArcGIS server REST
从图中的我们可以清晰地看出,如果把黄色虚U内看成是黑q话,其两U服务采用完全一Ll构QWebservice) ?不同之处在于ArcIMS 应用发送的是ArcXML 接收的是 ArcXML ,而ArcGIS server REST 应用发送的是GET (POST)h 接收的是 JSON。在之前 我们pq?ArcIMS之所以广受用L好评Q就是因为其架构优秀Q逻辑清晰Q开发方便,而ArcGIS server REST 也秉承了q个优点Q其架构也是q种发送请?接受l果的模式,不但l构清晰也利于开发者的开发调试。通过对其发送接受请求的分析能我们更清楚地认识q点?/p>
应用向ArcIMS的发送请?nbsp; QgetFeatures)
上面一个就是在ArcIMS里发送的查询hQ请求是在cities囑ֱ中查询名U是San diego的地图要素。而下面的Axl是ArcIMS接受到请求返回的查询l果?/p>
从中我们可以看出San Diego地图要素的一些信?/p>
下面q个h是应用向ArcGIS server REST的发送请?QgetFeatures)
不同于向ArcIMS发送的ArcXML 的POST方式Q这个请求是通过GET方式发送的字符Ԍ从字W串的参C我们可以看出Q其是向地图服务为USA的第0囑ֱ Qcities囑ֱQ发送一个请求,查询?city_NAME=San Diego 的地图要?br /> 下面是ArcGIS server REST接受到请求后q回的查询结果?/p>
从上面可以看出,ArcGIS server REST 和ArcIMS 是如此的怼Q都是请求应{模式,而相对于ArcIMS ?AXL而言ArcGIS server REST的JSON更适于脚本语言的解析(xml在不同浏览器下解析方法有很大区别Q,而且相同内容JSON比AXL更小Q这个在大数据结果返回中是很重要的,不仅仅如?ArcGIS server REST对于ArcIMS开发h?而言q具有不需要额外学习AO知识 Q入门迅速,{诸多方面优ѝ?/p>
Z么是 JavaScript Q?/p>
在ArcIMS中用最多的是JavaScript开发(其次是java connector~Q,在很多项目中都是JavaScript做GIS 应用QDotNet或javaQJ2EEQ?作业务逻辑Q我怿大多数ArcIMS开发h员对JavaScript开发ƈ不陌生?/p>
JavaScript 的WebGIS 开发大致分Z下的三类Q?/p>
1、地囄展示Q?DIV ?IMG的抽?/p>
2、信息的查询 发送AJAXh
3、动态信息的地图展示
对于marker pop 是DIV
对于Graphic 是 VML/SVG
下面q个是利用JavaScript向ArcIMS h地图的全q程Q其?url为ArcIMS服务器servlet connector的地址Qaxl 为发送的getmap h?/p>
其步骤:
1、客LJavaScript建立xmlhttprequest 通道Q向ArcIMS的servlet connector 发送axlhQ黑色JavaScript代码Q?br />
2、ArcIMS 接受到请求生成图?br />
3、通过刚才客户端发起徏立的xmlhttprequest 通道QArcIMS发送AXLl客LQ告知生成的地图囄的url
4、客LJavaScript解析收到的AXLQƈ告知面html抽换DIV中的囄指向urlQ色代码)
5、页面通过新的url地址取到ArcIMS刚才生成的地囑֛片,展示l客戗?/p>
相对于ArcIMS而言 ArcGIS server REST地图h更ؓ单,如下?/p>
其步骤:
1、利用JavaScript拼接h的urlԌ传给html
2、页面请求url
3、ArcGIS server REST 接受q个URL 生成地图囄以流的方式传l页?br />
4、页面展C地囑֛片给用户
?br />
以上的Javascript代码没有用到MAPIQ其主要目的是向大家说明,在有强大的服务端支持QArcIMS/ArcGIS server RESTQ下利用JavaScript开发WebGIS 应用是一件多么惬意的事情。而且 不要忘了,我们q有装大量要素的Javascript API !
本篇文章来源?GISI间?转蝲请以链接形式注明出处 |址Qhttp://www.gissky.net/Article/1701.htm
import com.esri.adf.web.faces.event.ClientActionArgs;
import com.esri.adf.web.faces.event.MapEvent;
import com.esri.adf.web.faces.event.MapToolAction;
import com.esri.adf.web.data.WebContext;
import com.esri.adf.web.data.query.WebQuery;
import com.esri.adf.web.data.geometry.WebGeometry;
import com.esri.adf.web.ags.data.AGSMapResource;
import com.esri.adf.web.ags.data.AGSMapFunctionality;
import com.esri.arcgisws.MapServerPort;
import com.esri.arcgisws.SpatialFilter;
import com.esri.arcgisws.EsriSearchOrder;
import com.esri.arcgisws.QueryFilter;
import com.esri.arcgisws.EsriSpatialRelEnum;
import com.esri.arcgisws.LayerDescription;
import com.esri.arcgisws.RecordSet;
import com.esri.arcgisws.Record;
import com.esri.adf.web.ags.util.AGSUtil;
import com.esri.arcgisws.PolygonN;
public class QueryPolygon implements MapToolAction //һK�ӿK?br />
{
private WebContext webContext = null;
private String pMsg ;
public QueryPolygon(){}
private void QueryFeature(WebGeometry pWebGeometry)
{
AGSMapResource pAGSMap = (AGSMapResource)webContext.getResources().get("ags1");
MapServerPort pMapServer = pAGSMap.getMapServer();
PolygonN pPolygonN = (PolygonN)AGSUtil.toAGSGeometry(pWebGeometry);
SpatialFilter spatialFilter = new SpatialFilter();
spatialFilter.setSpatialRel(EsriSpatialRelEnum.esriSpatialRelIntersects);
spatialFilter.setWhereClause("");//where
spatialFilter.setSearchOrder(EsriSearchOrder.esriSearchOrderSpatial);
spatialFilter.setSpatialRelDescription("");
spatialFilter.setGeometryFieldName("");//
spatialFilter.setFilterGeometry(pPolygonN);
AGSMapFunctionality pMapFunc = (AGSMapFunctionality)pAGSMap.getFunctionality("map");
LayerDescription[] pLayerDescs = pMapFunc.getLayerDescriptions();
QueryFilter pFilter = (QueryFilter)spatialFilter;
RecordSet pRSet = null;
Record[] pRs = null;
//WebQuery pWebQuery = this.webContext.getWebQuery();
WebQuery pWebQuery = (WebQuery)this.webContext.getAttribute("query");
pWebQuery.clearGraphics();
int pLayerCount = pLayerDescs.length;
for(int i=0; i<pLayerCount;i++)
{
LayerDescription pLayerDesc = pLayerDescs[i];
if(pLayerDesc.isVisible())
{
try
{
pRSet = pMapServer.queryFeatureData(pMapServer.getDefaultMapName(), i,pFilter);
}
catch(Exception pE)
{
return;
}
pRs = pRSet.getRecords();
int TheLayerQueryCount = pRs.length;
for(int j=0;j < TheLayerQueryCount;j++)
{
Record pItem = pRs[j];
int TheItemValuesCount = pItem.getValues().length;
for(int k=0; k<TheItemValuesCount;k++)
{
Object pOjb = pItem.getValues()[k];
if(pOjb instanceof com.esri.arcgisws.Geometry)
{
WebGeometry pGeo = null;
try
{
pGeo = AGSUtil.fromAGSGeometry((com.esri.arcgisws.Geometry)pOjb);
}
catch(Exception pE)
{
System.out.println(pE.getMessage());
break;
}
pWebQuery.addDisplayGeometry(pGeo);
break;
}
}
}
}
}
this.webContext.refresh();
}
public void execute(MapEvent arg0) throws Exception
{
ClientActionArgs clientarg = arg0.getClientActionArgs();
System.out.println( "---所有参?--" + clientarg.getRequestParameters());
this.webContext = arg0.getWebContext();
WebGeometry pWebGeometry = arg0.getWebGeometry();
pWebGeometry = pWebGeometry.toMapGeometry(arg0.getWebContext().getWebMap());
this.QueryFeature(pWebGeometry);
}
}
转蝲? http://leo43.blog.hexun.com/p9/default.aspx
List<WebLayerInfo> layerList = webQuery.getQueryLayers();//获得所有图层信?br />
WebLayerInfo layerInfo = null;
for(Iterator iter = layerList.iterator(); iter.hasNext(); ) {
Object item = (Object) iter.next();
if(item instanceof WebLayerInfo){
layerInfo = (WebLayerInfo)item;
layers.add(new SelectItem(layerInfo, layerInfo.getName()));
System.out.println(layerInfo.getName());//囑ֱ名字,可以Ҏ(gu)它指定查询某?br />
}
}
TextCriteria tc = new TextCriteria();
List<String> searchFields = new ArrayList<String>();
searchFields.add("type");
searchFields.add("sun");
tc.setSearchFields(searchFields);//d需要查询的字段?br />
tc.setSearchText("1");//模糊查询的关键字
List results=webQuery.query(tc,layerList);//执行查询
System.out.println(results.size());//查询l果数量
for(int ii=0;ii<results.size();ii++){
QueryResult result = (QueryResult) results.get(ii);
result.highlight();//执行高亮操作
System.out.println(result.getDetails());//result.getDetails()可以获得所有字D?br />
}
webMap.getWebContext().refresh();//h所有控?/p>
转蝲? http://leo43.blog.hexun.com/p9/default.aspx
转蝲? http://leo43.blog.hexun.com/p9/default.aspx
<managed-bean>
<managed-bean-name>myFullExtent</managed-bean-name>
<managed-bean-class>com.demo. MyFullExtent </managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>context</property-name>
<value>#{mapContext}</value>
</managed-property>
</managed-bean>
<a:command id="fullExtent" action="#{myFullExtent.setFullExtent}" toolText="全图昄" />
//生成查询对象
EnvelopeN env = new EnvelopeN(extent.getMinX(), extent.getMinY(), extent.getMaxX(), extent.getMaxY(),null, null, null, null, null);
SpatialFilter spatialFilter = new SpatialFilter();
spatialFilter.setSpatialRel(EsriSpatialRelEnum.esriSpatialRelIntersects);
spatialFilter.setWhereClause("");
spatialFilter.setSearchOrder(EsriSearchOrder.esriSearchOrderSpatial);
spatialFilter.setSpatialRelDescription("");
spatialFilter.setGeometryFieldName("");
spatialFilter.setFilterGeometry(env);
try{
int layerId = 1;//查询的土?ID号配|文件中有声?br />
this.countedFeatures = mapServer.queryFeatureCount(mapServer.getDefaultMapName(), layerId, spatialFilter);
System.out.println("你选择?"+countedFeatures+" 要素");
}catch(RemoteException rme){
throw new ADFAGSException("Could not execute MapServer::queryFeatureCount()",rme);
}
Interface MapServerPort常用的方法:
mapServer.getDefaultMapName() 获得默认地图?br />
mapServer.queryFeatureCount(String mapName , int layerId ,SpatialFilter sf) return int 获得指定囑ֱ查询到的要素L
mapServer.queryFeatureData(String mapName , int layerId ,SpatialFilter sf) return RecordSet 获得指定囑ֱ查询到的要素?包含所有属性字D?
mapServer.getDefaultMapName() return String q回默认地图名称
mapServer.hasLayerCache(String mapName, int layerID) return bool q回指定囑ֱ是否是缓存图?/p>
转蝲? http://leo43.blog.hexun.com/p9/default.aspx
//获得囄的二q制 可以在application启动时进行读取,攑֜context的某个attribute里面?br />
String picPath= FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath()+"\\images\\angle.gif";
File myFile = new File(picPath);
FileInputStream myStream= newFileInputStream(myFile);
BufferedInputStream buf = newBufferedInputStream(myStream);
byte[] bytInput = newbyte[(int)myFile.length()];
buf.read(bytInput, 0, (int) myFile.length());
buf.close();
myStream.close();
//在地图上标注
WebPictureMarkerSymbol markers=newWebPictureMarkerSymbol();
markers.setPicture(bytInput);
GraphicElement ge=new GraphicElement();
ge.setGeometry(pt);
ge.setSymbol(markers);
WebGraphics graphics=arg0.getWebContext().getWebGraphics();
graphics.addGraphics(ge);
arg0.getWebContext().refresh();
WebTrueTypeMarkerSymbol trueMarkerSymbol=new WebTrueTypeMarkerSymbol(); //注意使用pȝ里面已经安装的字?
trueMarkerSymbol.setFontName("ESRITransportation & Civic");//讄索引
trueMarkerSymbol.setCharacterIndex(8);
trueMarkerSymbol.setFontColor("255,0,0");
trueMarkerSymbol.setFontSize(20);
trueMarkerSymbol.addTextValue("chongqing");//标注的文?br />
trueMarkerSymbol.setFontStyle(WebTrueTypeMarkerSymbol.BOLD);
GraphicElement ge=new GraphicElement();
ge.setGeometry(pt);
ge.setSymbol(trueMarkerSymbol);
WebGraphics graphics=arg0.getWebContext().getWebGraphics();
graphics.addGraphics(ge);
arg0.getWebContext().refresh();
转蝲? http://leo43.blog.hexun.com/p9/default.aspx
大地坐标Qؓq面坐标。参考^面地?水^?nbsp; 坐标单位Q米、千c等?br />
地理坐标转换到大地坐标的q程可理解ؓ投媄?nbsp; Q投影:不规则的地球曲面{换ؓq面Q?/p>
在ArcGIS中预定义了两套坐标系Q地理坐标系QGeographic coordinate systemQ投影坐标系QProjected coordinate systemQ,
1、首先理解地理坐标系QGeographic coordinate systemQ,Geographic coordinate system直译?
地理坐标pȝQ是以经U度为地囄存储单位的。很明显QGeographic coordinate syst
em是球面坐标系l。我们要地球上的数字化信息存放到球面坐标系l上Q如何进行操?
呢?地球是一个不规则的椭球,如何数据信息以U学的方法存攑ֈ椭球上?q必然要?
我们扑ֈq样的一个椭球体。这L椭球体具有特点:可以量化计算的。具有长半uQ短
半uQ偏心率。以下几行便是Krasovsky_1940椭球及其相应参数?
Spheroid: Krasovsky_1940
Semimajor Axis: 6378245.000000000000000000
Semiminor Axis: 6356863.018773047300000000
Inverse FlatteningQ扁率): 298.300000000000010000
然而有了这个椭球体以后q不够,q需要一个大地基准面这个椭球定位。在坐标pȝ?
qCQ可以看到有q么一行:
Datum: D_Beijing_1954
表示Q大地基准面是D_Beijing_1954?
--------------------------------------------------------------------------------
有了Spheroid和Datum两个基本条gQ地理坐标系l便可以使用?
完整参数Q?
Alias:
Abbreviation:
Remarks:
Angular Unit: Degree (0.017453292519943299)
Prime MeridianQv始经度): Greenwich (0.000000000000000000)
DatumQ大地基准面Q? D_Beijing_1954
SpheroidQ参考椭球体Q? Krasovsky_1940
Semimajor Axis: 6378245.000000000000000000
Semiminor Axis: 6356863.018773047300000000
Inverse Flattening: 298.300000000000010000
2、接下来便是Projection coordinate systemQ投影坐标系l)Q首先看看投影坐
标系l中的一些参数?
Projection: Gauss_Kruger
Parameters:
False_Easting: 500000.000000
False_Northing: 0.000000
Central_Meridian: 117.000000
Scale_Factor: 1.000000
Latitude_Of_Origin: 0.000000
Linear Unit: Meter (1.000000)
Geographic Coordinate System:
Name: GCS_Beijing_1954
Alias:
Abbreviation:
Remarks:
Angular Unit: Degree (0.017453292519943299)
Prime Meridian: Greenwich (0.000000000000000000)
Datum: D_Beijing_1954
Spheroid: Krasovsky_1940
Semimajor Axis: 6378245.000000000000000000
Semiminor Axis: 6356863.018773047300000000
Inverse Flattening: 298.300000000000010000
从参C可以看出Q每一个投影坐标系l都必定会有Geographic Coordinate System?
投媄坐标pȝQ实质上便是q面坐标pȝQ其地图单位通常为米?
那么Z么投影坐标系l中要存在坐标系l的参数呢?
q时候,又要说明一下投q意义Q将球面坐标转化为^面坐标的q程便称为投影?
好了Q投q条g出来了Q?
a、球面坐?
b、{化过E(也就是算法)
也就是说Q要得到投媄坐标必d有一?#8220;拿来”投媄的球面坐标,然后才能使用法
L影!
x一个投影坐标系l都必须要求有Geographic Coordinate System参数?br />
关于北京54和西?0是我们用最多的坐标p?br /> 先简单介l高?克吕格投q基本知识Q了解就直接跌Q我国大中比例尺地图均采用高?克吕格投影,光常是按6度和3度分带投影,1:2.5万-1:50万比例尺地ŞN用经?度分带,1:1万比例尺的地形图采用l差3度分带。具体分带法是:6度分带从本初子午U开始,按经?度ؓ一个投影带自西向东划分Q全球共?0个投影带Q带号分别ؓ1Q?0Q?度投影带是从东经1?0U经U开始,按经?度ؓ一个投影带自西向东划分Q全球共?20个投影带。ؓ了便于地形图的测量作业,在高?克吕格投影带内布|了q面直角坐标pȝQ具体方法是Q规定中央经UؓX_赤道为Y_中央l线与赤道交点ؓ坐标原点Qx值在北半球ؓ正,南半球ؓ负,y值在中央l线以东为正Q中央经U以西ؓ负。由于我国疆域均在北半球Qx值均为正|Z避免y值出现负|规定各投影带的坐标纵轴均西移500kmQ中央经U上原横坐标值由0变ؓ500km。ؓ了方便带间点位的区分Q可以在每个点位横坐标y值的癑֍c位数前加上所在带P?0带内A点的坐标可以表示为YA=20 745 921.8m?/p>
2008-7-27 1:51:43 com.esri.adf.web.data.GISResource init
严重: Unable to initialize functionality : toc. This functionality will be removed from this resource:map
java.lang.NullPointerException: Unable to initialize AGSTocFunctionality. Invalid parameters.
l过修改WEB-INF/faces-config.xml和WebContent/WEB-INF/context-attributes.xml两个JSF的配|文件解决问?br /> 9. 此时重新发布该项目,OKQ一切搞定!?span lang="EN-US">axGlobeControl里面ȝQ整个代码如下,
'd新的囑ֱ,先把囑ֱ属性改?span lang="EN-US">
Dim pG As IGraphicsLayer = New GlobeGraphicsLayer
axGlobeControl1.Globe.AddLayerType(pG, esriGlobeLayerType.esriGlobeLayerTypeUnknown) '?span lang="EN-US">pGq个layer加到Globe?span lang="EN-US">
Dim pGEP As IGlobeGraphicsElementProperties = New GlobeGraphicsElementProperties
pGEP.DrapeElement = True '属性改?span lang="EN-US">drape
Dim pGL As IGlobeGraphicsLayer = New GlobeGraphicsLayer
pGL = pG
'ȝU定?span lang="EN-US">symbol,调用drawline
Dim pSymbol As ISimpleLineSymbol = New SimpleLineSymbol
pSymbol.Width = 2
Dim pcolor As IColor = New RgbColor
pcolor.RGB = RGB(230, 0, 0)
pSymbol.Color = pcolor
Dim pGC3D As IGraphicsContainer3D = New GlobeGraphicsLayer
pGC3D = pG '?span lang="EN-US">pG获得Container
Dim nCount As Integer
For nCount = -90 To 90 Step 30
Dim pElement As IElement
'U线
pElement = drawline(0, nCount, 0, 359.5, nCount, 0, pSymbol)
pGL.AddElement(pElement, pGEP, 0) '修改后的属性加入到dU的element里面
pGC3D.AddElement(pElement) '把画好的囑Ş加到layer里面
'l线
pElement = drawline(nCount, 0, 0, nCount, 359.5, 0, pSymbol)
pGL.AddElement(pElement, pGEP, 0) '修改后的属性加入到dU的element里面
pGC3D.AddElement(pElement) '把画好的囑Ş加到layer里面
Next nCount
axGlobeControl1.Refresh()
Public drawline(ByVal x1 As Double, ByVal y1 As Double, ByVal Z1 As Double, ByVal X2 As Double, ByVal Y2 As Double, ByVal Z2 As Double, ByVal symbol As ISimpleLineSymbol) As IElement
Dim pElement As IElement
pElement = New LineElement
Dim pLineEle As ILineElement
pLineEle = pElement
pLineEle.Symbol = symbol
Dim tmpline As IPolyline = New Polyline
'l要ȝU定义v始点
Dim StartPoint As IPoint, EndPoint As IPoint
StartPoint = New Point
StartPoint.X = x1
StartPoint.Y = y1
StartPoint.Z = Z1
EndPoint = New Point
EndPoint.X = X2
EndPoint.Y = Y2
EndPoint.Z = Z2
tmpline.FromPoint = StartPoint
tmpline.ToPoint = EndPoint
pElement.Geometry = tmpline
drawline = pElement
End
整个q程关键是要?span lang="EN-US">element的属性改?span lang="EN-US">drapeQ这L出来的线是贴着地球表面的,而不会穿q地心,
在把囑ֱ改ؓDrapeӞ加上_附高度讄可以将ȝU升高,而不被背景图覆盖掉。把代码修改一下,如下Q?span lang="EN-US">
pGEP.DrapeElement = True '属性改?span lang="EN-US">drape
pGEP.DrapeZOffset=1000000 '加上q一句,后面的DC高度,单位是米
在各U?/span>GIS/GPS应用中,地图旋{是不可或~的一部分Q尤其明昄是用在实时导航,对象跟踪{应用方面。用来计地图旋转时偏{角的坐标Ҏ(gu)动态和静态两U之分。动态在q里指的是在已知当前点的情况下,下一点的具体位置是不定的;而静态指的是下一点的具体位置是确定的。动态的应用我们常见到的?/span>GPSD、游戏中的赛?/span>(多赛道、可转弯{?/span>)以及调度{中的实时地图旋转,而静态更常见的是作ؓ一U功能的演示Q如模拟DQ模拟赛车等。地图旋转只有在同一坐标pMq行才有意义Q地图旋转角度的计算才有依据Q本文主要着重点在于如何由前后两点计地图旋转角度,同时主要考虑动态的方式Q静态方式的旋{地图原理是一LQ就不分开介绍了?/span>
二、约定和术语
² 参考坐标系Q本文所依据的坐标系为北?/span>54下的依据高斯克吕格投影所建立的坐标系Q即高斯q面坐标p,它的囑փ如图Q?/span>
X代表为正北方向,Y代表正东方向Qؓ了y值都为正Q将U坐标u西移500km?/span>
² 正切函数是直角三角Ş中,对边与邻边的比倹{放在直角坐标系中(如图Q即 tanθ=y/x
其中tanθ的定义域为(-∏/2Q?∏/2Q,值域?/span>(-∞,+∞)
² 偏{角:U定偏{角ؓ北偏东的角度Q将地图按照偏{角进行旋转后始l朝着q动方向行驶。在高斯q面坐标pMQ正北即?/span>X_正东即ؓY_所?/span>tanθq是?/span>y/xQ只是角度的位置有了变化Q如图所C?br />
² 反正?/span>Q函?/span>y=tanx的反函数叫做反正切函?/span>,记做:y=arctanx.
定义?/span>:RQ值域:(-π/2,π/2)
三、计偏转角
假设存在一起始?/span>pntBeginQƈ且存在一个原点ؓpntBegin的^面坐标系Q同时约定要旋{的角度ؓrotateAngle,则下一?/span>pntDestҎ(gu)方位有几U情况,其示意图如下Q我们可以分c进行讨论:
l ?/span>pntDest.x1>=pntBegin.x0,则该点在W一和第四象限,具体对应点ؓpntDest(1)?/span>pntDest(4),分别对应的北偏东角度?/span>α(1)?#945;Q?Q,Ҏ(gu)Y值的不同Q我们又可以分两U情况,
n 若pntDest.y>=pntBegin.y://在第一象限
rotateAngle=arctan2(fabs(p0.x-p1.x),fabs(p0.y-p1.y));
n 若pntDest.y<pntBegin.y://在第四象?br />
rotateAngle=arctan2(fabs(p0.x-p1.x),fabs(p0.y-p1.y));
rotateAngle=∏-rotateAngle;
l ?/span>pntDest.x1<pntBegin.x0,则该点在W二和第三象限,具体对应点ؓpntDest(2)?/span>pntDest(3),分别对应的北偏东角度?/span>α(2)?#945;Q?Q,Ҏ(gu)Y值的不同Q分两种情况q行讨论Q?/span>
n 若pntDest.y>=pntBegin.y://在第二象?br />
rotateAngle=arctan2(fabs(p0.x-p1.x),fabs(p0.y-p1.y));
rotateAngle= 2*∏-rotateAngle;
n 若pntDest.y<pntBegin.y://在第三象?br />
rotateAngle=arctan2(fabs(p0.x-p1.x),fabs(p0.y-p1.y));
rotateAngle=∏+rotateAngle;
四、在图q_中实?/span>
?/span>Q开发语a?/span>VC6,q_?/span>eSuperMap;
代码如下Q?br />
/// <summary>
/// 创徏动画轨迹
/// </summary>
public void CreateAnimationTrack( string trackName )
{
IAnimationTrack pAnimationTrack = new AnimationTrackClass();
IAnimationType pAnimationType = new AnimationTypeCameraClass();
pAnimationTrack.AnimationType = pAnimationType;
pAnimationTrack.Name = trackName;
pAnimationTrack.AttachObject( pSceneGraph.ActiveViewer.Camera );
pAnimationTrack.ApplyToAllViewers = true;
pAnimationTrack.EvenTimeStamps = false;
pAnimationTracks.AddTrack( pAnimationTrack );
}
/// <summary>
/// 删除动画轨迹
/// </summary>
public void RemoveAnimationTrack( string trackName )
{
IAnimationTrack pAnimationTrack;
pAnimationTracks.FindTrack( trackName, out pAnimationTrack );
pAnimationTracks.RemoveTrack( pAnimationTrack );
}
/// <summary>
/// 播放当前动画轨迹
/// </summary>
public void PlayAnimationTrack( string trackName )
{
Hashtable htKeyTime = null;
bool[] TracksEnable = new Boolean[pAnimationTracks.TrackCount];
IAnimationTrack pAnimationTrack;
for( int index = 0; index < pAnimationTracks.TrackCount; index++ )
{
pAnimationTrack = pAnimationTracks.Tracks.get_Element( index ) as IAnimationTrack;
TracksEnable[index] = pAnimationTrack.IsEnabled;
if( pAnimationTrack.Name == trackName )
{
pAnimationTrack.IsEnabled = true;
htKeyTime = ClsAnimationTracks.GetKeyTimeTable( pAnimationTrack.Name );
}
else
pAnimationTrack.IsEnabled = false;
}
int sumTime = 0;
foreach( object obj in htKeyTime.Values )
{
sumTime += Convert.ToInt32( obj );
}
double duration = (double)sumTime / 1000;
TimeSpan timeSpan;
double elapsedTime;
DateTime startTime = DateTime.Now;
int j = 0;
do
{
timeSpan = (DateTime.Now).Subtract(startTime);
elapsedTime = timeSpan.TotalSeconds;
if (elapsedTime > duration) elapsedTime = duration;
pAnimationTracks.ApplyTracks(pSceneGraph.ActiveViewer, elapsedTime, duration);
pSceneGraph.RefreshViewers();
j = j + 1;
}
for( int index = 0; index < pAnimationTracks.TrackCount; index++ )
{
pAnimationTrack = pAnimationTracks.Tracks.get_Element( index ) as IAnimationTrack;
pAnimationTrack.IsEnabled = TracksEnable[index];
}
}
是不是很?/strong>呢?C?img src="http://img.baidu.com/hi/face/i_f15.gif" alt="" />Q在播放轨迹的时候,有个旉的处理方法,具体在程序调试时Q多试几ơ就知道是怎么回事了,我就不多说了。。?/font>
当然Q还有动d的处理方法,ArcGIS也提供了一个很方便的接口IKeyframe来实现的Q再通过动画轨迹接口IAnimationTrack来实现动d的创建,删除{功能,代码实现如下Q?/p>
/// <summary>
/// 创徏动画?br />
/// </summary>
public void CreateKeyFrame( IAnimationTrack pAnimationTrack, string keyName, int timeSpan )
{
IKeyframe pKeyframe = new Bookmark3DClass();
pKeyframe.Name = keyName;
pKeyframe.CaptureProperties( pScene, pSceneGraph.ActiveViewer.Camera );
pAnimationTrack.InsertKeyframe( pKeyframe, pAnimationTrack.KeyframeCount );
Hashtable htKeyTime = ClsAnimationTracks.GetKeyTimeTable( pAnimationTrack.Name );
int sumTime = 0;
foreach( object obj in htKeyTime.Values )
{
sumTime += Convert.ToInt32( obj );
}
double dblTime = 0;
for( int index = 0; index < pAnimationTrack.KeyframeCount; index++ )
{
pKeyframe = pAnimationTrack.get_Keyframe( index );
dblTime += Convert.ToDouble( htKeyTime[pKeyframe.Name] ) / sumTime;
pKeyframe.TimeStamp = dblTime;
}
}
/// <summary>
/// 删除动画?br />
/// </summary>
public void RemoveKeyFrame( IAnimationTrack pAnimationTrack, string keyName )
{
for( int index = 0; index < pAnimationTrack.KeyframeCount; index++ )
{
if( pAnimationTrack.get_Keyframe( index ).Name == keyName )
{
pAnimationTrack.RemoveKeyframe( index );
break;
}
}
}
/// <summary>
/// 删除当前轨迹的所有
/// </summary>
public void RemoveAllKeyFrame( IAnimationTrack pAnimationTrack )
{
pAnimationTrack.RemoveAllKeyframes();
}
All rights reserved under the copyright laws of the United States.
You may freely redistribute and use this sample code, with or without modification.
Disclaimer: THE SAMPLE CODE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ESRI OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) SUSTAINED BY YOU OR A THIRD PARTY, HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ARISING IN ANY
WAY OUT OF THE USE OF THIS SAMPLE CODE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
For additional information contact: Environmental Systems Research Institute, Inc.
Attn: Contracts Dept.
380 New York Street
Redlands, California, U.S.A. 92373
Email: contracts@esri.com
*/
using System;
using System.Windows.Forms;
using ESRI.ArcGIS.Analyst3D;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.GlobeCore;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.SystemUI;
namespace GlobeNavigation
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private ESRI.ArcGIS.GlobeControl.AxGlobeControl axGlobeControl1;
internal System.Windows.Forms.TrackBar TrackBar1;
public System.Windows.Forms.CheckBox chkSpin;
public System.Windows.Forms.RadioButton optTools1;
public System.Windows.Forms.RadioButton optTools0;
public System.Windows.Forms.Button cmdLoadDocument;
public System.Windows.Forms.Button cmdZoomOut;
public System.Windows.Forms.Button cmdZoomIn;
public System.Windows.Forms.Button cmdFullExtent;
public System.Windows.Forms.Label Label1;
public System.Windows.Forms.Label lblNavigate;
public System.Windows.Forms.Label lblZoom;
public System.Windows.Forms.Label lblLoad;
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private IAoInitialize m_AoInitialize = new AoInitializeClass();
private ISceneViewer m_ActiveView;
private ICamera m_Camera;
private IPoint m_pMousePos = new PointClass();
private bool m_bMouseDown;
private bool m_bZooming = false;
private double m_dSpinSpeed = 0;
private double m_dZoom;
const double cMinZoom = 1.00002;
const double cMaxZoom = 1.1;
const double cDistanceZoomLimit = 200.0;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
this.axGlobeControl1 = new ESRI.ArcGIS.GlobeControl.AxGlobeControl();
this.TrackBar1 = new System.Windows.Forms.TrackBar();
this.chkSpin = new System.Windows.Forms.CheckBox();
this.optTools1 = new System.Windows.Forms.RadioButton();
this.optTools0 = new System.Windows.Forms.RadioButton();
this.cmdLoadDocument = new System.Windows.Forms.Button();
this.cmdZoomOut = new System.Windows.Forms.Button();
this.cmdZoomIn = new System.Windows.Forms.Button();
this.cmdFullExtent = new System.Windows.Forms.Button();
this.Label1 = new System.Windows.Forms.Label();
this.lblNavigate = new System.Windows.Forms.Label();
this.lblZoom = new System.Windows.Forms.Label();
this.lblLoad = new System.Windows.Forms.Label();
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
((System.ComponentModel.ISupportInitialize)(this.axGlobeControl1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.TrackBar1)).BeginInit();
this.SuspendLayout();
//
// axGlobeControl1
//
this.axGlobeControl1.Location = new System.Drawing.Point(10, 9);
this.axGlobeControl1.Name = "axGlobeControl1";
this.axGlobeControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axGlobeControl1.OcxState")));
this.axGlobeControl1.Size = new System.Drawing.Size(508, 499);
this.axGlobeControl1.TabIndex = 0;
this.axGlobeControl1.OnMouseDown += new ESRI.ArcGIS.GlobeControl.IGlobeControlEvents_OnMouseDownEventHandler(this.axGlobeControl1_OnMouseDown);
this.axGlobeControl1.OnMouseMove += new ESRI.ArcGIS.GlobeControl.IGlobeControlEvents_OnMouseMoveEventHandler(this.axGlobeControl1_OnMouseMove);
this.axGlobeControl1.OnMouseUp += new ESRI.ArcGIS.GlobeControl.IGlobeControlEvents_OnMouseUpEventHandler(this.axGlobeControl1_OnMouseUp);
//
// TrackBar1
//
this.TrackBar1.Location = new System.Drawing.Point(528, 465);
this.TrackBar1.Name = "TrackBar1";
this.TrackBar1.Size = new System.Drawing.Size(125, 45);
this.TrackBar1.TabIndex = 26;
this.TrackBar1.Scroll += new System.EventHandler(this.TrackBar1_Scroll);
//
// chkSpin
//
this.chkSpin.BackColor = System.Drawing.SystemColors.Control;
this.chkSpin.Cursor = System.Windows.Forms.Cursors.Default;
this.chkSpin.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.chkSpin.ForeColor = System.Drawing.SystemColors.ControlText;
this.chkSpin.Location = new System.Drawing.Point(547, 439);
this.chkSpin.Name = "chkSpin";
this.chkSpin.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.chkSpin.Size = new System.Drawing.Size(69, 19);
this.chkSpin.TabIndex = 25;
this.chkSpin.Text = "Spin";
this.chkSpin.Click += new System.EventHandler(this.chkSpin_Click);
this.chkSpin.CheckedChanged += new System.EventHandler(this.chkSpin_CheckedChanged);
//
// optTools1
//
this.optTools1.Appearance = System.Windows.Forms.Appearance.Button;
this.optTools1.BackColor = System.Drawing.SystemColors.Control;
this.optTools1.Cursor = System.Windows.Forms.Cursors.Default;
this.optTools1.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.optTools1.ForeColor = System.Drawing.SystemColors.ControlText;
this.optTools1.Location = new System.Drawing.Point(538, 353);
this.optTools1.Name = "optTools1";
this.optTools1.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.optTools1.Size = new System.Drawing.Size(97, 27);
this.optTools1.TabIndex = 20;
this.optTools1.TabStop = true;
this.optTools1.Text = "Zoom In/Out";
this.optTools1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.optTools1.Click += new System.EventHandler(this.MixedControls_Click);
//
// optTools0
//
this.optTools0.Appearance = System.Windows.Forms.Appearance.Button;
this.optTools0.BackColor = System.Drawing.SystemColors.Control;
this.optTools0.Cursor = System.Windows.Forms.Cursors.Default;
this.optTools0.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.optTools0.ForeColor = System.Drawing.SystemColors.ControlText;
this.optTools0.Location = new System.Drawing.Point(538, 310);
this.optTools0.Name = "optTools0";
this.optTools0.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.optTools0.Size = new System.Drawing.Size(97, 27);
this.optTools0.TabIndex = 19;
this.optTools0.TabStop = true;
this.optTools0.Text = "Navigate";
this.optTools0.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.optTools0.Click += new System.EventHandler(this.MixedControls_Click);
this.optTools0.CheckedChanged += new System.EventHandler(this.optTools0_CheckedChanged);
//
// cmdLoadDocument
//
this.cmdLoadDocument.BackColor = System.Drawing.SystemColors.Control;
this.cmdLoadDocument.Cursor = System.Windows.Forms.Cursors.Default;
this.cmdLoadDocument.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.cmdLoadDocument.ForeColor = System.Drawing.SystemColors.ControlText;
this.cmdLoadDocument.Location = new System.Drawing.Point(547, 52);
this.cmdLoadDocument.Name = "cmdLoadDocument";
this.cmdLoadDocument.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.cmdLoadDocument.Size = new System.Drawing.Size(81, 27);
this.cmdLoadDocument.TabIndex = 18;
this.cmdLoadDocument.Text = "Load ...";
this.cmdLoadDocument.Click += new System.EventHandler(this.cmdLoadDocument_Click);
//
// cmdZoomOut
//
this.cmdZoomOut.BackColor = System.Drawing.SystemColors.Control;
this.cmdZoomOut.Cursor = System.Windows.Forms.Cursors.Default;
this.cmdZoomOut.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.cmdZoomOut.ForeColor = System.Drawing.SystemColors.ControlText;
this.cmdZoomOut.Location = new System.Drawing.Point(528, 181);
this.cmdZoomOut.Name = "cmdZoomOut";
this.cmdZoomOut.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.cmdZoomOut.Size = new System.Drawing.Size(119, 27);
this.cmdZoomOut.TabIndex = 17;
this.cmdZoomOut.Text = "Fixed Zoom Out";
this.cmdZoomOut.Click += new System.EventHandler(this.cmdZoomOut_Click);
//
// cmdZoomIn
//
this.cmdZoomIn.BackColor = System.Drawing.SystemColors.Control;
this.cmdZoomIn.Cursor = System.Windows.Forms.Cursors.Default;
this.cmdZoomIn.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.cmdZoomIn.ForeColor = System.Drawing.SystemColors.ControlText;
this.cmdZoomIn.Location = new System.Drawing.Point(528, 146);
this.cmdZoomIn.Name = "cmdZoomIn";
this.cmdZoomIn.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.cmdZoomIn.Size = new System.Drawing.Size(119, 27);
this.cmdZoomIn.TabIndex = 16;
this.cmdZoomIn.Text = "Fixed Zoom In";
this.cmdZoomIn.Click += new System.EventHandler(this.cmdZoomIn_Click);
//
// cmdFullExtent
//
this.cmdFullExtent.BackColor = System.Drawing.SystemColors.Control;
this.cmdFullExtent.Cursor = System.Windows.Forms.Cursors.Default;
this.cmdFullExtent.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.cmdFullExtent.ForeColor = System.Drawing.SystemColors.ControlText;
this.cmdFullExtent.Location = new System.Drawing.Point(528, 215);
this.cmdFullExtent.Name = "cmdFullExtent";
this.cmdFullExtent.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.cmdFullExtent.Size = new System.Drawing.Size(119, 27);
this.cmdFullExtent.TabIndex = 15;
this.cmdFullExtent.Text = "Full Extent";
this.cmdFullExtent.Click += new System.EventHandler(this.cmdFullExtent_Click);
//
// Label1
//
this.Label1.BackColor = System.Drawing.SystemColors.Control;
this.Label1.Cursor = System.Windows.Forms.Cursors.Default;
this.Label1.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.Label1.ForeColor = System.Drawing.SystemColors.Highlight;
this.Label1.Location = new System.Drawing.Point(528, 388);
this.Label1.Name = "Label1";
this.Label1.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.Label1.Size = new System.Drawing.Size(116, 52);
this.Label1.TabIndex = 24;
this.Label1.Text = "Control the spin speed with the slider.";
//
// lblNavigate
//
this.lblNavigate.BackColor = System.Drawing.SystemColors.Control;
this.lblNavigate.Cursor = System.Windows.Forms.Cursors.Default;
this.lblNavigate.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.lblNavigate.ForeColor = System.Drawing.SystemColors.Highlight;
this.lblNavigate.Location = new System.Drawing.Point(528, 250);
this.lblNavigate.Name = "lblNavigate";
this.lblNavigate.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.lblNavigate.Size = new System.Drawing.Size(126, 53);
this.lblNavigate.TabIndex = 23;
this.lblNavigate.Text = "Use the option buttons to select a navigation tool. ";
//
// lblZoom
//
this.lblZoom.BackColor = System.Drawing.SystemColors.Control;
this.lblZoom.Cursor = System.Windows.Forms.Cursors.Default;
this.lblZoom.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.lblZoom.ForeColor = System.Drawing.SystemColors.Highlight;
this.lblZoom.Location = new System.Drawing.Point(528, 86);
this.lblZoom.Name = "lblZoom";
this.lblZoom.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.lblZoom.Size = new System.Drawing.Size(125, 53);
this.lblZoom.TabIndex = 22;
this.lblZoom.Text = "Use the buttons to naviagte the Globe data.";
//
// lblLoad
//
this.lblLoad.BackColor = System.Drawing.SystemColors.Control;
this.lblLoad.Cursor = System.Windows.Forms.Cursors.Default;
this.lblLoad.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.lblLoad.ForeColor = System.Drawing.SystemColors.Highlight;
this.lblLoad.Location = new System.Drawing.Point(528, 9);
this.lblLoad.Name = "lblLoad";
this.lblLoad.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.lblLoad.Size = new System.Drawing.Size(116, 35);
this.lblLoad.TabIndex = 21;
this.lblLoad.Text = "Browse to a 3dd file to load.";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(662, 514);
this.Controls.Add(this.TrackBar1);
this.Controls.Add(this.chkSpin);
this.Controls.Add(this.optTools1);
this.Controls.Add(this.optTools0);
this.Controls.Add(this.cmdLoadDocument);
this.Controls.Add(this.cmdZoomOut);
this.Controls.Add(this.cmdZoomIn);
this.Controls.Add(this.cmdFullExtent);
this.Controls.Add(this.Label1);
this.Controls.Add(this.lblNavigate);
this.Controls.Add(this.lblZoom);
this.Controls.Add(this.lblLoad);
this.Controls.Add(this.axGlobeControl1);
this.Name = "Form1";
this.Text = "Form1";
this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing);
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.axGlobeControl1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.TrackBar1)).EndInit();
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void Form1_Load(object sender, System.EventArgs e)
{
//Create a new AoInitialize object
if (m_AoInitialize == null)
{
//System.Windows.Forms.MessageBox.Show("Unable to initialize. This application cannot run!");
this.Close();
}
//Determine if the product and 3D extension are available
esriLicenseStatus licenseStatus = (esriLicenseStatus) m_AoInitialize.IsProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngine);
if (licenseStatus == esriLicenseStatus.esriLicenseAvailable)
{
licenseStatus = (esriLicenseStatus) m_AoInitialize.IsExtensionCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngine, esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst);
if (licenseStatus == esriLicenseStatus.esriLicenseAvailable)
{
licenseStatus = (esriLicenseStatus) m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
if (licenseStatus != esriLicenseStatus.esriLicenseCheckedOut)
{
//System.Windows.Forms.MessageBox.Show("The initialization failed. This application cannot run!");
this.Close();
}
else
{
licenseStatus = (esriLicenseStatus) m_AoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst);
if (licenseStatus != esriLicenseStatus.esriLicenseCheckedOut)
{
System.Windows.Forms.MessageBox.Show("Unable to check out the 3D Analyst extension. This application cannot run!");
this.Close();
}
}
}
}
else
{
System.Windows.Forms.MessageBox.Show("The ArcGIS Engine product is unavailable. This application cannot run!");
this.Close();
}
//Initialize member variables
m_ActiveView = axGlobeControl1.GlobeDisplay.ActiveViewer;
m_Camera = m_ActiveView.Camera;
}
private void cmdLoadDocument_Click(object sender, System.EventArgs e)
{
//Open a file dialog for selecting map documents
openFileDialog1.Title = "Globe Documents";
openFileDialog1.DefaultExt = ".3dd";
openFileDialog1.Filter = "Globe Document(*.3dd)|*.3dd";
openFileDialog1.ShowDialog();
//Check a file is selected and that it's a valid Globe document
//before attempting to load it
if (openFileDialog1.FileName != "")
{
if (axGlobeControl1.Check3dFile(openFileDialog1.FileName) == true)
{
axGlobeControl1.Load3dFile(openFileDialog1.FileName);
}
else
{
MessageBox.Show("Cannot load " + openFileDialog1.FileName);
}
}
}
private void cmdFullExtent_Click(object sender, System.EventArgs e)
{
IGlobeCamera camera = (IGlobeCamera) m_Camera;
//Make sure that the camera is using global coordinates
camera.OrientationMode = esriGlobeCameraOrientationMode.esriGlobeCameraOrientationGlobal;
//Point the camera at 0,0 in lat,long - this is the default target
IPoint target = new PointClass();
target.PutCoords(0.0,0.0);
target.Z = 0.0;
m_Camera.Target = target;
//Reset the camera to its default values
m_Camera.Azimuth = 140;
m_Camera.Inclination = 45;
m_Camera.ViewingDistance = 4.0;
m_Camera.ViewFieldAngle = 30.0;
m_Camera.RollAngle = 0.0;
m_Camera.RecalcUp();
m_ActiveView.Redraw(false);
}
private void cmdZoomIn_Click(object sender, System.EventArgs e)
{
//Reset the camera field of view angle to 0.9 of its previous value
double vfa = m_Camera.ViewFieldAngle;
m_Camera.ViewFieldAngle = vfa * 0.9;
m_ActiveView.Redraw(false);
}
private void cmdZoomOut_Click(object sender, System.EventArgs e)
{
//Reset the camera field of view angle to 1.1 times its previous value
double vfa = m_Camera.ViewFieldAngle;
m_Camera.ViewFieldAngle = vfa * 1.1;
m_ActiveView.Redraw(false);
}
private void CalculateMoveFactors(double dist)
{
bool bIsAtCenter;
int indexGlobe;
//See if the camera is pointing at the center of the globe.
IGlobeViewer globeViewer = (IGlobeViewer) m_ActiveView;
globeViewer.GetIsTargetAtCenter(out bIsAtCenter, out indexGlobe);
//If the camera is pointing at the center of the globe then the zoom speed
//depends on how far away it is, otherwise the zoom factor is fixed. As the
//camera approaches the globe surface (where dist = 1) the zoom speed slows
//down. The other factors were worked out by trial and error.
if (bIsAtCenter == true)
{
m_dZoom = cMinZoom + (cMaxZoom - cMinZoom) * (dist - 1.0 / 3.0);
}
else
{
m_dZoom = 1.1;
}
}
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
//Release COM objects, check in extension and shutdown
ESRI.ArcGIS.Utility.COMSupport.AOUninitialize.Shutdown();
m_AoInitialize.CheckInExtension(esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst);
m_AoInitialize.Shutdown();
}
private void axGlobeControl1_OnMouseDown(object sender, ESRI.ArcGIS.GlobeControl.IGlobeControlEvents_OnMouseDownEvent e)
{
//Mouse down should initiate a zoom only if the Zoom check box is checked
if (m_bZooming == false)
{
return;
}
if (e.button == 1)
{
m_bMouseDown = true;
m_pMousePos.X = e.x;
m_pMousePos.Y = e.y;
}
}
private void axGlobeControl1_OnMouseUp(object sender, ESRI.ArcGIS.GlobeControl.IGlobeControlEvents_OnMouseUpEvent e)
{
//Cancel the zoom operation
m_bMouseDown = false;
//Navigate can cancel spin - make sure it starts again
if (m_dSpinSpeed > 0)
{
axGlobeControl1.GlobeViewer.StartSpinning(esriGlobeSpinDirection.esriCounterClockwise);
}
}
private void axGlobeControl1_OnMouseMove(object sender, ESRI.ArcGIS.GlobeControl.IGlobeControlEvents_OnMouseMoveEvent e)
{
if (m_bMouseDown == false)
{
return;
}
//If we're in a zoom operation then
//Get the difference in mouse position between this and the last one
double dx = e.x - m_pMousePos.X;
double dy = e.y - m_pMousePos.Y;
if ((dx == 0) & (dy == 0))
{
return;
}
//Work out how far the observer is currently from the globe and use this
//distance to determine how far to move
IPoint observer = m_Camera.Observer;
double zObs;
double xObs;
double yObs;
double dist;
observer.QueryCoords(out xObs, out yObs);
zObs = observer.Z;
dist = System.Math.Sqrt(xObs * xObs + yObs * yObs + zObs * zObs);
CalculateMoveFactors(dist);
//Zoom out and in as the mouse moves up and down the screen respectively
if ((dy < 0) & (dist < cDistanceZoomLimit))
{
m_Camera.Zoom(m_dZoom);
}
else if (dy > 0)
{
m_Camera.Zoom((1 / m_dZoom));
}
m_pMousePos.X = e.x;
m_pMousePos.Y = e.y;
m_ActiveView.Redraw(false);
}
private void chkSpin_Click(object sender, System.EventArgs e)
{
if (chkSpin.CheckState == CheckState.Checked)
{
axGlobeControl1.GlobeViewer.StartSpinning(esriGlobeSpinDirection.esriCounterClockwise);
axGlobeControl1.GlobeViewer.SpinSpeed = 3;
TrackBar1.Enabled = true;
m_dSpinSpeed = 3;
}
else
{
axGlobeControl1.GlobeViewer.StopSpinning();
TrackBar1.Enabled = false;
m_dSpinSpeed = 0;
}
}
private void TrackBar1_Scroll(object sender, System.EventArgs e)
{
//The globe should increase its spin speed with every increment greater than
//5 and decrease it for every increment less.
int sliderPos = (TrackBar1.Value - 5);
if (sliderPos == 0)
{
m_dSpinSpeed = 3;
}
else if (sliderPos > 0)
{
m_dSpinSpeed = 3 * (sliderPos + 1);
}
else
{
m_dSpinSpeed = 3 / (1 - sliderPos);
}
axGlobeControl1.GlobeViewer.SpinSpeed = m_dSpinSpeed;
}
private void MixedControls_Click(object sender, System.EventArgs e)
{
RadioButton b = (RadioButton) sender;
//Set current tool
switch (b.Name)
{
case "optTools0":
m_bZooming = false;
axGlobeControl1.Navigate = true;
axGlobeControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
break;
case "optTools1":
m_bZooming = true;
axGlobeControl1.Navigate = false;
axGlobeControl1.MousePointer = esriControlsMousePointer.esriPointerZoom;
break;
}
}
private void optTools0_CheckedChanged(object sender, System.EventArgs e)
{
}
private void chkSpin_CheckedChanged(object sender, System.EventArgs e)
{
}
}
}
在javaConnector中如何在同个囑ֱ中缓冲ƈ选择要素。在同一囑ֱ中选择出缓冲分析结果需要额外的步骤才能完成Q但是当选择囑ֱ和做~冲的不是同一层时Q则不需要额外的步骤。一个典型的查询例子是这LQ在San Jose市周?公里内有多少城市Q?
q程描述
步骤Q?br />
额外的步骤如下,需要创Z个新的层来用作buffer层。在filter选择中,如果buffer层和选择目标层是同一层时Q将D错误l果产生?br />
1.创徏一个连接ƈ初始化一个Map对象。在Map.initMap()中LaodRecordset属性必设|ؓtrue?br />
map.initMap(connection,0,false,false,true,false);
2.创徏buffer层的引用?br />
FeatureLayer fLayer = (FeatureLayer)map.getLayers().item(5); //buffer layer
3.创徏一个buffer层的复制层来作ؓ选择的目标层。该新的复制层和原来的图层具有相同的LayerID,MaxScale,MinScale, 和Recordset
FeatureLayer tLayer = new FeatureLayer(fLayer.getID(),fLayer.getMaxScale(),fLayer.getMinScale());
tLayer.setRecordset(fLayer.getRecordset()); //tLayer is the target layer
4.创徏FiltercdBuffer对象Qƈ讄他们的属性应用到buffer层上?字串9
Filter filter = new Filter();
filter.setWhereExpression("NAME='San Jose'");
Buffer buffer=new Buffer();
buffer.setBufferUnits(Buffer.MILES);
buffer.setBufferDistance(8);
buffer.setPerformBuffer(true);
buffer.setBufferRegionSymbol(ps);
buffer.setBufferSelectionSymbol(ms);
buffer.setBufferTargetLayer(tLayer);
filter.setBufferObject(buffer);
fLayer.setFilterObject(filter);
5.查询l果被保存在一个名UCؓ'bufferLayer'的层中?br />
FeatureLayer resultLayer=null;
Recordset recordset = null;
for (int i=0;i<map.getLayers().getCount();i++){
if (map.getLayers().item(i).getName().equalsIgnoreCase("bufferLayer")){
resultLayer = (FeatureLayer)map.getLayers().item(i);
break;
}
}
<a:task id="mapToolsTask" value="#{mapToolsTask}" taskInfo="#{mapToolsTask.taskInfo}" mapId="map1" windowingSupport="false" style="padding:0px;margin:0px;"
xslFile="maptoolstask.xsl"/>
我们发现Q它q不是由a:toolbar和a:tool定义的,而是一个封装好的mapToolsTask对象?br /> 通过查看faces-config.xml,我们看到mapToolsTask的定义如下:
<managed-bean>
<managed-bean-name>mapToolsTask</managed-bean-name>
<managed-bean-class>com.esri.adf.web.tasks.MapToolsTask</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>webContext</property-name>
<value>#{mapContext}</value>
</managed-property>
</managed-bean>
事实上,mapToolsTask是在ArcGIS Server Java ADF 中已l封装好的com.esri.adf.web.tasks.MapToolsTask的一个实例?br /> cM于自定义Task的过E中实现TaskInfo的方法,我们可以也可以通过个mapToolsTask实现一个TaskInfo来达到定制的目的。倍感方便的是Q在ArcGIS Server Java ADF 也同样封装好了一?br /> com.esri.adf.web.tasks.MapToolsTaskInfo的类Q我们只需l承q个cd修改其中的配|即可,举个最单的例子Q?br /> 1.新徏一个类MyToolsTaskInfoQ承自com.esri.adf.web.tasks.MapToolsTaskInfoQ?/p>
package com.jerry.ags;
import com.esri.adf.web.tasks.MapToolsTaskInfo;
import com.esri.adf.web.tasks.MapToolsTaskConfig;
public class MyToolsTaskInfo extends MapToolsTaskInfo{
public MyToolsTaskInfo(){
MapToolsTaskConfig tc=new MapToolsTaskConfig();
tc.setTools("IDENTIFY,ZOOMIN,ZOOMOUT,");
super.setTaskConfig(tc);
}
}
在这个简单的例子中只包含一个构造函敎ͼ在构造函C我们首先创徏一个import com.esri.adf.web.tasks.MapToolsTaskConfig的实例,q调用它的setToolsҎ(gu)Q意为在工具条中只包
?IDENTIFY,ZOOMIN,ZOOMOUT"三个工具。最后通过调用基类的setTaskConfigҎ(gu)这个com.esri.adf.web.tasks.MapToolsTaskConfig实例生效?br />
2.在face-config.xml文g中添加如下配|:
<managed-bean>
<managed-bean-name>myToolsTaskInfo</managed-bean-name>
<managed-bean-class>com.jerry.ags.MyToolsTaskInfo</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
3.修改mapviewer.jsp文gW?7行工h的定义中taskInfo属性的?/p>
<a:task id="mapToolsTask" value="#{mapToolsTask}" taskInfo="#{myToolsTaskInfo}" mapId="map1" windowingSupport="false" style="padding:0px;margin0px;"
xslFile="maptoolstask.xsl"/>
4.重新部vq启动应用,我们看到工具条中只出现三个工具Q依ơ是IDENTIFY-ZOOMIN-ZOOMOUT
补充
1.怿定制模版应用的工hq有更ؓ灉|的方法,比如直接自定义Tool,CommandQƈ通过a:toolbar,a:tool,a:command{标{֮义来替代a:task。可以参考与q部分内容相关的资料?/p>
2.MapToolsTaskInfol承自com.esri.adf.web.data.tasks.SimpleTaskInfoQ因而可以通过实现TaskInfo接口中定义的getActionDescriptors()QgetToolDescriptors(){方法进行更复杂的定制?br /> 比如Q我们希望修改点L询ؓ拉框查询Q可以修改MyToolsTaskInfo 的实现程序如下:
package com.jerry.ags;
import com.esri.adf.web.tasks.MapToolsTaskInfo;
import com.esri.adf.web.tasks.MapToolsTaskConfig;
import com.esri.adf.web.data.tasks.TaskToolDescriptorModel;
import com.esri.adf.web.data.tasks.TaskToolDescriptor;
import com.esri.adf.web.faces.event.ClientActions;
import com.esri.adf.web.tasks.MapToolsTask;
public class MyToolsTaskInfo extends MapToolsTaskInfo{
private TaskToolDescriptor[] taskTools=new TaskToolDescriptor[3];
public MyToolsTaskInfo(){
MapToolsTaskConfig tc=new MapToolsTaskConfig();
tc.setTools("IDENTIFY,ZOOMIN,ZOOMOUT,");
super.setTaskConfig(tc);
taskTools[0]=new TaskToolDescriptor(MapToolsTask.class,"identify","拉框查询",ClientActions.MAP_RECTANGLE);
taskTools[0].setRendererType(TaskToolDescriptor.IMAGE_RENDERER_TYPE);
taskTools[0].setDefaultImage("http://jerry:8000/gs/images/tasks/maptools/identify.png");
taskTools[0].setSelectedImage("http://jerry:8000/gs/images/tasks/maptools/identifyD.png");
taskTools[0].setHoverImage("http://jerry:8000/gs/images/tasks/maptools/identifyU.png");
taskTools[1]=new TaskToolDescriptor(MapToolsTask.class,"zoomIn","攑֤",ClientActions.MAP_RECTANGLE);
taskTools[1].setRendererType(TaskToolDescriptor.IMAGE_RENDERER_TYPE);
taskTools[1].setDefaultImage("http://jerry:8000/gs/images/tasks/maptools/zoomin.png");
taskTools[1].setSelectedImage("http://jerry:8000/gs/images/tasks/maptools/zoominD.png");
taskTools[1].setHoverImage("http://jerry:8000/gs/images/tasks/maptools/zoominU.png");
taskTools[2]=new TaskToolDescriptor(MapToolsTask.class,"zoomOut","~小",ClientActions.MAP_RECTANGLE);
taskTools[2].setRendererType(TaskToolDescriptor.IMAGE_RENDERER_TYPE);
taskTools[2].setDefaultImage("http://jerry:8000/gs/images/tasks/maptools/zoomout.png");
taskTools[2].setSelectedImage("http://jerry:8000/gs/images/tasks/maptools/zoomoutD.png");
taskTools[2].setHoverImage("http://jerry:8000/gs/images/tasks/maptools/zoomoutU.png");
}
public TaskToolDescriptorModel[] getToolDescriptors(){
return taskTools;
}
}
注意其中的taskTools[0]=new TaskToolDescriptor(MapToolsTask.class,"identify","拉框查询",ClientActions.MAP_RECTANGLE);
开发环境:Eclipse3.2
开发步骤:
一?nbsp;AdministratorArcIMS
二?nbsp;Eclipse ArcGIS Web Project
三?nbsp;Java FeatureQuery queryFeaturesInRectangle
package com.wudefu;
import com.esri.adf.web.data.WebContext;
import com.esri.adf.web.data.geometry.WebExtent;
import com.esri.adf.web.data.geometry.WebPoint;
import com.esri.adf.web.data.*;
import com.esri.adf.web.faces.event.MapEvent;
import com.esri.adf.web.aims.data.AIMSMapResource;
import com.esri.adf.web.aims.data.AIMSMapFunctionality;
import com.esri.adf.web.aims.data.AIMSTocFunctionality;
import com.esri.adf.web.aims.data.query.AIMSQueryFunctionality;
import com.esri.aims.mtier.model.envelope.Envelope;
import com.esri.aims.mtier.model.map.layer.FeatureLayer;
import com.esri.aims.mtier.model.map.layer.query.Buffer;
import com.esri.aims.mtier.model.map.layer.query.Filter;
import com.esri.aims.mtier.model.map.layer.query.Recordset;
import com.esri.aims.mtier.model.map.layer.renderer.symbol.SimpleMarkerSymbol;
import com.esri.aims.mtier.model.map.layer.renderer.symbol.SimplePolygonSymbol;
import com.esri.aims.mtier.model.map.*;
import com.esri.aims.mtier.model.map.Map;
import java.util.*;
public class FeatureQuery {
private WebContext context;
//
public void queryFeaturesInRectangle(MapEvent event){
//调用JAVA ADF里面的WebControl获取地图
AIMSMapFunctionality imsMapFun=(AIMSMapFunctionality)aimsMap.getFunctionality( Map
//
FeatureLayer fLayer=(FeatureLayer)imsMap.getLayers().item(5);
//
WebMap webMap=context.getWebMap();
WebExtent chosenExent = (WebExtent) event.getWebGeometry().toMapGeometry(webMap);
// Java Connector
Envelope env=new Envelope();
env.setMaxX(chosenExent.getMaxX());
env.setMaxY(chosenExent.getMaxY());
env.setMinX(chosenExent.getMinX());
env.setMinY(chosenExent.getMinY());
//
SimpleMarkerSymbol sms = new SimpleMarkerSymbol();
sms.setColor("0,0,255");
sms.setMarkerType(sms.STAR);
sms.setWidth(20);
Filter filter=new Filter();
filter.setSpatialShape(env);
filter.setGlobalEnvelope(true);
fLayer.setFilterObject(filter);
//filterupdate Recordset
webMap.update(context, null);
//Java Connector
int a=fLayer.getRecordset().getCount();
//int b=fLayer.getFeatureCount();
System.out.println(a);
String fieldNames[]=new String[fLayer.getRecordset().getTableDesc().getCount()];
String fieldValues[]=new String[fLayer.getRecordset().getTableDesc().getCount()];
for(int i=0;i<fLayer.getRecordset().getCount();i++){
for (int k=0; k<fLayer.getRecordset().getTableDesc().getCount(); k++) {
fieldNames[k]= fLayer.getRecordset().getTableDesc().getFieldName(k);
fieldValues[k]=fLayer.getRecordset().getRecords(i).getFieldValue(k);
System.out.println(fieldNames[k]);
System.out.println(fieldValues[k]);
}
}
imsMap.displayFeatures(fLayer,true,sms);
webMap.update(context, null);
//imsMap.refresh()
imsMap.reset();
}
}
四?nbsp; 五?nbsp;mapviewer.jsp
toolTip="
<span style="font-family: 宋体;" Times